Retour

Les descripteurs de partitions



Article rédigé par tellmewhy

Les descripteurs de partitions sont les données nécessaires au système d'expoitation pour définir les partitions. Ces données se trouvent dans le MBR,  juste après les 446 octets dédiés au bootloader. Elles sont donc comprises entre l'octet 446 et l'octet 510, les deux derniers octets étant occupés par les Magic Number

Ces données ne concernent que les partitions primaires et la partition étendue. Les données des partitions logiques ne sont pas stockées dans le MBR, mais dans l'EBR.

Voici ma table de partitions :

Numéro  Début       Fin         Taille      Type      Système de fichiers      Drapeaux
 1      63s               97675199s   97675137s   primaire  ext3                 amorce 
 2      97675200s   625137344s  527462145s  étendue                               
 5      97675263s   253939454s  156264192s  logique   ext3                        
 6      253939518s  273490559s  19551042s   logique   ext3                        
 7      273490623s  293041664s  19551042s   logique   ext3                        
 8      312592833s  333991349s  21398517s   logique   ext3                        
 9      333991413s  341782874s  7791462s     logique   linux-swap

Comme on peut le remarquer, ma partition étendue commence juste après la première partition et occupe tout l'espace restant. Nous ne verrons donc dans les descripteurs du MBR que deux partitions.

Pour visionner le contenu de mon MBR je dispose de la commande :

       :~$ sudo dd bs=512 count=1 if=/dev/sda | od -Ax -tx1z -v

Le tableau suivant vous montrera la partie réservée aux descripteurs :

En marron le descripteur de la première partition primaire.
En bleu le descripteur de la seconde partition primaire.
En magenta le descripteur de la troisième partition primaire.
En vert le descripteur de la quatrième partition primaire.
En rouge le Nombre magique.

mbr1

Nous allons examiner plus attentivement le descripteur de la première partition :

mbr2

Tous les nombres que je mentionne maintenant sont en hexadécimal. J'ai joint en fin de page un court résumé sur la conversion.

En marron le premier nombre indique si le témoin d'amorce est présent ou absent. 80 si il est présent, 0 si il est absent. On peut changer facilement la partition amorçable avec parted et sa commande toggle

En bleu les trois nombres représentent, ou représentaient, (car ceci n'est plus utilisé avec les disques dur actuels) les débuts en chs : cylinder, head, sector dans l'ordre suivant tête, secteur, cylindre.

En rose le nombre correspond au type de partition. 83 pour une partiton linux, 82 pour une swap, etc.

En vert les trois nombres représentaient les fins en chs.

Nous arrivons à la partie intéressante. En turquoise  la suite de quatre octets forme un nombre qui définit le début de la partition en secteurs.
Dans mon cas nous obtenons 0000003f ou 3f soit une valeur en décimal = 63. La première partition d'une table ms-dos, je l'ai déjà évoqué, commence toujours au 63ème secteur.

En magenta le dernier nombre, formé de quatre octets, représente la taille en secteurs de ma partition. On peut comparer la taille de ma première partition dans ma table des partitions avec le résultat de 81 67 d2 05, qui en réalité soit s'inverser et se lire : 05d26781, ce qui en décimal se traduit par 97675137, correspondant au nombre de secteurs. Voir plus bas l'explication de la conversion décimal hexadécimal.

Voilà, le principe est le même pour toutes les autres partitions primaires. Nous savons comment fonctionne la lecture des descripteurs de partitions dans le MBR, mais cela ne concerne que les partitions primaires.

1° EBR :

Nous allons voir qu'il y a des différences dans la lecture des informations avec les partitions logiques, pour commencer, nous allons afficher le premier secteur de la partition étendue.

Nous ne parlerons plus ici de MBR, mais d'EBR. Pour visualiser ce premier secteur de la partition étendue nous allons rajouter l'option skip à la commande que nous avions vu ici. Dans le récapitulatif de ma table de partitions, nous avions vu que la partition étendue commençait au secteur 97675200. Nous allons donc sauter les secteurs qui précèdent pour visualiser les 512 octets de mon EBR.

Voici donc cette commande :

:~$ sudo dd bs=512 skip=97675200 count=1 if=/dev/sda | od -Ax -tx1z -v

Nous commencerons après les 446 premiers octets, puisque seuls les descripteurs nous intéressent :

mbr3

Pour rappel, voir les codes des couleurs.

Une première constatation, il ne figure que 2 partitions. Il faudra analyser les deux descripteurs de manière particulière car il y a des différences.

2° PREMIER DESCRIPTEUR :

Dans ce premier descripteur :

mbr4

La différence la plus importante par rapport à une partition primaire se situe sur l'avant dernier champ en turquoise.
Il devrait y figurer le début en secteurs de ma partition. Si on se reporte à ma table, la partition 5 = 97675263s  

On devrait trouver dans le champ : 05d267ff, mais ce n'est pas le cas. En fait on compte à partir du début de l'EBR, c'est à dire à partir de la partition étendue commençant à 97675200s. Donc 97675263 - 97675200 = 63 secteurs ou en hexadécimal : 3f. Puisqu' on utilise quatre octets pour ce champ cela donne 0000003f (on lit de droite à gauche en hexadécimal). 

À chaque fois, pour le premier descripteur d'un EBR, nous aurons systématiquement comme secteur de départ 0000003f. Comme nous allons le voir dans chaque partition étendue il y a une seule logique et une autre partition étendue. 

3° SECOND DESCRIPTEUR :

mbr5

La valeur magenta 012a5381 ( 81 53 2a 01 ) représente la taille de la partition étendue suivante, c'est à dire la taille de la logique + 63 secteurs. 

Contrairement au premier descripteur, ici, pour la partition logique suivante on comptera à partir du départ de la première partition logique, (elle est la référence pour le calcul du secteur de départ de toutes les partitions logiques suivantes dans le deuxième descripteur) : 

253939518 - 97675263 = 156264255. Ce qui donne en hexadécimal  950673f et dans le champ : 0950673f.

Ici nous devons faire attention au champ concernant le type de partition, que j'ai mis en rouge. La valeur 05 nous indique qu'il s'agit de nouveau d'une partition étendue. Là il faut apporter une nuance : chaque partition étendue contient une partition logique et une autre partition étendue. Oui, mais ici le début de partition qui est donné est bien le début de la prochaine logique : les partition logiques commencent toujours au 63 ème secteur d'un cylindre, tandis que les partitions étendues commencent au tout début de ce cylindre.

Si l'on veut voir l'EBR de la partiton étendue suivante, on le trouvera en début de cylindre de la partition logique. Ce qui implique que la partition logique suivante commence au secteur 253939518, mais la partition étendue, elle, commence à 253939518 - 63 = 253939455s.

On peut vérifier cela avec :

sudo dd bs=512 skip=253939455 count=1 if=/dev/sda | od -Ax -tx1z -v

En résumé pour pouvoir lire la totalité des descripteurs de partitions logiques, nous devrons lire la totalité des EBR, car il y en a autant que de partitions logiques.

Nous devrons enchaîner la lecture de ces multiples EBR du début à la fin, pour découvrir tous les descripteurs. Sur le dernier EBR, les champs pour le second descripteur seront vides.

Des outils de partitionnement tel que parted, fdisk, gparted, qparted font cela de manière beaucoup plus pratique.

4° CONVERSION HEXADÉCIMAL : 

Nous avons tellement l'habitude de compter en décimal, que nous ne prêtons plus attention à la méthode. Nous utilisons en décimal des multiples de dix.

Dans un nombre le dernier chiffre correspond au multiple de 1, puis le nombre suivant au multiple de 10, de 100, etc ...

mbr5

mbr7

Prenons un exemple, pour écrire le nombre 1 829 043, je procède en fait de la manière suivante :

1 unité  de 1 000 000 = 1 000 000
8 unités de   100 000 =    800 000
2 unités de     10 000 =      20 000
9 unités de       1 000 =        9 000
0 unités de          100 =               0
4 unités de            10 =             40
3 unités  de             1 =               3

Le principe restera le même en hexadécimal. Mais en hexadécimal nous sommes en base 16 (hexa = 6, décimal = 10, hexadécimal = 16), et travaillerons donc avec des multiples de 16.

mbr8

mbr9

Convertissons le chiffre 1 000 000 000 : c'est un milliard ou un Giga. Cela représente :
 
  3 unités de 268 435 456 =   805 306 368
11 unités de   16 777 216 =  184 549 376
  9 unités de     1 048 576 =      9 437 184
10 unités de          65 536 =         655 360
12 unités de            4 096 =           49 152
10 unités de               256 =             2 560
  0 unités de                 16 =                    0
  0 unités de                   1 =                    0
total = 1 000 000 000

3 en hex = 3, 11 en hex = b, 9 en hex =9, 10 en hex =a, 12 en hex = c, 10 en hex = a, 0 en hex =0.

Cela nous donne 3b9aca00.

Nous pouvons aussi utiliser la commande : printf "0x%llx\n" + le chiffre à convertir, qui fera la conversion pour nous. Exemple pour le chiffre 1000000000 :

:~$  printf "0x%llx\n" 1000000000
0x3b9aca00

0x3b9aca00 est le résultat de la commande, donc la valeur en hexadécimal.

Ici une petite précision le préfixe 0x nous prévient que nous utilisons un nombre en hexadécimal, on trouve également 0h, ou x, et enfin # dans le même but.

On peut enfin ajouter h à la fin d'un chiffre en hexadécimal, pour le chiffre 200 (512 en décimal) on trouvera donc la notation : 0x200, 0h200, x200, #200, 200h.

Une calculatrice scientifique le fera également. Une telle calculatrice est d'ailleurs disponible sous gnome : gcalctool ou sous kde : kcalc.

Enfin on peut également utiliser les programmes hexedit, ghex2, ou khexedit pour visionner des fichiers en hexadécimal.

Pour en apprendre plus :
info printf
man hexedit
info khexedit

Voir aussi pour un convertisseur en ligne : http://www.statman.info/conversions/hexadecimal.html

Quelques liens : 

http://mirror.href.com/thestarman/asm/hexawhat.html
http://fr.wikipedia.org/wiki/Accueil
http://fr.wikipedia.org/wiki/Portail:Informatique

Écrire un commentaire 


Retour


Valid HTML 4.01 Transitional        Valid CSS!