J'ai récemment eu des soucis avec mes tables de partitions sur mon disque dur. Comme j'ai réussi à élucider mon pb, je me propose de partager ce que j'en ai compris, puisque je n'ai pas trouvé de topic similaire sur le forum
1) Introduction
Le pb que j'ai rencontré est arrivé lorsque j'ai voulu supprimé puis recréer des partitions de mon disque en cours d'utilisation avec fdisk sous Linux.
Pour éviter cela, il est donc conseillé d'éviter de manipuler un disque sur lequel on a démarré un OS : préférer une disquette ou un CDRom de boot.
Bref, fdisk m'a modifié mes partition, mais mal mis à jour la table de partitions, ce qui a fait que celle ci était ensuite mal reconnue sous Partition Magic ou autres logiciels touchant aux partitions. Mais je savais que les données des autres partitions n'avaient pas été touchées, et d'ailleurs, toutes (les autres, pas celles que j'ai supprimé) étaient encore visibles et utilisable sous Windows XP ou Linux. J'ai donc cherché à comprendre comment fonctionnaient les tables de partitions afin de modifier celles ci avec l'outil "PowerQuest Partition Table Editor", disponible ici et aussi fourni avec Partition Magic.
Je vais vous expliquer comment il fonctionne, bien que je viens de découvrir un site qui le fait aussi très bien : http://www.goodells.net/multiboot/ptedit.htm
J'aurais du le chercher avant, cela m'aurait économiser qques heures...
2) Prérequis
Les explications de ce sujet sont destiné à un public averti.
Pour le novice motivé, je conseille la lecture de cet article qui détaille de façon claire la théorie des disques durs, puis ensuite, cette page de JC Bellamy sur la théorie des partitions.
3) Résumé théorique
Globalement, plusieurs systèmes d'adressage existent et doivent rester homogène pour un bon fonctionnement des partitions :
- l'adressage CHS (cylinders, heads, sectors) est le système 'historique', mais limité à 1024 cylindres, 255 heads et 63 secteurs par piste. Cela reste la base et la taille d'une partition en octets est définie par le produit C*H*S*512.
La limite CHS est donc de 1024x255x63x512 = 8422686720 octets, ou plus simplement 8.4 Go (8.4 en base 1000, mais en fait 7.8Go en base 1024 (2^10))
- Les disques durs supérieurs à 8.4Go utilisent donc un adressage logique, le LBA, qui outrepasse cette limite en "émulant" des cylindres supérieurs à 1024. L'adressage LBA s'effectue sur 28bits, et la limite est (2^28*512)/2^30 = 128 Go, autrement dit 16700 cylindres max. La norme ATA133/ATA6 permet d'outrepasser cette nouvelle limite, mais là n'est pas la question (voir ce topic pour + d'info sur les disques > 128Go).
- le système de fichier à l'intérieur d'une partition doit retourner aussi des données de taille cohérentes avec ce qui est inscrit dans les tables de partitions.
Je parle de tables de partitions au pluriel, car il y a en effet plusieurs tables sur un disque : une 1ère table limitée à 4 entrées définie les partitions primaires. Celle ci est écrite sur le MBR et explique la limite de 4 partitions primaires. Parmi ces 4, on fait en général une partition étendue dans laquelle sont définis des lecteurs logiques. Chacun de ces lecteurs logiques définie une nouvelle table des partitions.
La position d'une partition sur le disque est définie par ses coordonnées CHS/LBA, en particulier par le n° de cylindre de début ou de fin. Sachant qques formules, on peut ensuite retrouver les propriétés en secteurs.
Certains logiciels (comme gpart sous linux) permettent se proposent de corriger les tables de partitions. Mais cette correction est surtout possible pour la table du MBR, et moins pour les lecteurs logiques. Partition Magic se propose aussi de corriger une table éronnée en se basant notamment sur le système de fichiers et les tables secondaires.
Or dans mon cas, c'était justement les tables de lecteurs logiques qui étaient éronnées, donc Partition magic a plutot empirée la chose (en me mettant 2 partitions avec le même cylindre de début, bonjour la catastrophe).
Partition Table Editor ('ptedit') permet donc d'éditer et de corriger manuellement les erreurs résultant d'autres logiciels de partitions.
4) Mise en pratique
Je vais prendre comme exemple la table des partitions de mon disque dur. Dans mon PC, j'ai un seul disque de 120Go (114470MB) découpé en 9 partitions/lecteurs pour du tri-boot Win98/WinXP/Linux.
Celui ci utilise donc le LBA avec : 14593 cylinders, 255 heads, 63 sectors per track
a) Partitions primaires
ptedit affiche d'abord la table des partitions primaires :
Partition Table at sector 0 (cyl 0, head 0, sector 1) :
Starting Ending Sectors
Type Boot Cyl Head Sector Cyl Head Sector Before Size
1 0C 80 0 1 1 178 254 63 63 2875572
2 17 0 179 0 1 1023 254 63 2875635 18442620
3 0F 0 1023 0 1 1023 254 63 21318255 213118290
4 0 0 0 0 0 0 0 0 0 0
|
Comment comprendre cette table ?
- (Cyl, head, sector) (0,0,1) -> c'est le Master Boot Record (MBR)
- La colonne "Type" donne le type de partition : FAT, NTFS, ext2, ... dont les indices sont normalisés. Ici, la partition 1 est du FAT32X, la 2nde du "Hidden NTFS" et la 3è la partition étendue. La partition étendue couvre tout le reste du disque et contient des lecteurs logiques.
- la colonne boot définie la partition active : 80 pour l'active, 0 pour les autres. C'est la partition sur laquelle démarrera votre PC.
- Ensuite viennent les coordonnées CHS de début et de fin de partition : on voit que la 1ère commence à (0,1,1) puisque le MBR occupe le 1er secteur (0,0,1) et que le reste (63*512 ~= 32ko) est réservé aux bootmanager type Boot Magic ou System Commander. Les partitions sont définie aussi au cylindre prêt : elle commence à (cyl, 0, 1) ou (cyl,1,1) et finissent à (cyl,254,63). Ici, seule la 2nde partition commence au secteur suivant la fin de la 1ère (179). Les autres garderont ce principe mais en LBA : l'adressage CHS reste au maximum (1024,254,63)
- Les colonnes "sectors before" et "sectors size" sont liée d'une ligne à l'autre et dépendant de l'adressage CHS/LBA
Avec fdisk fourni sous linux, l'affichage des partitions montre le cylindre de début et de fin de chq partition en LBA.
Ceci est + pratique pour calculer les secteurs.
Voici un autre tableau définissant cette même table de partitions à partir des données LBA :
Starting cyl. Ending cyl. Starting sec. Ending sec. Size (sectors) Size (MB)
1 179 63 2875634 2875572 1404
180 1327 2875635 21318254 18442620 9005
1328 14593 21318255 234436544 213118290 104062 |
Les 2 1ères colonnes permettent de calculer les suivantes. Tout d'abord, on remarque qu'en dessous de la limite CHS, les données LBA et CHS sont les mêmes, au cylindre prêt.
La 1ère partition commence au secteur 63. Et fini au secteur 179*255*63*-1 = 2875634. La 2nde partition commence évidemment au secteur suivant et fini au 1327*255*63-1 = 21318254.
Le secteur de début correspond au "sectors before" du 1er tableau.
De manière littérale, sectors before = (starting cyl. - 1)*255*63 (ex : (1328-1)*255*63 = 21318255)
Et ending sector = (ending cyl.)*255*63-1
Ensuite, la taille en secteurs est logiquement la différence entre secteur de début et secteur de fin + 1. Ex : 21318254 - 2875635 + 1 = 18442620.
Globalement, sectors size = (ending cyl. - starting cyl. + 1)*255*63
Enfin, la taille de la partition en octets est la taille en secteurs * 512, soit size(MB)=sector size/2048
Voilà qui vous permettra de comprendre les partitions et le cas échéant de corriger les nombres inscrits dans cette table si fdisk et consort y font des bêtises. Les modifications sont tout de même dangeureuses et ne doivent pas se faire à la légère
b) Lecteurs logiques
Vennons en aux lecteurs logiques. Avec ptedit, la prochaine table s'obtient en cliquant sur 'Goto EPBR'.
Voici ce que cela donne sur mon disque :
Partition Table at sector 21318255 (cyl 1327, head 0, sector 1) :
Starting Ending Sectors
Type Boot Cyl Head Sector Cyl Head Sector Before Size
1 82 0 1023 1 1 1023 254 63 63 1012032
2 5 0 1023 0 1 1023 254 63 1012095 8016435 |
(je vous fait cadeaux des lignes 3 et 4 remplies de 0, donc inutilisées)
Puis encore un clic pour la 3è table :
Partition Table at sector 21318255 (cyl 1327, head 0, sector 1) :
Starting Ending Sectors
Type Boot Cyl Head Sector Cyl Head Sector Before Size
1 83 0 1023 1 1 1023 254 63 63 8016372
2 5 0 1023 0 1 1023 254 63 9028530 11052720 |
Rapidement, les linuxiens reconnaitront une partition 'Linux swap' (82) et une 'Linux Native ext2' ici (83).
Ce qui est intéressant de noter ici, c'est la précence systématique d'une partition étendue (type 5) en plus du lecteur logique défini dans fdisk ou autre, ce qui va impliquer des méthodes de calcul différentes.
À propos des donnés CHS (je rappelle qu'on est au delà de la limite en cylindre), on remarque aussi que le lecteur logique commence tjs au (1023,1,1) et la partition étendue au (1024,0,1).
De même, le lecteur logique commence au secteur 63.
Le 'sector before' de la partition étendue est un peu plus complexe : il s'agit du nbre de secteur par rapport au début de la partition primaire étendue.
Pour retrouver ce nombre, je vais une nouvelle fois m'aider des données LBA pour connaitre les cylindres de début et de fin. Voici ce que me donne fdisk (de linux) à l'affichage des partitions. Attention, il n'affiche par défaut que les lecteur logique et pas les partitions étendues ! (pour celles ci, passer en mode expert).
Starting cyl. Ending cyl. Starting sec. Ending sec. Size (sectors) Size (MB)
1328 1390 21318318 22330349 1012032 494
1391 1889 22330413 30346784 8016372 3914 |
Le 1er lecteur logique commence au même cylindre que la partition étendue primaire.
Retrouvons les données en secteurs. Par rapport à précedemment, il faut ajuster le starting sectors des 63 secteurs de la table de partition. D'ou starting sec. = (starting cyl. - 1)*255*63 + 63
Pas de changement pour le ending sectors, par ex, 1889*255*63-1=30346784. Par contre, le secteur de début du 2ème lecteur logique n'est pas le suivant du dernier secteur du 1er lecteur à cause justement de la table de partition et de la partition étendue (64 secteurs).
Donc sectors size (lecteur logique) = (ending cyl. - start. cyl. + 1)*255*63 - 63
ex : (1889-1391+1)*255*63-63=8016372
Je disais qu'une partition étendue "secondaire" (de type 5) se définie par rapport à LA partition étendue primaire. Soit sectors before(5) = (ending cyl.(lecteur logique) - start. cyl.(part primaire) 1 1)*255*63
Par ex, ici, (1889-1328+1)*255*63 = 9028530
Les partitions étendues de ces tâbles secondaires sont en fait les conteneurs du prochain lecteur logique. C'est pourquoi sector size(5) = sector size(prochain lecteur logique)+63
par ex, 8016372+63=8016435
Ainsi, on devinne grâce à la 3è table ptedit que le prochain lecteur logique sur mon disque fait 11052720-63=11052657 secteurs (soit 5393Mo), qu'il commence au secteur 30346784+64=30346848, et fini au secteur 30346848+11052657-1=41399504. On peut ainsi retrouver le cylindre de fin de ce lecteur : (41399504+1)/(255*63)=2577.
5) Conclusion
Voilà. Tout ceci ne sont que de simples calculs mathématiques, mais intéressant à savoir le jour où on veux corriger ses tables de partitions.
Dans mon cas, c'était justement ces dernières tables que j'ai du retrouver 'mathématiquement'. Je connaissais la position des partitions en cylindres grâce à fdisk de linux. J'ai corriger les tables 2 et 3 pour que les données en secteurs soient cohérentes.
Autre détail "amusant" : la position des tables de partition sur le disque : elles sont tout à la fin de la partition précédante.
Ainsi, Partition Magic m'avait un moment mis 2 lecteurs logiques successifs avec le même cylindre de début. La table présente normalement (n°3) entre ces 2 lecteurs ayant 'disparu', j'ai spécifié les données complètes du 2 lecteur logique et de la partition étendue suivante dans la même table de partition que le 1er lecteur logique (j'avais donc 4 entrées). J'ai juste mis un 'sectors before' pour le 2ème lecteur logique correspondant à la taille du 1er lecteur logique, et la table disparue (n°4) a ensuité été crée au bon endroit. J'ai donc fini par supprimé les lignes 3&4 de la table n°2.
C'était l'histoire technique du jour. J'espère que mon texte est compréhensible, et interessera certains...
Message édité par Eric B le 07-04-2004 à 12:26:32