#1 Le 02/03/2009, à 13:09
- guga
[Tuto] Adresse physique sur le disque d'un fichier en ext
Bonjour,
j'écris ce post suite à une question que je me suis récemment posée: comment connaitre l'adresse absolue d'un fichier, ou plutôt l'adresse absolue du début du fichier, sur un système de fichiers de type ext?
Par adresse absolue, j'entends une adresse exprimée en secteurs sur le disque dur physique.
Dans la suite de ce post, je prends comme exemple un cas concret d'utilisation impliquant GRUB, mais il va de soit que la méthode est générale.
Je me suis posé cette question suite à la lecture d'une excellente page sur GRUB : http://mirror.href.com/thestarman/asm/mbr/GRUB.htm. En effet, il est indiqué sur cette page que le stage1 de GRUB (celui qui est recopié dans le MBR par l'utilisation de la commande grub-install, ou bien dans un EBR ou un BS par l'utilisation plus fine et recommandée du shell GRUB cf. http://www.gnu.org/software/grub/ma … 02dinstall) et dont le rôle n'est autre que de charger le stage2 (ou 1.5 si celui-ci est utilisé), intègre directement dans sa routine l'adresse absolue de ce stage2 sur le disque.
Autrement dit, les commandes grub-install ou setup du shell grub, recopient la routine du stage1 qui se trouve généralement dans le répertoire /boot/grub vers le lieu spécifié (MBR, EBR ou BS...) en mettant notamment à jour dans cette routine le champ correspondant à l'adresse absolue du stage2 sur le disque, celuicprésent dans le répertoire /boot/grub. C'est ce dernier point que j'ai justement voulu vérifier.
Dans mon cas, où j'ai recopié le stage1 de GRUB sur le 1er EBR de mon disque (cf. mon post sur le sujet http://forum.ubuntu-fr.org/viewtopic.php?id=295515), voici la tête de mon EBR:
Conformément à http://mirror.href.com/thestarman/asm/mbr/GRUB.htm, j'ai mis en évidence ce qui doit correspondre à l'adresse absolue (en secteurs) du stage2 sur mon disque à savoir 9A 6F B0 A3 (octets à lire à l'envers) ce qui donne 61 894 554 en décimal.
Pour vérifier qu'à cette adresse figure effectivement le code du stage2, je fais donc un:
guga@guga-laptop:~$ sudo dd if=/dev/sda of=stage2-1s.bin bs=512 count=1 skip=61894554
[sudo] password for guga:
1+0 enregistrements lus
1+0 enregistrements écrits
512 octets (512 B) copiés, 0,0277637 s, 18,4 kB/s
guga@guga-laptop:~$ sudo hd -v -n 512 stage2-1s.bin
00000000 52 56 be 03 81 e8 28 01 5e bf f8 81 66 8b 2d 83 |RV....(.^...f.-.|
00000010 7d 04 00 0f 84 ca 00 80 7c ff 00 74 3e 66 8b 1d |}.......|..t>f..|
00000020 66 31 c0 b0 7f 39 45 04 7f 03 8b 45 04 29 45 04 |f1...9E....E.)E.|
00000030 66 01 05 c7 04 10 00 89 44 02 66 89 5c 08 c7 44 |f.......D.f.\..D|
00000040 06 00 70 50 66 31 c0 89 44 04 66 89 44 0c b4 42 |..pPf1..D.f.D..B|
00000050 cd 13 0f 82 9f 00 bb 00 70 eb 56 66 8b 05 66 31 |........p.Vf..f1|
00000060 d2 66 f7 34 88 54 0a 66 31 d2 66 f7 74 04 88 54 |.f.4.T.f1.f.t..T|
00000070 0b 89 44 0c 3b 44 08 7d 74 8b 04 2a 44 0a 39 45 |..D.;D.}t..*D.9E|
00000080 04 7f 03 8b 45 04 29 45 04 66 01 05 8a 54 0d c0 |....E.)E.f...T..|
00000090 e2 06 8a 4c 0a fe c1 08 d1 8a 6c 0c 5a 52 8a 74 |...L......l.ZR.t|
000000a0 0b 50 bb 00 70 8e c3 31 db b4 02 cd 13 72 46 8c |.P..p..1.....rF.|
000000b0 c3 8e 45 06 58 c1 e0 05 01 45 06 60 1e c1 e0 04 |..E.X....E.`....|
000000c0 89 c1 31 ff 31 f6 8e db fc f3 a4 1f be 12 81 e8 |..1.1...........|
000000d0 5e 00 61 83 7d 04 00 0f 85 3c ff 83 ef 08 e9 2e |^.a.}....<......|
000000e0 ff be 14 81 e8 49 00 5a ea 00 82 00 00 be 17 81 |.....I.Z........|
000000f0 e8 3d 00 eb 06 be 1c 81 e8 35 00 be 21 81 e8 2f |.=.......5..!../|
00000100 00 eb fe 4c 6f 61 64 69 6e 67 20 73 74 61 67 65 |...Loading stage|
00000110 32 00 2e 00 0d 0a 00 47 65 6f 6d 00 52 65 61 64 |2......Geom.Read|
00000120 00 20 45 72 72 6f 72 00 bb 01 00 b4 0e cd 10 46 |. Error........F|
00000130 8a 04 3c 00 75 f2 c3 00 00 00 00 00 00 00 00 00 |..<.u...........|
00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001f0 02 70 b0 03 8e 00 00 14 9b 6f b0 03 5f 00 20 08 |.p.......o.._. .|
Ce qui me prouve, par la présence du texte "Loading stage2", qu'il y a effectivement à cette adresse le début d'un fichier stage2.
On peut d'ailleurs vérifier que le début du fichier stage2 de mon répertoire /boot/grub a la même signature:
guga@guga-laptop:~$ sudo hd -v -n 512 /boot/grub/stage2
00000000 52 56 be 03 81 e8 28 01 5e bf f8 81 66 8b 2d 83 |RV....(.^...f.-.|
00000010 7d 04 00 0f 84 ca 00 80 7c ff 00 74 3e 66 8b 1d |}.......|..t>f..|
00000020 66 31 c0 b0 7f 39 45 04 7f 03 8b 45 04 29 45 04 |f1...9E....E.)E.|
00000030 66 01 05 c7 04 10 00 89 44 02 66 89 5c 08 c7 44 |f.......D.f.\..D|
00000040 06 00 70 50 66 31 c0 89 44 04 66 89 44 0c b4 42 |..pPf1..D.f.D..B|
00000050 cd 13 0f 82 9f 00 bb 00 70 eb 56 66 8b 05 66 31 |........p.Vf..f1|
00000060 d2 66 f7 34 88 54 0a 66 31 d2 66 f7 74 04 88 54 |.f.4.T.f1.f.t..T|
00000070 0b 89 44 0c 3b 44 08 7d 74 8b 04 2a 44 0a 39 45 |..D.;D.}t..*D.9E|
00000080 04 7f 03 8b 45 04 29 45 04 66 01 05 8a 54 0d c0 |....E.)E.f...T..|
00000090 e2 06 8a 4c 0a fe c1 08 d1 8a 6c 0c 5a 52 8a 74 |...L......l.ZR.t|
000000a0 0b 50 bb 00 70 8e c3 31 db b4 02 cd 13 72 46 8c |.P..p..1.....rF.|
000000b0 c3 8e 45 06 58 c1 e0 05 01 45 06 60 1e c1 e0 04 |..E.X....E.`....|
000000c0 89 c1 31 ff 31 f6 8e db fc f3 a4 1f be 12 81 e8 |..1.1...........|
000000d0 5e 00 61 83 7d 04 00 0f 85 3c ff 83 ef 08 e9 2e |^.a.}....<......|
000000e0 ff be 14 81 e8 49 00 5a ea 00 82 00 00 be 17 81 |.....I.Z........|
000000f0 e8 3d 00 eb 06 be 1c 81 e8 35 00 be 21 81 e8 2f |.=.......5..!../|
00000100 00 eb fe 4c 6f 61 64 69 6e 67 20 73 74 61 67 65 |...Loading stage|
00000110 32 00 2e 00 0d 0a 00 47 65 6f 6d 00 52 65 61 64 |2......Geom.Read|
00000120 00 20 45 72 72 6f 72 00 bb 01 00 b4 0e cd 10 46 |. Error........F|
00000130 8a 04 3c 00 75 f2 c3 00 00 00 00 00 00 00 00 00 |..<.u...........|
00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001f0 02 70 b0 03 8e 00 00 14 9b 6f b0 03 5f 00 20 08 |.p.......o.._. .|
La question cruciale qui se pose alors est: comment savoir si le fichier stage2 au secteur 61894554 est bien celui de mon répertoire /boot/grub ?
Pour cela, il me faut trouver l'adresse absolue de mon fichier stage2 situé dans /boot/grub.
Or, dans un système de fichiers de type ext (comme ext3 par exemple, ce qui est mon cas), les fichiers (mais aussi les répertoires, etc.) sont identifiés de façon unique par leur inode (cf. sur le web pour savoir plus précisément de quoi il s'agit). Pour connaître l'inode associé à un fichier, on peut avoir recourt à l'option -i de ls, ce qui dans mon cas donne:
guga@guga-laptop:~$ ls -i /boot/grub/
891199 default 892188 menu.lst 891205 reiserfs_stage1_5
891210 device.map 892172 messages.blue 891206 stage1
891201 e2fs_stage1_5 892177 messages.green 891207 stage2
891202 fat_stage1_5 892179 messages.orange 891208 xfs_stage1_5
891212 gfx_splashscreen 892180 messages.red
891203 jfs_stage1_5 891204 minix_stage1_5
Mon stage2 est donc associé à l'inode 891207. C'est cet inode qui, dans la table d'allocation des fichiers propre au système de fichiers ext, est associé à une adresse sur le disque, adresse qu'il nous reste à découvrir. En fait, l'adresse telle que donnée dans la table d'allocation des fichiers est relative dans le sens où elle est donnée depuis l'adresse de début de la partition. De plus, cette adresse est désignée en blocks et non en secteurs.
Pour remonter à l'adresse absolue du fichier désigné par l'inode en question il nous faut donc répondre aux questions suivantes:
1: comment aller lire les informations dans la table d'allocations des fichiers correspondant à l'inode 891207 ?
2: comment passe-t-on d'une adresse en blocks à une adresse en secteurs ?
3: comment passe-t-on d'une adresse relative (donnée à partir du début de la partition) à une adresse absolue (donnée à partir du début du disque dur)?
1: la solution s'appelle debugfs. debugfs permet, comme son nom l'indique, de réparer un système de fichiers de type ext.
guga@guga-laptop:~$ sudo debugfs
[sudo] password for guga:
debugfs 1.41.3 (12-Oct-2008)
debugfs: open /dev/sda5 # ouvre le système de fichiers de type ext3 associé à la partition sda5
debugfs: stat <891207> # donne les informations de la table d'allocation des fichiers du système de fichier ouvert (ici sda5 en ext3) associés à l'inode 891207
Inode: 891207 Type: regular Mode: 0755 Flags: 0x0
Generation: 4071516278 Version: 0x00000000
User: 0 Group: 0 Size: 121460
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 248
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x49a7e9c9 -- Fri Feb 27 14:25:29 2009
atime: 0x49a7e9c9 -- Fri Feb 27 14:25:29 2009
mtime: 0x49a7e9c9 -- Fri Feb 27 14:25:29 2009
Size of extra inode fields: 4
BLOCKS:
(0-11):3586017-3586028, (IND):3586029, (12-29):3586030-3586047 # voici les blocks d'adresse du fichier associé à l'inode 891207
TOTAL: 31
On sait donc maintenant que le fichier stage2 du répertoire /boot/grub associé à l'inode 891207 commence au block 3586017 de la partition sda5.
2: Pour connaitre la correspondance entre blocks et secteurs, toujours sous debugfs avec le système de fichier ouvert, il faut faire appel à la commande stats qui donne dans mon cas les informations suivantes (je n'ai mis ici que le début du retour de la commande, mais beaucoup d'autres informations sont fournies):
debugfs: stats
Filesystem volume name: UBUNTU
Last mounted on: <not available>
Filesystem UUID: 3ab8e0a2-1756-471e-b52d-939d7757fa32
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)i
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
Filesystem flags: signed_directory_hash
Default mount options: (none)
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 915712
Block count: 3662812
Reserved block count: 183140
Free blocks: 2514248
Free inodes: 751880
First block: 0
Block size: 4096 # c'est cette ligne qui nous intéresse: elle précise qu'un block fait 4096 octets soit 8 secteurs de 512 octets
Fragment size: 4096
Reserved GDT blocks: 894
Blocks per group: 32768
Fragments per group: 32768
:q # interrompt la suite de l'affichage
debugfs: close_filesys # referme le système de fichier actuellement ouvert
debugfs: quit # quitte debugfs
Nous savons donc maintenant que le fichier stage2 du répertoire /boot/grub associé à l'inode 891207 commence au block 3586017 de la partition sda5, ce qui correspond au 8x3586017=28688136 ième secteur sur la partition sda5.
3: Pour remonter à l'adresse absolue en secteur sur disque dur physique sda, il suffit d'utiliser parted de la façon classique suivante:
guga@guga-laptop:~$ sudo parted
GNU Parted 1.8.9
Utilisation de /dev/sda
Bienvenu dans GNU Parted ! Tapez "help" pour voir la liste des commandes.
(parted) unit s print
Modèle: ATA FUJITSU MHV2100A (scsi)
Disque /dev/sda : 195371568s
Taille des secteurs (logique/physique) : 512o/512o
Table de partitions : msdos
Numéro Début Fin Taille Type Système de fichiers Fanions
1 63s 3903794s 3903732s primary fat32 caché
2 3903795s 33206354s 29302560s primary ntfs
3 33206355s 195366464s 162160110s extended démarrage, lba
5 33206418s 62508914s 29302497s logical ext3
6 62508978s 195366464s 132857487s logical ntfs
(parted) quit
qui nous indique que sda5 commence au secteur 33206418.
Donc en absolu, le fichier stage2 du répertoire /boot/grub commence au secteur 33206418+28688136=61894554.
On retrouve bien la valeur initialement contenue dans le stage1 de l'EBR (cf debut du post).
Voilà, en espérant que puisse intéresser d'autres personnes.
Cordialement.
Dernière modification par guga (Le 02/03/2009, à 13:21)
Halte au sketch! Réveillons-nous!
http://cluaran.free.fr/dette.html
Hors ligne
#2 Le 22/11/2012, à 23:45
- learnux
Re : [Tuto] Adresse physique sur le disque d'un fichier en ext
Bonjour à tous,
je viens découvrir ce tuto très bien rédigé. Serait-il possible de faire le cheminement inverse, c'est à dire de trouver à quel fichier appartient un ou plusieurs secteurs du disque dur?
Hors ligne