Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/03/2009, à 14: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:

Capture-ebr-stage1.2009311229.png

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, à 14:21)


Halte au sketch! Réveillons-nous!
http://cluaran.free.fr/dette.html

Hors ligne

#2 Le 23/11/2012, à 00: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