Le gestionnaire IDE a cinq sources d'information concernant la g�om�trie. La premi�re (G_user) est celle donn�e par l'utilisateur sur la ligne de commande. La deuxi�me (G_bios) est la 'BIOS Fixed Disk Parameter Table' -- table des param�tres de disque fixe du BIOS -- (pour le premier et second disque dur seulement) qui est lue au d�marrage du syst�me, avant le passage au mode 32 bits. Les troisi�me (G_phys) et quatri�me (G_log) sont donn�es par le contr�leur IDE en r�ponse � la commande IDENTIFY -- ce sont les g�om�tries 'physique' et 'logique du moment'.
D'un autre c�t�, le gestionnaire a besoin de deux valeurs pour la
g�om�trie : d'abord G_fdisk, donn�e par un ioctl HDIO_GETGEO
et
ensuite G_used, qui est effectivement utilis�e pour les �ntr�es/Sorties. G_fdisk
et G_used sont toutes deux initialis�es avec la valeur de G_user si elle est
fournie, avec G_bios quand le CMOS dit que cette valeur est pr�sente et avec
G_phys autrement. Si G_log semble vraisemblable, alors G_used est positionn�e �
cette valeur. Sinon, si G_used n'est pas vraisemblable et que G_phys semble
l'�tre, alors G_used prend la valeur de G_phys. Ici, 'vraisemblable' signifie
que le nombre de t�tes est compris dans l'intervalle 1-16.
En d'autres termes : la ligne de commande prend le pas sur le BIOS et va
d�terminer ce que va voir fdisk
, mais si elle donne une g�om�trie
convertie (avec plus de 16 t�tes), alors pour les �ntr�es/Sorties qu'effectuera
le noyau elle sera elle-m�me remplac�e par les valeurs que fournira la commande
IDENTIFY.
Remarquez que G_bios est assez peu fiable : pour des syst�mes qui d�marrent depuis un p�riph�rique SCSI, les premier et second disques durs peuvent tr�s bien �tre SCSI ; et la g�om�trie que le BIOS aura donn� pour sda sera utilis�e par le noyau pour hda. Du reste, les disques durs qui ne sont pas d�clar�s dans la configuration du BIOS ne sont pas vus par ce dernier. Cela signifie que, par exemple, dans un syst�me uniquement IDE o� hdb n'est pas d�clar� dans la configuration, les g�om�tries rapport�es par le BIOS pour les premier et second disques vont �tre appliqu�es � hda et hdc.
Quand on envoie la commande IDENTIF DRIVE (0xec) � un disque dur IDE, il retournera 256 mots d'information contenant de nombreux d�tails techniques. Concentrons nous uniquement sur ce qui joue une r�le pour la g�om�trie. Les mots sont num�rot�s de 0 � 255.
Nous trouvons ici trois informations : DefaultCHS (mots 1,3,6), CurrentCHS (mots 54-58) et LBAcapacity (mots 60-61).
Description | Exemple | |
0 | Champ de bits : bit 6 : disque fixe, bit 7 : media amovible | 0x0040 |
1 | Nombre par d�faut de cylindres | 16383 |
3 | Nombre par d�faut de t�tes | 16 |
6 | Nombre par d�fautl de secteurs par piste | 63 |
10-19 | Num�ro de s�rie (en ASCII) | K8033FEC |
23-26 | R�vision du micro-code (en ASCII) | DA620CQ0 |
27-46 | Nom du mod�le (en ASCII) | Maxtor 54098U8 |
49 | Champ de bits : bit 9 : supporte le LBA | 0x2f00 |
53 | Champ de bits : bit 0 : les mots 54-58 sont valides | 0x0007 |
54 | Nombre actuel de cylindres | 16383 |
55 | Nombre actuel t�tes | 16 |
56 | Nombre actuel de secteurs par piste | 63 |
57-58 | Nombre total actuel de secteurs | 16514064 |
60-61 | Nombre par d�faut de secteurs | 80041248 |
255 | Checksum et signature (0xa5) | 0xf9a5 |
Les cha�nes ASCII sont compos�es de mots contenant chacun deux caract�res, le premier �tant l'octet de poids fort et le second l'octet de poids faible. Les valeurs 32-bits sont donn�es avec le mot de poids faible d'abord. Les mots 54-58 sont positionn�s � l'aide de la commande INITIALIZE DRIVE PARAMETERS (0x91). Ils n'ont un sens que quand CHS est utilis�, mais peuvent aider � trouver la taille r�elle du disque dans le cas o� celui-ci donne les valeurs 4092/16/63 � DefaultCHS (dans le but d'�viter les probl�mes de BIOS).
Parfois, quand un cavalier force un disque � donner une fausse valeur pour LBAcapacity (le plus souvent une valeur de 66055248 secteurs pour pouvoir rester en dessous de la valeur limite de 33,8 Go), il faut disposer d'une quatri�me information pour trouver la taille r�elle du disque : le r�sultat de la commande READ NATIVE MAX ADDRESS (0xf8).
La situation pour le SCSI est l�g�rement diff�rente, puisque les commandes
SCSI utilisent d�j� les num�ros de blocks logiques, donc une 'g�om�trie' est
compl�tement hors de propos pour les v�ritables �ntr�es/Sorties.
Cependant, le format de la table des partitions est toujours le m�me,
donc fdisk
ne fait pas la diff�rence entre des disques IDE et SCSI.
Comme on peut le voir � partir de la description d�taill�e ci-dessus, chaque
gestionnaire de disques s'invente une g�om�trie diff�rente. Un gros foutoir
en fait.
Si vous n'utilisez pas DOS ou un �quivalent, alors �vitez toute configuration qui met en jeu des conversions �tendues et utilisez simplement 64 t�tes, 32 secteurs par piste (cela a pour effet de donner une valeur tout � fait sympathique et commode de 1 Mio par cylindre), si possible, comme �a il n'y aura pas de probl�me quand vous d�placerez le disque dur d'un contr�leur � un autre. Certains gestionnaires de disque SCSI (aha152x, pas16, ppa, qlogicfas, qlogicisp) sont si sensibles au sujet de la compatibilit� avec le DOS qu'ils ne permettront pas � un syst�me uniquement Linux d'utiliser plus de 8 Gio. C'est un bug.
Quelle est la vraie g�om�trie ?
La r�ponse la plus facile est qu'elle n'existe pas.
Et si elle existait, vous ne voudriez pas la conna�tre et � coup s�r
JAMAIS, AU GRAND JAMAIS ne devrez en dire quoi que ce soit � fdisk
ou �
LILO ou au noyau.
C'est uniquement une histoire entre le contr�leur SCSI et le disque dur.
Laissez-moi le redire : seules les personnes stupides donnent �
fdisk
, � LILO ou au noyau la v�ritable g�om�trie d'un disque SCSI.
Mais si vous �tes curieux et que vous insistez, vous devez demander au disque
dur lui-m�me. Il y a l'importante commande READ CAPACITY qui donnera la
capacit� compl�te du disque dur et il y a la commande MODE SENSE, qui, dans
la Rigid Disk Drive Geometry Page (page 04) donne le nombre de cylindres et
de t�tes (c'est une donn�e qui ne peut pas �tre chang�e) et dans
la Format Page (page 03) donne le nombre d'octets par secteur et de secteurs
par piste. Ce dernier nombre est typiquement d�pendant du rang et le nombre
de secteurs par piste varie -- les pistes ext�rieures ont plus de secteurs que
les pistes int�rieures. Le programme Linux scsiinfo
donnera cette
information. Il y a de nombreux d�tails et complications et il est clair que
personne (probablement m�me pas le syst�me d'exploitation) ne d�sire
utiliser cette information. Du reste, tant que nous ne nous int�ressons qu'�
fdisk
et � LILO, on a typiquement des r�ponses du style
C/H/S=4476/27/171 -- valeurs qui ne peuvent pas �tre utilis�es par
fdisk
parce que la table des partitions ne r�serve que 10,8 et 6 bits pour
respectivement C/H/S.
Mais alors, d'o� le HDIO_GETGEO
du noyau tire-t-il ses
informations ?
Eh bien, soit du contr�leur SCSI, soit en faisant une supposition �clair�e.
Certains gestionnaires de disque semblent croire que nous voulons
conna�tre la 'r�alit�', mais bien s�r nous ne voulons savoir que ce que
FDISK de DOS ou de OS/2 (ou AFDISK de Adaptec, etc.) utiliseront.
Remarquez que le fdisk
de linux a besoin des nombres H et S de
t�tes et de secteurs par piste pour convertir les nombres de secteurs
LBA en adresses c/h/s, mais le nombre de cylindres C ne joue aucun
r�le. Quelques gestionnaires de disque utilisent (C,H,S)=(1023,255,63) pour
signaler que la capacit� du disque dur est d'au moins 1023×255×63
secteurs. Ce n'est pas de chance, puisqu'ils ne r�v�lent pas la vraie taille et
limiteront les utilisateurs de la plupart des versions de fdisk
�
n'avoir acc�s qu'� environ 8 Gio de leur disque -- une s�rieuse
limitation de nos jours.
Dans le texte ci-dessous, M repr�sente la capacit� totale du disque dur et C, H, S, le nombres de cylindres, de t�tes et de secteurs par piste. Il suffit de donner H, S si l'on voit C comme �tant d�fini par M/(H×S).
Par d�faut, H=64 et S=32.
H=64, S=32.
H=64, S=32 � moins que C ne soit sup�rieur � 1024, auquel cas H=255, S=63,
C=min(1023, M/(H×S)).
(Ainsi C est tronqu� et H×S×C n'est pas une approximation de la
capacit� M du disque dur. Cela va d�router la plupart des versions de
fdisk
.) Le code de ppa.c
utilise M+1 � la place de M et dit qu'�
cause d'un bug dans sd.c
, M est plus petit de 1.
H=64 et S=32 � moins que C ne soit sup�rieur � 1024 ou que, encore mieux, l'option du BIOS '> 1 GB' ait �t� activ�e, auquel cas H=255 et S=63.
Demande au contr�leur lequel des deux sch�mas de conversion est utilis� et se sert soit de H=255, S=63, soit de H=64, S=32. Dans le dernier cas, il y a un message au d�marrage qui dit "aha1542.c: Using extended bios translation" ("aha1542.c: Utilisation du mode de conversion �tendu du bios")
H=64 et S=32 � moins que C ne soit sup�rieur � 1024 ou que, mieux encore,
le param�tre de d�marrage "extended" ait �t� pass�, ou que le bit 'extended'
ait �t� positionn� dans la SEEPROM ou dans le BIOS, auquel cas H=255, S=63.
Dans Linux 2.0.36 ce mode de conversion �tendu devrait toujours �tre
automatiquement utilis� si il n'y a pas de SEEPROM, mais dans Linux 2.2.6,
si le m�me cas se pr�sente, le mode de conversion �tendu est utilis�
seulement si l'utilisateur le demande au travers du param�tre de d�marrage (de
ce fait, quand une SEEPROM est trouv�e, le param�tre de d�marrage est ignor�).
Cela signifie qu'une configuration qui fonctionne en 2.0.36 peut ne pas
d�marrer avec un noyau 2.2.6 (LILO n�cessite alors le mot-cl�
linear
, ou le noyau a besoin du param�tre aic7xxx=extended
au
d�marrage).
H=64 et S=32 � moins que C ne soit sup�rieur � 1024, ou que, encore mieux, le mode de conversion �tendu ait �t� autoris� au niveau du contr�leur, auquel cas si M<2^22 alors H=128, S=32 ; sinon H=255, S=63. Cependant, apr�s avoir fait ce choix pour (C,H,S), la table des partitions est lue et si pour l'une des trois possibilit�s (H,S)=(64,32),(128,32),(255,63) la valeur endH=H-1 est vue quelque part, alors cette paire est utilis�e et le message "Adopting Geometry from Partition Table" ("Adoption de la g�om�trie lue dans la table des partitions") est affich� au d�marrage.
Il trouve l'information sur la g�om�trie dans la Table des Param�tres des Disques du BIOS (BIOS Drive Parameter Table), ou lit la table des partitions et utilise H=endH+1, S=endS pour la premi�re partition, � condition qu'elle ne soit pas vide, ou utilise H=64, S=32 pour M<2^21 (1 Gio), H=128, S=63 pout M<63×2^17 (3.9 Gio) et H=255, S=63 dans les autres cas.
Il utilise le premier couple (H,S)=(64,32),(64,63),(128,63),(255,63) qui rendra C<1024. Dans le dernier cas, C est ramen� � la valeur 1023.
Il lit C,H,S depuis le disque dur. (Horreur !) Si C ou S sont trop grands, alors il fixe S=17, H=2 et double la valeur de H tant que C<=1024. Cela signifie que H sera mis � 0 si M>128×1024×17 (1.1 Gio). C'est un bug.
Un de ces trois couples de r�f�rence est utilis� ((H,S)=(16,63),(64,32),(64,63)) en fonction du mode de cartographie du contr�leur.
Regardez la table des partitions. Puisque par convention les partitions se
terminent � la limite d'un cylindre, nous pouvons, �tant donn� que
end=(endC,endH,endS)
pour n'importe quelle partition, simplement fixer
H=endH+1
et S=endS
. (Il est rappel� que le d�compte des
secteurs commence � 1.)
Plus pr�cis�ment, voil� ce qui est fait : s'il existe une partition non
vide, prendre la partition avec le plus grand begin
. Pour cette
partition, regarder endH+1
, calcul� � la fois en additionnant
start
et length
et en supposant le fait que cette partition se
termine � la limite d'un cylindre. Si les deux valeurs concordent, ou si
endC
=1023 et start+length
est un multiple entier de
(endH+1)xendS
, alors accepter le fait que cette partition se termine
effectivement sur la fronti�re d'un cylindre et fixer H=endH+1
et
S=endS
.
Si cela �choue, soit parce qu'il n'y a pas de partition, soit parce qu'elles ont
des tailles bizarres, il faut uniquement se fier � la capacit� totale M
du disque dur.
Algorithme : fixer H=M/
(62×1024) (arrondi au chiffre
sup�rieur), S=M/
(1024×H) (arrondi au chiffre sup�rieur),
C=M/
(H×S) (arrondi au chiffre inf�rieur).
Cela a pour effet de g�n�rer un triplet (C,H,S) avec C �gal � 1024 au plus et
S �gal � 62 au plus.
Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 18:01:42