{{tag> tutoriel ebr}}
----
====== Qu'est ce que le mbr ? ======
Ce tutoriel explique ce qu'est le [[wpfr>Master_boot_record|MBR]] d'un disque ou d'un média amovible, son organisation et à quoi il sert.\\
**Voir [[GPT]] pour les HDD > 2To**
===== Pré-requis =====
* Disposer des [[:sudo|droits d'administration]]
* Connaitre la numération hexadécimale.
* Utiliser la calculatrice gcalctool en mode programmation (pour faire facilement des conversions hexadécimal/décimal)
===== Qu'est ce que le mbr et comment y accéder =====
Le mbr (Master Boot Record) est le premier secteur d'un disque dur, d'une clé usb ou d'un autre média amovible.\\
\\
Sa présence est essentielle pour accéder aux systèmes de fichiers présents et en cas de corruption de ce dernier il sera impossible d'accéder aux données ou, dans une moindre mesure, impossible de redimensionner les partitions.
Compte tenu du risque encouru, son accès ne peut s'effectuer qu'en mode superutilisateur (sudo).
\\
Pour y accéder nous aurons besoin de la fonction [[:dd|dd]]. Cette fonction permet d'accéder directement à un contenu présent sur le disque en s'affranchissant de tout système de fichiers.
Le disque est considéré comme un espace linéaire constitué de blocs de données successifs, appelés secteurs, de 512 octets chacun, et dont la position est repérée son rang dans cet espace, à partir de 0 (adresse du MBR). Cette méthode d'adressage est nommée LBA (Logical block addressing).
La dernière adresse, qui n'est pas forcément utilisable, peut être calculée en divisant la taille du disque en octets par 512 et en retirant 1.
\\
Une des syntaxes pour afficher le mbr est par exemple :
\\
sudo dd if=/dev/sda bs=512 count=1 | hexdump -C
\\
Ce qui signifie en clair :
\\
\\
En tant que superutilisateur (sudo) je demande de faire une copie par blocs (dd) avec comme source (if) le matériel /dev/sda (premier disque dur), que le bloc désiré doit faire 512 octets et que je ne copie qu'un bloc.
\\
La sortie par défaut est ensuite redirigée (pipe | ) dans la moulinette hexdump qui formate les données sous la forme adresse, valeurs hexadécimale de 16 octets consécutifs et caractères ascii correspondants.
Dans le cas où on souhaite afficher le mbr d'un autre disque, d'une clé usb... il conviendra d'adapter le nom du "device" par celui qui va bien (sdb, sdc...)
===== Les différentes parties du mbr =====
\\
Voici par exemple ce que donne le mbr de mon disque dur
\\
00000000 eb 63 90 d0 bc 00 7c 8e c0 8e d8 be 00 7c bf 00 |.c....|......|..|
00000010 06 b9 00 02 fc f3 a4 50 68 1c 06 cb fb b9 04 00 |.......Ph.......|
00000020 bd be 07 80 7e 00 00 7c 0b 0f 85 10 01 83 c5 10 |....~..|........|
00000030 e2 f1 cd 18 88 56 00 55 c6 46 11 05 c6 46 10 00 |.....V.U.F...F..|
00000040 b4 41 bb aa 55 cd 13 5d 72 0f 81 fb 55 aa 75 09 |.A..U..]r...U.u.|
00000050 f7 c1 01 00 74 03 fe 46 10 66 00 80 01 00 00 00 |....t..F.f......|
00000060 00 00 00 00 ff fa 90 90 f6 c2 80 75 02 b2 80 ea |...........u....|
00000070 74 7c 00 00 31 c0 8e d8 8e d0 bc 00 20 fb a0 64 |t|..1....... ..d|
00000080 7c 3c ff 74 02 88 c2 52 bb 17 04 80 27 03 74 06 ||<.t...R....'.t.|
00000090 be 88 7d e8 1c 01 be 05 7c f6 c2 80 74 48 b4 41 |..}.....|...tH.A|
000000a0 bb aa 55 cd 13 5a 52 72 3d 81 fb 55 aa 75 37 83 |..U..ZRr=..U.u7.|
000000b0 e1 01 74 32 31 c0 89 44 04 40 88 44 ff 89 44 02 |..t21..D.@.D..D.|
000000c0 c7 04 10 00 66 8b 1e 5c 7c 66 89 5c 08 66 8b 1e |....f..\|f.\.f..|
000000d0 60 7c 66 89 5c 0c c7 44 06 00 70 b4 42 cd 13 72 |`|f.\..D..p.B..r|
000000e0 05 bb 00 70 eb 76 b4 08 cd 13 73 0d f6 c2 80 0f |...p.v....s.....|
000000f0 84 d0 00 be 93 7d e9 82 00 66 0f b6 c6 88 64 ff |.....}...f....d.|
00000100 40 66 89 44 04 0f b6 d1 c1 e2 02 88 e8 88 f4 40 |@f.D...........@|
00000110 89 44 08 0f b6 c2 c0 e8 02 66 89 04 66 a1 60 7c |.D.......f..f.`||
00000120 66 09 c0 75 4e 66 a1 5c 7c 66 31 d2 66 f7 34 88 |f..uNf.\|f1.f.4.|
00000130 d1 31 d2 66 f7 74 04 3b 44 08 7d 37 fe c1 88 c5 |.1.f.t.;D.}7....|
00000140 30 c0 c1 e8 02 08 c1 88 d0 5a 88 c6 bb 00 70 8e |0........Z....p.|
00000150 c3 31 db b8 01 02 cd 13 72 1e 8c c3 60 1e b9 00 |.1......r...`...|
00000160 01 8e db 31 f6 bf 00 80 8e c6 fc f3 a5 1f 61 ff |...1..........a.|
00000170 26 5a 7c be 8e 7d eb 03 be 9d 7d e8 34 00 be a2 |&Z|..}....}.4...|
00000180 7d e8 2e 00 cd 18 eb fe 47 52 55 42 20 00 47 65 |}.......GRUB .Ge|
00000190 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52 65 61 |om.Hard Disk.Rea|
000001a0 64 00 20 45 72 72 6f 72 0d 0a 00 bb 01 00 b4 0e |d. Error........|
000001b0 cd 10 ac 3c 00 75 f4 c3 5d 52 5d 52 00 00 80 01 |...<.u..]R]R....|
000001c0 01 00 07 fe ff ff 3f 00 00 00 d6 24 c2 03 00 00 |......?....$....|
000001d0 c1 ff 07 fe ff ff 15 25 c2 03 86 8c e8 04 00 fe |.......%........|
000001e0 ff ff 83 fe ff ff 9b b1 aa 08 78 b1 d4 01 00 fe |..........x.....|
000001f0 ff ff 05 fe ff ff 50 63 7f 0a 71 27 22 08 55 aa |......Pc..q'".U.|
00000200
1+0 enregistrements lus
1+0 enregistrements écrits
512 octets (512 B) copiés, 0,00119184 s, 430 kB/s
\\
Au milieu de tout ce charabia :-( on distingue quelques messages - en fait des messages d'erreurs - qui pourraient être affichés en cas de détection de problèmes.
\\
On remarque que nous sommes dans la situation où l'amorceur Grub est dans le mbr (chaine faisant référence à grub)
Les adresses sont exprimées en hexadécimal et vont de 00000000 à 000001ff (0 à 511) et augmentent de 1 à chaque fois que l'on se déplace vers la droite. L'octet du mbr à la position 188 (9ème valeur de la ligne 00000180) a pour valeur hexa 47, ce qui correspond au caractère ascii "G".
\\
==== La partie exécutable ====
\\
La première partie, adresses comprises entre **000 et 1b7**, correspond à la partie exécutable du mbr. Elle est chargée en mémoire vive (ainsi que le reste du mbr) lorsque le PC démarre ("boote") sur ce disque. Elle a pour fonction de vérifier la validité de la table des partitions et de rechercher une partition amorçable du disque.
Voir par ici une analyse détaillée de [[:la_partie_executable_du_mbr|la partie executable du mbr]]
\\
==== L'identifiant de disque ====
\\
Entre **1b8 et 1bb** se trouve l'identifiant du disque, soit les octets **5d 52 5d 52**, que l'on peut avoir par exemple en faisant unsudo fdisk -lu
\\
Identifiant de disque : 0x525d525d
L'ordre des octets est inversé du fait du codage [[wpfr>Endianness|little endian]] (on commence par mettre les octets de "poids faible" avant les octets de "poids fort").
\\
==== La table des partitions primaires ====
\\
La table des partitions du mbr ne concernent que les partitions principales. En cas de présence d'une (unique) partition étendue, cette dernière qui est seulement un contenant à partitions logiques est considérée comme principale.
Cette table commençant à l'adresse **1be** (446) et se terminant en **1fd** (509) contient 64 octets qui correspondent aux quatre entrées de 16 octets des 4 partitions principales - c'est d'ailleurs pour cela que les partitions principales sont limitées à 4 dans les tables de type msdos.
Dans le cas d'un partitionnement de type GPT, le mbr est un mbr protector qui ne contient qu'une unique partition de type ee commençant à la LBA 1.\\
Le code présent dans le mbr n'est pas utilisé en cas de boot en mode UEFI
\\
Cette table des partitions est donc ici (en affichant à partir de l'adresse 1be pour avoir une ligne par partition puis en séparant par groupes d'octets)
\\
000001be 80 01 01 00 07 fe ff ff 3f 00 00 00 d6 24 c2 03
000001ce 00 00 c1 ff 07 fe ff ff 15 25 c2 03 86 8c e8 04
000001de 00 fe ff ff 83 fe ff ff 9b b1 aa 08 78 b1 d4 01
000001ee 00 fe ff ff 05 fe ff ff 50 63 7f 0a 71 27 22 08
\\
La première ligne qui correspond à la première entrée concerne sda1 (qui n'est pas forcément la partition au début du disque).
\\
Elle est marquée comme bootable - l'étoile qui apparait lors d'un fdisk - du fait que le premier octet a la valeur hexa **80**. Si la partition n'est pas marquée comme amorçable alors on aura la valeur **00**.
\\
Le groupe des 3 octets qui suivent est une réminiscence des temps anciens ;-) où le bios ne reconnaissait que le système "tête", "secteur" et "cylindre". Il indique le début de la partition.
\\
La tête est codée sur 8 bits et peut prendre une valeur entre **0 et fe** (entre 0 et 254 en décimal) - ici 1
\\
Le secteur est codé sur 6 bits et peut prendre une valeur entre **1 et 3f** (entre 1 et 63, soit 63 secteurs par piste au maximum) - ici 1
\\
Le cylindre est codé sur 10 bits (les deux bits de "poids fort" sont les bits 6 et 7 de l'octet précédent), soit entre **0 et 3ff** (0 et 1023) - ici 0
\\
\\
L'octet suivant code le [[wpfr>Partition_de_disque_dur|système de fichier de la partition]], ici le **07** signifie ntfs (j'ai un dual boot avec Windows :-?), les autres valeurs couramment rencontrées sont :\\
**05, 0f** : étendue\\
**0b** : fat32\\
**82** : Linux-swap\\
**83** : ext2, ext3, ext4 - en bref appellation Linux\\
\\
Le groupe des 3 octets suivants indique la fin de la partition dans le système "tête, secteur, cylindre" - ici les valeurs sont au maximum car la partition est plus grande que ce qu'autorise cet adressage archaïque.
\\
\\
Nous arrivons au plus intéressant car c'est ici que sont codés le début et la taille des partitions dans le système LBA (Logical block addressing).
Le premier groupe de 4 octets correspond à l'emplacement du début de la partition (en hexadécimal et en [[wpfr>Endianness|little endian]]) et la taille (même format).
\\
Ainsi le groupe **3f 00 00 00** correspond à la valeur hexa 0x0000003f, soit **63** en décimal.
\\
Et pour la taille on a **d6 24 c2 03**, soit la valeur hexa 0x03c224d6, soit **63055062** en décimal.
La taille exprimée est en secteurs, pour connaitre la taille en kio (1 kio=1024 octets soit deux secteurs de 512 octets), il suffit de diviser la valeur par deux.
**Nota** : //Lors d'un sudo fdisk, les tailles exprimées en blocs sont parfois suivies d'un +. Ceci signifie un demi kio, soit un secteur. C'est ce qui apparait lorsque le nombre de secteurs est impair.//
L'espace qui suit la partition est donc donné par :
\\
\\
**//début espace suivant = début partition + taille partition//**
Souvent les partitions principales commencent au début d'un cylindre. Pour une géométrie classique, les pistes font 63 secteurs et le disque possède //au maximum// 255 têtes, ce qui fait une taille de cylindre de 63x255=16065 secteurs.
La première partition échappe à cette règle et commence au début de la deuxième tête du premier cylindre, soit à l'adresse 63 (décimal)
Avec l'arrivée des disques de grande taille et des disques plus performants comme les ssd, cette antique géométrie tend à disparaître et la première partition commence souvent à l'adresse 2048. Les autres partitions commencent également à un multiple de 2048 secteurs assurant un alignement de ces dernières au Mio.
Le système des tables des partitions à base de secteurs de 512 octets, limite la taille des disques à 2 Tio. Pour les disques de plus grande taille il faudra abandonner les tables des partitions msdos au profit des tables gpt.
\\
==== Le nombre magique ====
\\
C'est la "marque" d'un média amorçable, elle est donnée par la présence des deux derniers octets du mbr (aux adresses 1fe et 1ff, soit 510 et 511 en décimal) qui correspond à la valeur **aa55**.
Vous allez dire que ça ne va pas car c'est **55** et **aa** que vous avez. Mais je rappelle que les valeurs numériques sont codées sous la forme little endian et donc l'octet de poids faible **55** est placé avant l'octet de poids fort **aa**. 8-)
\\
===== Exercice pratique =====
\\
A partir du mbr analysé, retrouver le début et la fin des partitions principales :!:
\\
Pour que vous ne travailliez pas en vain, voici le résultat à obtenir, donné par un
\\
sudo fdisk -lu
L'option -lu permet d'afficher les résultats en secteurs au lieu de cylindres (option -l qui est moins précise)
Disque /dev/sda: 160.0 Go, 160041885696 octets
255 têtes, 63 secteurs/piste, 19457 cylindres, total 312581808 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identifiant de disque : 0x525d525d
Périphérique Amorce Début Fin Blocs Id Système
/dev/sda1 * 63 63055124 31527531 7 HPFS/NTFS
/dev/sda2 63055125 145404314 41174595 7 HPFS/NTFS
/dev/sda3 145404315 176120594 15358140 83 Linux
/dev/sda4 176120656 312576704 68228024+ 5 Etendue
/dev/sda5 176120658 180426014 2152678+ 82 Linux swap / Solaris
/dev/sda6 180426078 312576704 66075313+ 83 Linux
\\
===== Problèmes connus=====
\\
Il arrive parfois que la table des partitions soit corrompue pouvant empêcher tout redimensionnement. Ceci peut être la conséquence d'un virus de mbr, de l'utilisation d'un outil pour partitionner inadapté...
\\
Un cas classique est le chevauchement des partitions, on aura par exemple sda1 qui se terminera dans la partition sda2 si ta taille indiquée de sda1 est trop grande.
\\
Ces problèmes peuvent aussi affecter les partitions logiques et générer aussi un blocage.
Il arrive aussi que la taille indiquée d'une partition excède la taille du disque.
Dans ces deux cas, gparted ne saura repartitionner le disque qui apparaitra comme non alloué. Il faudra nécessairement faire une analyse détaillée des partitions pour identifier le problème et adapter le traitement convenable. Par exemple en cas de chevauchement de partition (genre télescopage entre sda1 et sda2) il faudra vérifier que sda2 commence bien à l'emplacement spécifié (en analysant la zone amorce) avant de retailler sda1.
===== Voir aussi =====
\\
* **(fr)** [[wpfr>Master_boot_record|Master boot record sur Wikipédia]]
* **(fr)**[[wpfr>Partition_de_disque_dur|Les partition de disque dur sur Wikipédia]]
* [[https://forum.ubuntu-fr.org/viewtopic.php?id=390336|Forum ubuntu-fr]]
* **(fr)**[[wpfr>Logical_block_addressing|Adressage logique sur Wikipédia]]
----
//Contributeurs principaux : [[:utilisateurs:Nasman]].//