J'étais en train de mettre un serveur distant à la casse en révoquant toutes les clés d'un conteneur chiffré (cryptsetup luksErase <dev>) puis en écrasant la table des partitions au format GPT avec dd quand Johndescs me demande si j'ai supprimé « la table GPT de backup en fin de disque ».
Ha oui, tiens, plusieurs sources web disent qu'il y a une sauvegarde de la table GPT dans les 33 derniers secteurs d'un disque au max, soit 16,5 octets au max ((33 * 512 octets) / 1024).
Pour le fun, je veux constater ça par moi-même.
fdisk -lu me dit : « Disk /dev/sda: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors ».
Regardons les 1000 derniers secteurs. 3907029168 - 1000 = 3907028168.
dd if=/dev/sda skip=3907028167 | hexdump -vC
[…]
00078e00 48 61 68 21 49 64 6f 6e 74 4e 65 65 64 45 46 49 |Hah!IdontNeedEFI|
00078e10 90 ca 57 b3 c7 18 fa 48 97 a9 9e ae 35 69 6c e0 |..W....H....5il.|
00078e20 28 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 |(...............|
00078e30 00 00 00 00 00 00 00 00 62 00 69 00 6f 00 73 00 |........b.i.o.s.|
00078e40 5f 00 67 00 72 00 75 00 62 00 2d 00 73 00 64 00 |_.g.r.u.b.-.s.d.|
00078e50 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |a...............|
00078e60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00078e70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00078e80 af 3d c6 0f 83 84 72 47 8e 79 3d 69 d8 47 7d e4 |.=....rG.y=i.G}.|
00078e90 34 ea 7a 69 e4 99 67 40 b9 df c0 40 3e 12 a8 4c |4.zi..g@...@>..L|
00078ea0 00 10 00 00 00 00 00 00 ff 07 80 3e 00 00 00 00 |...........>....|
00078eb0 00 00 00 00 00 00 00 00 70 00 72 00 69 00 6d 00 |........p.r.i.m.|
00078ec0 61 00 72 00 79 00 00 00 00 00 00 00 00 00 00 00 |a.r.y...........|
00078ed0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00078ee0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00078ef0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00078f00 af 3d c6 0f 83 84 72 47 8e 79 3d 69 d8 47 7d e4 |.=....rG.y=i.G}.|
00078f10 2d 41 c0 3f a0 c1 12 49 bf 5c cf ee 89 d0 6e 77 |-A.?...I.\....nw|
00078f20 00 08 80 3e 00 00 00 00 ff 6f d0 e8 00 00 00 00 |...>.....o......|
00078f30 00 00 00 00 00 00 00 00 70 00 72 00 69 00 6d 00 |........p.r.i.m.|
00078f40 61 00 72 00 79 00 00 00 00 00 00 00 00 00 00 00 |a.r.y...........|
00078f50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00078f60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00078f70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00078f80 6d fd 57 06 ab a4 c4 43 84 e5 09 33 c8 4b 4f 4f |m.W....C...3.KOO|
00078f90 3e d2 b7 22 c5 0e 82 44 80 e4 62 e0 85 fb 59 fc |>.."...D..b...Y.|
00078fa0 00 70 d0 e8 00 00 00 00 ff 67 e0 e8 00 00 00 00 |.p.......g......|
00078fb0 00 00 00 00 00 00 00 00 70 00 72 00 69 00 6d 00 |........p.r.i.m.|
00078fc0 61 00 72 00 79 00 00 00 00 00 00 00 00 00 00 00 |a.r.y...........|
0007ce00 45 46 49 20 50 41 52 54 00 00 01 00 5c 00 00 00 |EFI PART....\...|
0007ce10 29 6e 0e d5 00 00 00 00 af 88 e0 e8 00 00 00 00 |)n..............|
0007ce20 01 00 00 00 00 00 00 00 22 00 00 00 00 00 00 00 |........".......|
0007ce30 8e 88 e0 e8 00 00 00 00 d0 d2 1f c2 dc 91 bb 4f |...............O|
0007ce40 9f e7 c8 a4 04 7b 91 bc 8f 88 e0 e8 00 00 00 00 |.....{..........|
0007ce50 80 00 00 00 80 00 00 00 90 23 af 95 00 00 00 00 |.........#......|
Utilisons Wikipedia pour déchiffrer ça.
L'entête secondaire est sur le dernier secteur du disque. On la reconnaît grâce à sa signature, « 45 46 49 20 50 41 52 54 » (« EFI PART » en ASCII ).
Ensuite, on a la table des partitions. Habituellement, une entrée de la table occupe 128 octets soit 8 lignes de hexdump. On y voit quatre partitions (la distinction primaire / logique n'existe plus) :
La première depuis l'entête (et donc la dernière sur le disque) est une partition swap de Linux. Je le sais grâce à l'identifiant unique de son type : « 6d fd 57 06 ab a4 c4 43 84 e5 09 33 c8 4b 4f 4f ». Attention, comme l'explique la note de Wikipedia, une partie des octets est inversée à cause du little-endian.
fdisk le dit) donc la taille de la partition est : 1046527 * 512 = 535821824 octets soit 512 Mo environ ;La deuxième partition (depuis la fin, toujours) est une partoche Linux. On la reconnaît grâce à son type : « af 3d c6 0f 83 84 72 47 8e 79 3d 69 d8 47 7d e4 ». Son nom est identique à la première. Elle occupe 1,3 To environ ;
Idem pour la troisième partition. Elle occupe environ 500 Go ;
La dernière partition (et donc la première sur le disque) est une partition de boot BIOS (qui permet d'utiliser GPT sans EFI, en gros). Là encore, on la reconnaît grâce à son type : « 48 61 68 21 49 64 6f 6e 74 4e 65 65 64 45 46 49 », qui, interprété en ASCII nous donne « Hah!IdontNeedEFI ». Son nom est « b.i.o.s._.g.r.u.b.-.s.d.a ». Elle occupe environ 1 Mo.
Aucune de ces partitions n'a un quelconque attribut (drapeau). Ils sont situés dans les 8 octets qui précédent le nom de la partition.
Un drapeau = 1 bit. Une partition cachée = bit 62 = 63e bit. Pas de montage auto = bit 63 = 64e bit.
Les logiciels n'ont pas l'air d'accord sur le rôle de chaque bit de drapeau. sgdisk considère que le 1er bit (bit 0) signifie partition système là où parted considère qu'il signifie partition cachée. Inversement, gparted ne reconnaît pas ce que sgdisk considère être une partition cachée (63e bit). Les deux outils sont d'accord sur le 3e bit (amorçable par d'anciens BIOS). gparted reconnaît aucun des autres drapeaux.
Sur ce coup, gparted est mal fichu, notamment parce qu'il présente comme drapeau ce qui n'en est pas, comme « bios_grub » (qui désigne une partition de boot BIOS, qui est un type de partition).
Évidemment, y'a encore cette histoire de little-endian, donc (binaire avec xxd, hexa avec hexdump, format gdisk, format sgdisk, sens pour parted) :
Du coup, j'ai également effacé cette table GPT secondaire avec dd if=/dev/urandom seek=3907028167 of=/dev/sda.
Ça me rappelle l'un de mes articles vieux de 13 ans dans lequel je décortique un MBR. :D