Page suivantePage pr�c�denteTable des mati�res

10. D�tails

10.1 D�tails de l'IDE - les sept g�om�tries

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.

Commande IDENTIFY DRIVE

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).

10.2 D�tails pour le SCSI

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.

aha1740, dtc, g_NCR5380, t128, wd7000 :

H=64, S=32.

aha152x, pas16, ppa, qlogicfas, qlogicisp :

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.

advansys :

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.

aha1542 :

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")

aic7xxx :

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).

buslogic :

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.

fdomain :

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.

in2000 :

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.

seagate :

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.

ultrastor et u14_34f :

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.

Si le gestionnaire ne pr�cise pas la g�om�trie, nous retombons dans un mode de supposition guid� par la table des partitions, ou par la capacit� totale du disque dur.

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.


Page suivantePage pr�c�denteTable des mati�res

Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 18:01:42