Table des matières
Vous avez utilisé une clé USB pour installer une distribution GNU/Linux ou un Windows puis vous l'avez formaté pour la vider. Mais voila, au démarrage de l'ordinateur, celui-ci tente de démarrer à partir de la clé. Voici quelques méthodes pour empêcher cela. La liste n'est pas exhaustive 😉 .
Sous Windows
J'utilise TestDisk, un bon logiciel sous licence GPL. On le télécharge, on le lance, on refuse la création de journal, on sélectionne sa clé USB sans se gourer, on choisit le type de la table des partitions : Intel, on choisit l'option "Delete" et on valide deux fois avec "y". Ensuite, il faut recréer une nouvelle partition puisque l'ancienne partition n'est plus référencée dans la table des partitions suite à notre manip'. On peut aussi réécrire la table des partitions, justement avec TestDisk, et ainsi retrouver l'accès à l'ancienne partition et à ces données. Je vous laisse chercher ça 😉 .
À noter que l'option "MBR code" n'a aucun effet dans notre cas ce qui est normal car elle n'est pas prévue pour cela. D'autre part,
Sous GNU/Linux
ÉDIT du 11/08/2012 à 19h30 : J'ai modifié cette partie car elle contenait beaucoup d'âneries. Fin de l'édit
Nous allons utiliser la commande dd . Pour obtenir le même résultat qu'avec TestDisk, il faut, tout comme lui, effacer le MBR. Il s'agit du premier secteur du disque, soit les 512 premiers octets. Pour l'effacer :
sudo dd if=/dev/zero of=/dev/sdb bs=512 count=1 |
Explication rapide : on écrit sur un secteur (count), sachant qu'un secteur à une taille de 512 octets (bs) en prenant comme source le pseudo-périphérique /dev/zero qui renvoi toujours le caractère "NULL".
Attention : ce ne sera pas forcement sdb chez vous ! Vérifiez avec la commande mount, sans arguments.
Un peu de théorie : pour savoir si un médium (clé USB, disque dur interne/externe, CD, DVD, etc. ) est amorçable ou pas, le BIOS lit le premier secteur (= les 512 premiers octets) du médium, le MBR donc. Celui-ci contient, dans l'ordre, la routine d'amorçage, la table des partitions primaires et deux octets (Pour une meilleure présentation, voir : Master boot record sur Wikipédia en). Pour être sûr qu'il s'agit bien d'un MBR, le BIOS vérifie que les deux derniers octets (le numéro 510 et le numéro 511, soit le 511e et le 512e, n'oubliez pas que l'on compte à partir de 0 😛 ) contiennent bien le nombre "magique" 0xAA55. Si c'est le cas, il charge la routine d'amorçage présente dans les 446 premiers octets (au maximum) du MBR dans la mémoire (à l'adresse 0x7C00, soit segment 7C0 (1984 😉 ), offset 0) et lui donne la main. Donc, en théorie, si l'on écrase ce nombre magique, ce premier secteur du disque ne sera plus reconnu comme un MBR et le BIOS ne chargera pas la routine d'amorçage. Donc lancer la commande suivante revient au même que la commande précédente :
sudo dd if=/dev/zero of=/dev/sdb seek=510 bs=1 count=2 |
Explication rapide : on écrit sur deux secteurs (count), sachant qu'un secteur à une taille de 1 octet (bs) en partant directement du secteur numéro 510 et en prenant comme source le pseudo-périphérique /dev/zero qui renvoi toujours le caractère "NULL".
Cette méthode invalide la table des partitions. Votre système d'exploitation ne saura plus monter vos partitions.
Si l'on veut être plus précis et conserver la table des partitions et son fonctionnement, il existe au moins 2 méthodes. La première consiste à utiliser parted/gparted pour supprimer le flag "boot" de la partition sur lequel ce drapeau est activé. La deuxième méthode est d'imiter cette fonctionnalité de parted avec dd.
Nous avons vu que le MBR contient la table des partitions c'est-à-dire 64 octets qui décrivent 4 partitions qu'elles soient primaires ou étendues. Nous avons donc 16 octets par partition qui indiquent :
- Un drapeau indiquant si la partition est bootable ou non (un octet).
- L'adresse du premier secteur de la partition en utilisant l'adressage CHS (3 octets).
- Le type de la partition. Voir la liste sur Wikipédia en.
- L'adresse du dernier secteur de la partition en utilisant l'adressage CHS (3 octets).
- L'adresse du premier secteur de la partition en utilisant l'adressage LBA (4 octets).
- Le nombre de secteurs que comportent la partition (4 octets).
Le premier octet indique donc si la partition est bootable (0x80 : bootable, 0x00 : non bootable, autre nombre : non documenté mais souvent considéré comme non bootable). Ce drapeau indique que le File System Boot Sector, c'est-à-dire le premier secteur de la partition (primaire étendue, ...) contient du code ainsi que des informations sur le système de fichier utilisé. Il ne peut y avoir qu'une seule partition marquée comme active dans une table des partitions et donc sur un même médium.
S'il n'y a qu'une partition, le drapeau ne peut se trouver que sur le 447e octet, c'est-à dire, le secteur numéro 446. S'il y a deux partitions, la première ou la deuxième peut avoir ce drapeau. Il se trouve donc soit sur le 447e octet, soit sur le 463e octet (donc numéro 462). En suivant la même logique, on comprend qu'avec 4 partitions, le drapeau peut se trouver au 447e octet, au 463e, au 479e et au 495e.
Pour l'identifier, on utilisera hexdump :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
$ sudo dd if=/dev/sdb bs=512 count=1 of=sortie 1+0 enregistrements lus 1+0 enregistrements écrits 512 octets (512 B) copiés, 0,000203902 s, 2,5 MB/s $ hexdump -vC sortie 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 0e 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 74 05 f6 c2 70 |...........t...p| 00000070 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc |t....y|..1......| 00000080 00 20 fb a0 64 7c 3c ff 74 02 88 c2 52 be 80 7d |. ..d|<.t...R..}| 00000090 e8 17 01 be 05 7c b4 41 bb aa 55 cd 13 5a 52 72 |.....|.A..U..ZRr| 000000a0 3d 81 fb 55 aa 75 37 83 e1 01 74 32 31 c0 89 44 |=..U.u7...t21..D| 000000b0 04 40 88 44 ff 89 44 02 c7 04 10 00 66 8b 1e 5c |.@.D..D.....f..\| 000000c0 7c 66 89 5c 08 66 8b 1e 60 7c 66 89 5c 0c c7 44 ||f.\.f..`|f.\..D| 000000d0 06 00 70 b4 42 cd 13 72 05 bb 00 70 eb 76 b4 08 |..p.B..r...p.v..| 000000e0 cd 13 73 0d f6 c2 80 0f 84 d8 00 be 8b 7d e9 82 |..s..........}..| 000000f0 00 66 0f b6 c6 88 64 ff 40 66 89 44 04 0f b6 d1 |.f....d.@f.D....| 00000100 c1 e2 02 88 e8 88 f4 40 89 44 08 0f b6 c2 c0 e8 |.......@.D......| 00000110 02 66 89 04 66 a1 60 7c 66 09 c0 75 4e 66 a1 5c |.f..f.`|f..uNf.\| 00000120 7c 66 31 d2 66 f7 34 88 d1 31 d2 66 f7 74 04 3b ||f1.f.4..1.f.t.;| 00000130 44 08 7d 37 fe c1 88 c5 30 c0 c1 e8 02 08 c1 88 |D.}7....0.......| 00000140 d0 5a 88 c6 bb 00 70 8e c3 31 db b8 01 02 cd 13 |.Z....p..1......| 00000150 72 1e 8c c3 60 1e b9 00 01 8e db 31 f6 bf 00 80 |r...`......1....| 00000160 8e c6 fc f3 a5 1f 61 ff 26 5a 7c be 86 7d eb 03 |......a.&Z|..}..| 00000170 be 95 7d e8 34 00 be 9a 7d e8 2e 00 cd 18 eb fe |..}.4...}.......| 00000180 47 52 55 42 20 00 47 65 6f 6d 00 48 61 72 64 20 |GRUB .Geom.Hard | 00000190 44 69 73 6b 00 52 65 61 64 00 20 45 72 72 6f 72 |Disk.Read. Error| 000001a0 0d 0a 00 bb 01 00 b4 0e cd 10 ac 3c 00 75 f4 c3 |...........<.u..| 000001b0 00 00 00 00 00 00 00 00 b2 17 01 00 00 00 00 20 |............... | 000001c0 21 00 83 aa 28 82 00 08 00 00 00 00 20 00 80 aa |!...(....... ...| 000001d0 29 82 07 fe ff ff 00 08 20 00 00 00 40 05 00 fe |)....... ...@...| 000001e0 ff ff 05 fe ff ff fe 0f 60 05 02 f8 3f 05 00 fe |........`...?...| 000001f0 ff ff 83 fe ff ff 00 08 a0 0a 00 b8 47 04 55 aa |............G.U.| 00000200 |
On remarque la marque du MBR (0x55AA), codée ici en little-endian. La table des partitions est donc dans les 64 octets qui précédent : des deux derniers octets (00 20) de la 34e ligne jusqu'au 04 précédent la marque). Nous remarquons la présence de 4 partitions :
- 00 20 21 00 83 aa 28 82 00 08 00 00 00 00 20 00 (lignes 34-35)
- 80 aa 29 82 07 fe ff ff 00 08 20 00 00 00 40 05 (lignes 35-36)
- 00 fe ff ff 05 fe ff ff fe 0f 60 05 02 f8 3f 05 (lignes 36-37)
- 00 fe ff ff 83 fe ff ff 00 08 a0 0a 00 b8 47 04 (lignes 37-38)
Détaillons :
- Une partition GNU/Linux (0x83) de 2097152 secteurs (00 00 20 00 => 0x00200000 à cause du little-endian ensuite 0x200000 = 2097152 en décimal).
- Une partition HPFS ou NTFS ou exFAT (0x07) de 88080384 secteurs (00 00 40 05 => 05400000 pour le little-endian puis conversion). Cette partition est bootable (0x80).
- Une partition étendue (0x05) de 88078338 secteurs. Pour en savoir plus, il faudra consulter le début de la partition pour avoir une nouvelle table des partitions nous indiquant la nature exacte de la première partition logique et l'adresse de la prochaine partition logique).
- Une partition GNU/Linux (0x83) de 71809024 secteurs.
Donc, dans notre exemple, le boot flag est sur le 463e octet. Pour l'effacer :
sudo dd if=/dev/zero of=/dev/sdb seek=462 bs=1 count=1 |
On obtiendra donc :
$ hexdump -vC sortie 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 0e 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 74 05 f6 c2 70 |...........t...p| 00000070 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc |t....y|..1......| 00000080 00 20 fb a0 64 7c 3c ff 74 02 88 c2 52 be 80 7d |. ..d|<.t...R..}| 00000090 e8 17 01 be 05 7c b4 41 bb aa 55 cd 13 5a 52 72 |.....|.A..U..ZRr| 000000a0 3d 81 fb 55 aa 75 37 83 e1 01 74 32 31 c0 89 44 |=..U.u7...t21..D| 000000b0 04 40 88 44 ff 89 44 02 c7 04 10 00 66 8b 1e 5c |.@.D..D.....f..\| 000000c0 7c 66 89 5c 08 66 8b 1e 60 7c 66 89 5c 0c c7 44 ||f.\.f..`|f.\..D| 000000d0 06 00 70 b4 42 cd 13 72 05 bb 00 70 eb 76 b4 08 |..p.B..r...p.v..| 000000e0 cd 13 73 0d f6 c2 80 0f 84 d8 00 be 8b 7d e9 82 |..s..........}..| 000000f0 00 66 0f b6 c6 88 64 ff 40 66 89 44 04 0f b6 d1 |.f....d.@f.D....| 00000100 c1 e2 02 88 e8 88 f4 40 89 44 08 0f b6 c2 c0 e8 |.......@.D......| 00000110 02 66 89 04 66 a1 60 7c 66 09 c0 75 4e 66 a1 5c |.f..f.`|f..uNf.\| 00000120 7c 66 31 d2 66 f7 34 88 d1 31 d2 66 f7 74 04 3b ||f1.f.4..1.f.t.;| 00000130 44 08 7d 37 fe c1 88 c5 30 c0 c1 e8 02 08 c1 88 |D.}7....0.......| 00000140 d0 5a 88 c6 bb 00 70 8e c3 31 db b8 01 02 cd 13 |.Z....p..1......| 00000150 72 1e 8c c3 60 1e b9 00 01 8e db 31 f6 bf 00 80 |r...`......1....| 00000160 8e c6 fc f3 a5 1f 61 ff 26 5a 7c be 86 7d eb 03 |......a.&Z|..}..| 00000170 be 95 7d e8 34 00 be 9a 7d e8 2e 00 cd 18 eb fe |..}.4...}.......| 00000180 47 52 55 42 20 00 47 65 6f 6d 00 48 61 72 64 20 |GRUB .Geom.Hard | 00000190 44 69 73 6b 00 52 65 61 64 00 20 45 72 72 6f 72 |Disk.Read. Error| 000001a0 0d 0a 00 bb 01 00 b4 0e cd 10 ac 3c 00 75 f4 c3 |...........<.u..| 000001b0 00 00 00 00 00 00 00 00 b2 17 01 00 00 00 00 20 |............... | 000001c0 21 00 83 aa 28 82 00 08 00 00 00 00 20 00 00 aa |!...(....... ...| 000001d0 29 82 07 fe ff ff 00 08 20 00 00 00 40 05 00 fe |)....... ...@...| 000001e0 ff ff 05 fe ff ff fe 0f 60 05 02 f8 3f 05 00 fe |........`...?...| 000001f0 ff ff 83 fe ff ff 00 08 a0 0a 00 b8 47 04 55 aa |............G.U.| 00000200 |
Normalement, la recherche du boot flag incombe à la routine d'amorçage une fois celle-ci chargée en mémoire par le BIOS. Néanmoins, on remarque des comportements différents selon les PCs : certains, ne voyant pas de boot flag sur un médium repassent la main à ce qui doit être le BIOS afin que ce dernier recherche un nouveau média de boot. Sur d'autres PCs, le fait qu'un médium ne soit pas bootable est bloquant (attention : je parle bien pour deux configurations de BIOS identiques et notamment l'ordre de boot). Pour ces derniers, enlever le boot flag sera inutile. Il faudra configurer le BIOS pour ne pas tenir compte du médium ou retirer le medium le temps du boot.