
                      HOWTO - Disques de grande capacit

Andries Brouwer, aeb@cwi.nl, version franaise par Xavier Serpaggi

   v2.2a, 26 April 1999
     _________________________________________________________________

   _Tout sur la gomtrie des disques durs et la limite des 1024
   cylindres. _
     _________________________________________________________________

1. Enonc du problme

   Supposons que vous ayez un disque dur de plus de 1024 cylindres.
   Supposons galement que vous ayez un systme d'exploitation qui
   utilise l'ancienne interface INT13, d'Entre/Sortie sur disques. Dans
   ce cas, vous avez un problme, parce que cette interface utilise un
   champ de 10 bits pour coder les cylindres sur lesquels sont effectues
   les Entres/Sorties, de telle manire que les cylindres 1024 et
   au-del sont inaccessibles.

   Heureusement, Linux ne se sert pas du BIOS, donc il n'y a pas de
   problme.

   Sauf peut-tre pour deux choses :

   (1) Quand vous dmarrez votre systme, Linux ne fonctionne pas encore
   et ne peut donc pas vous prserver des problmes lis au BIOS. Ceci a
   certaines consquences pour LILO et d'autres programmes d'amorage du
   mme acabit.

   (2) Il est ncessaire que tous les systmes d'exploitation qui se
   partagent un mme disque dur se mettent d'accord sur la position
   physique de chaque partition. En d'autres termes, si vous utilisez
   Linux et disons, DOS sur un seul disque dur, alors, les deux se
   doivent d'interprter la table des partitions de la mme manire. Ceci
   a quelques consquences pour le noyau de Linux et pour fdisk.

   Vous trouverez ci-dessous une description assez pousse de tous les
   dtails importants. Prenez en compte le fait que j'utilise comme
   rfrence un noyau dans sa version 2.0.8. D'autres versions pourront
   donc prsenter quelques diffrences.

2. Rsum

   Vous avez un nouveau disque de grande capacit. Que faire ? Bon, du
   ct logiciel il faut utiliser fdisk (ou mieux, cfdisk), pour crer
   les partitions, ensuite mke2fs pour crer un systme de fichiers, et
   enfin mount pour faire le lien entre ce nouveau systme de fichiers et
   l'arborescence dj existante.

   Il n'est pas ncessaire de lire ce HOWTO  partir du moment o, de nos
   jours, il n'y a _pas_ de problme avec les disques de grande capacit.
   La grande majorit des problmes constats est due au fait que les
   gens pensent qu'il peut y avoir un problme, et installent un
   gestionnaire de disques durs, ou passent en mode expert dans fdisk, ou
   encore spcifient explicitement une gomtrie de disque  LILO ou sur
   la ligne de commande du noyau.

   Cependant, les domaines dans lesquels interviennent typiquement les
   problmes sont :
     * un matriel ancestral ;
     * plusieurs systmes d'exploitation sur le mme disque dur ;
     * le dmarrage.

   Conseil :

   Pour les disques durs SCSI de grande capacit : Linux les a trs tt
   supports. Il n'y a rien  faire.

   Pour les disques durs IDE de grande capacit : procurez-vous un noyau
   stable rcent (2.0.34 ou plus). Normalement, tout doit se passer
   correctement, surtout si vous avez eu la sagesse de ne pas dire au
   BIOS de faire des conversions du type LBA ou assimil.

   Si LILO reste suspendu au dmarrage, il faut essayer de spcifier
   linear dans le fichier de configuration /etc/lilo.conf.

   Il y a des problmes de gomtrie qui peuvent tre rsolus en passant
   explicitement une gomtrie au noyau/LILO/fdisk.

   Si vous avez un vieux fdisk et qu'il vous met des messages d'erreur du
   type `overlapping partitions' : ignorez-les ou vrifiez en utilisant
   cfdisk qui est vraiment bien.

   Si vous pensez que quelque chose cloche dans la taille de votre disque
   dur, assurez-vous que vous n'tes pas en train de confondre units
   binaires et dcimales, et sachez que l'espace libre rapport par df
   pour un disque vide est de quelques pour-cent infrieur  la taille de
   la partition, ce  cause d'un en-tte de gestion.

   Maintenant, si vous pensez qu'il y a tout de mme des problmes, ou
   simplement si vous tes curieux, lisez la suite.

3. Units et tailles

   Un kilo-octet (Ko) est gal  1000 octets (NdT : un octet se dit byte
   en anglais, et est abrg avec un `B' en majuscule. A ne pas confondre
   avec un bit, qui se dit bit et qui est abrg avec un `b' en minuscule
   !). Un Mga-octet (Mo) est gal  1000 Ko. Un Giga-octet (Go) est gal
    1000 Mo. Un Tra-octet (To) est gal  1000 Go. Ceci est la norme
   dans le Systme International (SI).

   Cependant, il y a des personnes qui utilisent la conversion
   1Mo=1024000 octets et parlent de disquettes de 1,44Mo, et des
   personnes qui pensent que 1Mo=1048576 octets. L, je me reporte au
   standard propos, et j'cris Ki, Mi, Gi, Ti pour les units binaires,
   de telle sorte que les disquettes ont une taille de 1440 Kio (1,47 Mo,
   1,41 Mio), 1 Mio est gal  1048576 octets (1,05 Mo), 1 Gio reprsente
   1073741824 octets (1,07 Go) et 1 Tio vaut 1099511627776 octets (1,1
   To).

   D'une manire assez normale, les constructeurs de disques durs suivent
   la norme SI et utilisent des units dcimales. Cependant, les messages
   de dmarrage de Linux et quelques programmes de type fdisk utilisent
   les symboles MB et GB (Mo et Go en franais) pour les units binaires,
   ou binaires-dcimales mlanges. Donc, avant que vous ne pensiez que
   votre disque est plus petit que ce qu'on vous avait promis lors de son
   achat, calculez sa vrai taille en units dcimales (ou simplement en
   octets).

3.1 Taille d'un secteur

   Dans le cadre de ce texte, un secteur a une taille de 512 octets. Ceci
   est pratiquement toujours vrai, mais certains disques Magnto-Optiques
   par exemple, utilisent une taille de secteur gale  2048 octets, et
   toutes les capacits donnes ci-dessous doivent tre multiplies par
   quatre. (Si vous utilisez fdisk sur de tels disques, assurez-vous
   d'avoir une version 2.9i ou suprieure, et passez lui l'option `-b
   2048'.)

3.2 Taille d'un disque

   Un disque avec C cylindres, H ttes (NdT : tte se dit head en
   anglais, d'o l'abrviation ;-)) et S secteurs par piste possde en
   tout C*H*S secteurs, et peut stocker C*H*S*512 octets. Par exemple, si
   sur un disque dur il est crit C/H/S=4092/16/63, alors celui-ci a
   4092*16*63=4124736 secteurs, et peut contenir 4124736*512=2111864832
   octets (2,11 Go). Il y a une convention dans l'industrie qui consiste
    donner C/H/S=16383/16/63 pour les disques durs de plus de 8,4 Go, et
   donc la taille du disque ne peut plus tre dduite des valeurs C/H/S
   rapportes par ce dernier.

4. Accs  un disque dur

   Si on veut lire ou crire quelque chose  partir de, ou sur un disque
   dur, il faut spcifier une position sur ce disque, en donnant par
   exemple un numro de secteur ou de bloc. Si le disque dur est de type
   SCSI, alors ce numro de secteur va directement au moteur de commande
   SCSI et est compris par le disque. Si le disque dur est de type IDE et
   qu'il utilise le mode LBA, alors il se passe exactement la mme chose.
   Mais si le disque dur est vieux, RLL, MFM ou IDE avant l'apparition du
   LBA, alors l'lectronique qui lui est attache attend un triplet
   (cylindre, tte, secteur) pour dsigner l'endroit voulu.

   La correspondance entre la numrotation linaire et cette notation
   tridimensionnelle est la suivante : pour un disque dur avec C
   cylindres, H ttes et S secteurs/pistes, la position (c,h,s) en 3D, ou
   la notation CHS, est la mme que la position c*H*S + h*S + (s-1) en
   notation linaire ou bien LBA. (Le -1 est d au fait que
   traditionnellement les secteurs sont numrots  partir de 1 et non 0,
   dans cette notation 3D.)

   En consquence, pour permettre des accs  un trs vieux disque
   non-SCSI, nous devons connatre sa _gomtrie_, c'est--dire les
   valeurs de C, H et S.

4.1 Les accs disques du BIOS et la limite des 1024 cylindres

   Linux ne se sert pas du BIOS, mais d'autres systmes d'exploitation le
   font. Le BIOS, qui existait avant le temps du LBA, offre avec INT13
   des routines d'Entre/Sortie disque qui prennent (c,h,s) comme
   arguments. (Plus prcisment : AH slectionne la fonction  excuter,
   CH correspond aux 8 bits de poids faible du numro de cylindre, CL a
   dans ses bits 7-6 les deux bits de poids fort de ce mme numro et
   dans ses bits 5-0 le numro du secteur, DH est le numro de la tte,
   et DL est le numro du lecteur (80h ou 81h). Ceci explique en partie
   l'agencement de la table des partitions.)

   Donc, nous obtenons un CHS cod sur trois octets, avec 10 bits pour le
   numro du cylindre, 8 bits pour le numro de tte, et 6 bits pour le
   numro de secteur sur la piste (numrot de 1  63). Il s'ensuit que
   le numro de cylindre peut prendre des valeurs allant de 0  1023 et
   que le BIOS ne peut pas adresser plus de 1024 cylindres.

   Les logiciels DOS et Windows n'ont pas volu quand furent introduits
   les disques IDE avec le support LBA, et ont toujours eu besoin du
   soutien d'une gomtrie pour grer les disques durs, mme quand cela
   n'a plus t ncessaire pour effectuer des Entres/Sorties, mais
   uniquement pour converser avec le BIOS. Ceci signifie bien sr que
   Linux a besoin du support de la gomtrie du disque dur quand il est
   ncessaire de communiquer avec le BIOS ou avec d'autres systmes
   d'exploitation, mme sur des disques durs modernes.

   Cet tat de choses a dur pendant  peu prs quatre ans. Ont alors
   commenc  apparatre sur le march des disques durs qui ne pouvaient
   plus tre adresss avec les fonctions INT13 ( cause du fait que
   10+8+6=24 bits pour (c,h,s) ne peuvent pas adresser plus de 8,5 Go),
   et une nouvelle interface BIOS a t cre : les dnommes Fonctions
   INT13 Etendues, o DS:SI pointe sur un paquet reprsentant l'adressage
   du disque sur 16 octets, qui contient un nombre absolu de blocs
   commenant par 8 octets.

   Tout doucement, le monde Microsoft semble aller vers une utilisation
   de ces Fonctions INT13 Etendues. Probablement, dans quelques annes,
   plus aucun systme moderne plac dans un ordinateur moderne n'aura
   besoin du concept de `gomtrie de disque dur'.

4.2 Histoire du BIOS et des limites de l'IDE

   _Spcification ATA (pour les disques durs IDE) - la limite des 137 Go_
          Au plus 65536 cylindres (numrots de 0  65535), 16 ttes
          (numrotes de 0  15), 255 secteurs par piste (numrots de 1
           255), pour une capacit totale maximale de 267386880 secteurs
          (de 512 octets chacun), ce qui fait 136902082560 octets (137
          Go). Ce n'est pas encore un problme (en 1999), mais a le
          deviendra dans quelques annes.

   _BIOS Int 13 - la limite des 8,5 Go_
          Au plus 1024 cylindres (numrots de 0  1023), 256 ttes
          (numrotes de 0  255), 63 secteurs par piste (numrots de 1
           63) pour une capacit totale maximale de 8455716864 octets
          (8,5 Go). De nos jours, ceci est une srieuse limitation. Cela
          signifie que DOS ne peut utiliser les actuels disques de grande
          capacit.

   _La limite des 528 Mo_
          Si les mmes valeurs c,h,s sont utilises pour les appels aux
          fonctions Int13 du BIOS et pour les oprations
          d'Entres/Sorties du disque dur, alors les deux limitations
          s'ajoutent, et l'on ne peut utiliser au plus que 1024
          cylindres, 16 ttes, 63 secteurs par piste, ce qui donne une
          capacit totale maximale de 528482304 octets (528 Mo),
          l'abominable limite des 504 Mio pour DOS avec un vieux BIOS.
          Ceci a commenc  poser des problmes aux alentours de 1993, et
          les gens ont eu recours  toutes sortes de bidouillages, aussi
          bien au niveau matriel (LBA), qu'au niveau du microprogramme
          (NdT : le `firmware') (les conversions du BIOS), ou qu'au
          niveau logiciel (les gestionnaires de disques durs). Le concept
          de `conversion' a t invent (1994) : un BIOS pouvait utiliser
          une gomtrie quand il s'adressait au lecteur, et une autre
          gomtrie, fausse celle-l, quand il parlait  DOS, et faire
          des conversions de l'une  l'autre.

   _La limite des 2,1 Go (avril 1996)_
          Quelques vieux BIOS n'utilisent qu'un champ de 12 bits en RAM
          CMOS pour donner le nombre de cylindres. De ce fait, ce nombre
          peut tre au plus gal  4095, et l'on ne peut accder qu'
          4095*16*63*512=2113413120 octets. Le fait d'avoir un disque dur
          de plus grande capacit se traduirait par un plantage au moment
          du dmarrage. Ceci a pour effet de rendre les disques avec une
          gomtrie de 4092/16/63 assez populaires. Et encore de nos
          jours, beaucoup de gros disques durs ont un cavalier qui permet
          de faire croire qu'ils ont une gomtrie de 4092/16/63. Vous
          pouvez galement jeter un coup d'oeil  la page plus de 2 Go.

   _La limite des 3,2 Go_
          Il y avait un bug dans la gestion des BIOS Phoenix 4.03 et 4.04
          qui bloquait le systme lors de la configuration du CMOS pour
          des disques durs ayant une capacit suprieure  3277 Mo. Jetez
          un oeil  la page plus de 3 Go.

   _La limite des 4,2 Go (fvrier 1997)_
          Une conversion simple du BIOS (ECHS = CHS Etendu, parfois
          appel `Large disk support' ou simplement `Large') fonctionne
          en doublant le nombre de ttes et en divisant par deux le
          nombre de cylindres montrs au DOS, de manire rpte, jusqu'
          ce que le nombre de cylindres soit au plus gal  1024.
          Maintenant, DOS et Windows 95 ne peuvent pas supporter 256
          ttes de lecture, et donc, dans le cas frquent o le disque
          dit avoir 16 ttes, cela signifie que cette moulinette ne
          fonctionne que jusqu' une taille de 8192*16*63*512=4227858432
          octets (avec une fausse gomtrie de 1024 cylindres, 128 ttes
          et 63 secteurs par piste). Remarquez que ECHS ne modifie pas le
          nombre de secteurs par piste, donc si ce n'est pas 63, la
          limite sera encore plus basse. Voyez la page plus de 4 Go.

   _La limite des 7,9 Go_
          Des BIOS un peu plus malins que les autres vitent le problme
          prcdent en ajustant d'abord le nombre de ttes  15 (`revised
          ECHS'), de faon  ce qu'une fausse gomtrie comportant 240
          ttes soit obtenue. C'est donc valable pour une taille allant
          jusqu' 1024*240*63*512=7927234560 octets.

   _La limite des 8,4 Go_
          En dfinitive, si le BIOS fait tout ce qu'il peut pour russir
          la conversion, et utilise 255 ttes et 63 secteurs par piste
          (`assisted LBA' ou simplement `LBA') il peut atteindre
          1024*255*63*512=8422686720 octets, soit lgrement moins que la
          prcdente limite de 8,5 Go, ce parce que les gomtries avec
          256 ttes doivent tre vites. (Cette conversion utilisera
          pour le nombre de ttes la premire valeur H, prise dans la
          suite 16, 32, 64, 128, 255, pour laquelle la capacit totale du
          disque dur tient dans 1024*H*63*512, et calcule alors le nombre
          de cylindres C comme tant gal  la capacit totale divise
          par (H*63*512).)

   Pour une autre discussion sur ce sujet, vous pouvez consulter la page
   Breaking the Barriers, et pour encore plus de dtails, IDE Hard Drive
   Capacity Barriers.

   Les disques durs de plus de 8,4 Go sont supposs donner leur gomtrie
   comme tant 16383/16/63. Cela signifie en fait que la `gomtrie' est
   obsolte, et qu'elle ne peut plus servir  calculer la taille totale
   d'un disque dur.

5. Dmarrage

   Quand le systme est mis en route, le BIOS lit le secteur 0 (connu
   sous le nom de MBR - le "Master Boot Record", la donne principale
   d'amorage) du premier disque dur (ou de la disquette, ou du cd-rom),
   et saute au code trouv  cet endroit - en gnral un chargeur
   d'amorce. Les petits chargeurs trouvs  cet endroit n'ont, par
   principe, pas leur propre gestionnaire de disques durs, et utilisent
   plutt les services du BIOS. Cela signifie qu'un noyau Linux ne peut
   tre charg que s'il est entirement situ dans les 1024 premiers
   cylindres du disque.

   Ce problme est rsolu de manire trs simple : assurez-vous que le
   noyau (et peut-tre d'autres fichiers utiliss pendant la phase de
   dmarrage, comme les fichiers `map' de LILO) soit situ sur une
   partition qui est comprise toute entire dans les 1024 premiers
   cylindres d'un disque dur auquel le BIOS peut accder - il est
   probable qu'il s'agisse du premier ou du second disque.

   Ainsi, crez une petite partition, disons d'une taille de 10 Mo, de
   telle manire  ce qu'il y ait de la place pour une poigne de noyaux,
   en vous assurant qu'elle soit contenue entirement dans les 1024
   premiers cylindres du premier ou du second disque dur. Montez-le en
   tant que rpertoire /boot ; ainsi, LILO pourra y mettre ses propres
   fichiers.

5.1 LILO et l'option `linear'

   Un autre point est que le programme d'amorage et le BIOS doivent tre
   d'accord sur la gomtrie du disque dur. LILO demande la gomtrie au
   noyau, mais de plus en plus d'auteurs de gestionnaires de disques durs
   suivent la mauvaise habitude qui consiste  dduire une gomtrie 
   partir de la table de partitions, plutt que de dire  LILO ce que le
   BIOS va utiliser. Donc, la gomtrie fournie par le noyau est souvent
   inutile. Dans de tels cas on peut faciliter la tche  LILO en lui
   passant l'option linear. Il en rsulte que LILO n'a pas besoin
   d'information sur la gomtrie au moment d'installer le programme
   d'amorage (il stocke des adresses linaires dans des cartes :
   fichiers `map') mais fait la conversion des adresses linaires au
   moment du dmarrage. Pourquoi ceci n'est-il pas le comportement par
   dfaut ? En fait, il y a un inconvnient : avec l'option `linear',
   LILO ne connat plus les numros de cylindres, et par consquent ne
   peut plus vous avertir quand une partie du noyau a t enregistre
   au-del de la limite du cylindre 1024, et vous pouvez vous retrouver
   avec un systme qui ne dmarre plus.

5.2 1024 cylindres ce n'est pas 1024 cylindres

   Tim Williams a crit : "J'avais ma partition Linux en dessous des 1024
   premiers cylindres, et a ne dmarrait quand mme pas. Au dbut quand
   je l'ai dplace en dessous de 1 Go, les choses fonctionnaient."
   Comment cela est-il possible ? En fait, c'tait un disque dur SCSI
   avec un contrleur AHA2940UW qui utilise soit H=64, S=32
   (c'est--dire, des cylindres de 1Mio = 1,05 Mo), soit H=255, S=63
   (c'est--dire, des cylindres de 8,2 Mo), en fonction des options du
   micro-code du disque dur, et du BIOS. Il ne fait aucun doute que le
   BIOS se basait sur le premier groupe de valeurs, c'est pourquoi la
   limite des 1024 cylindres tait trouve  1 Gio, alors que Linux
   utilisait la seconde mthode et LILO estimait que la limite tait 
   8,4 Go.

6. Gomtrie du disque dur, partitions et `overlap'

   Si vous avez plusieurs systmes d'exploitation sur vos disques durs,
   alors chacun utilise une ou plusieurs partitions. Un dsaccord sur la
   localisation de ces partitions peut avoir des consquences
   catastrophiques.

   Le MBR contient une _table des partitions_ qui dcrit o se situent
   les partitions (primaires). Il y a 4 entres  la table, pour 4
   partitions primaires, et chacune ressemble  :

struct partition {
        char active;    /* 0x80 : on peut dmarrer avec, 0 : on ne peut pas */
        char begin[3];  /* CHS pour le premier secteur */
        char type;
        char end[3];    /* CHS pour le dernier secteur */
        int start;      /* numro de secteur sur 32 bits (en commenant  0) */
        int length;     /* nombre de secteurs sur 32 bits */
};

   (avec CHS qui signifie Cylinder/Head/Sector).

   Cette information est redondante : la position de la partition est
   donne  la fois par les champs begin et end cods sur 24 bits, et par
   les champs start et length cods sur 32 bits.

   Linux ne se sert que des champs start et length, et ne peut de ce fait
   que prendre en compte des partitions qui ne comportent pas plus de
   2^32 secteurs, c'est--dire, des partitions d'au plus 2 Tio. Cette
   capacit est des centaines de fois plus grande que celle des disques
   durs que l'on peut trouver de nos jours, alors peut-tre que cela sera
   suffisant pour, environ, les huit prochaines annes. (Donc, les
   partitions peuvent tre trs grandes, mais il y a une srieuse
   restriction avec le systme de fichier ext2 quand il est utilis sur
   des machines avec des entiers cods sur 32 bits : la taille maximale
   d'un fichier est limite  2 Gio.)

   DOS utilise les champs begin et end, et se sert des appels INT13 du
   BIOS pour accder aux disques durs, il ne peut grer de ce fait que
   des disques dont la taille ne dpasse pas 8,4 Go, mme avec un BIOS
   qui fait des conversions. (La taille des partitions ne peut pas
   excder 2,1 Go  cause des restrictions du systme de fichier FAT16.)
   La mme chose est valable pour Windows 3.11, WfWG, Windows NT 3.* et
   Novel NetWare.

   Windows 95 intgre la gestion des interfaces INT13 Etendues, et
   utilise des types de partition spciaux (c, e, f  la place de b, 6,
   5) pour indiquer que l'on doit accder  la partition de cette
   manire. Quand ces types de partition sont utiliss, les champs begin
   et end contiennent des informations factices (1023/255/63). Windows 95
   OSR2 introduit le systme de fichier FAT32 (types de partition b ou
   c), qui permet d'avoir des partitions d'au plus 2 Tio.

   Qu'est ce que c'est que ce message insens que vous rapporte fdisk au
   sujet de partitions qui se chevauchent : `overlapping', quand pourtant
   tout est en ordre ? En fait - il y a quelque chose de
   `problmatique' : si vous voyez les champs begin et end de telles
   partitions, comme DOS le fait, il y a chevauchement. (Et ceci ne peut
   pas tre corrig, parce que ces champs ne peuvent pas stocker des
   numros de cylindre plus grands que 1024 - il y aura toujours
   `chevauchement' ds que vous aurez plus de 1024 cylindres.) Cependant,
   si vous voyez les champs start et length, comme les voit Linux, et
   galement Windows 95 dans le cas de partitions types c, e ou f, alors
   tout apparat comme tant en ordre. Donc, ne tenez pas compte de ces
   avertissements quand cfdisk ne se plaint pas et que vous avez un
   disque dur avec uniquement Linux dessus. Soyez prudents quand le
   disque dur est partag avec DOS. Servez-vous des commandes cfdisk -Ps
   /dev/hdx et cfdisk -Pt /dev/hdx pour voir la table des partitions du
   disque /dev/hdx.

7. Conversion et Gestionnaires de Disques Durs

   La gomtrie des disques durs (avec ttes, cylindres et pistes) est
   une notion qui date de l'ge de MFM et RLL. En ces temps l cela
   correspondait  une ralit physique. Aujourd'hui, avec l'IDE ou le
   SCSI, plus personne n'est intress par les `vritables' valeurs de la
   gomtrie d'un disque dur. En effet, le nombre de secteurs par piste
   est variable - il y en a plus pour les pistes proches du bord
   extrieur du disque - donc il n'y a pas de `bon' nombre de secteurs
   par piste. Pratiquement  l'oppos : la commande IDE, INITIALIZE DRIVE
   PARAMETERS (91h) est utilise pour renseigner le disque dur sur le
   nombre de ttes et de secteurs par piste qu'il est sens avoir  ce
   moment prcis. Il est assez normal de voir un gros disque dur rcent
   qui n'a que 2 ttes, rapporter qu'il en a 15 ou 16 au BIOS, pendant
   que le BIOS peut  son tour dire au logiciel qui va s'en servir qu'il
   en a 255.

   Pour l'utilisateur, le mieux est de voir le disque dur comme un
   tableau linaire de secteurs numrots 0, 1, ..., et de laisser le
   micro-code trouver o, sur le disque dur, est situ tel ou tel
   secteur. Cette numrotation linaire est appele LBA.

   Donc,  prsent, la vision conceptuelle est la suivante : DOS, ou quel
   que soit le programme d'amorage, converse avec le BIOS en se servant
   de la notation (c,h,s). Le BIOS convertit (c,h,s) en notation LBA en
   utilisant la gomtrie factice dont l'utilisateur se sert. Si le
   disque dur accepte le LBA, alors cette valeur est utilise pour les
   Entres/Sorties sur le disque. Autrement, elle est  nouveau convertie
   en (c',h',s') en utilisant la gomtrie dont le disque se sert cette
   fois l, et qui est utilise pour les Entres/Sorties.

   Remarquez qu'il y a une lgre confusion dans l'utilisation de
   l'expression `LBA' : En tant que terme dcrivant les possibilits d'un
   disque dur, cela signifie `Linear Block Adressing' - Adressage de
   blocs de manire linaire - (par opposition  un adressage CHS). En
   tant que terme de configuration du BIOS, il dcrit la mthode de
   conversion parfois appele `Assisted LBA' - voir plus haut : ` La
   limite des 8,4 Go'.

   Un comportement  peu prs identique apparat quand le micro-code ne
   parle pas le LBA, mais que le BIOS connat la conversion. (Dans la
   configuration il est souvent mentionn `Large'.) Donc, le BIOS va
   prsenter une gomtrie (C,H,S) au systme d'exploitation, et va
   utiliser (C',H',S') quand il parlera au contrleur du disque dur.
   Habituellement, S = S', C = C'/N et H = H'*N, o N est la plus petite
   puissance de deux qui garantisse C' <= 1024 (ainsi un minimum d'espace
   disque est perdu au moment de l'arrondi dans C' = C/N). Encore une
   fois, cela permet un accs  8,4 Go maximum (7,8 Gio).

   (La troisime option de configuration est `Normal', pour laquelle
   aucune conversion n'est effectue.)

   Si un BIOS ne connat pas `Large' ou `LBA', alors il existe quelque
   part une solution logicielle. Les gestionnaires de disques durs comme
   OnTrack ou EZ-Drive remplacent les routines de gestion de disque du
   BIOS par les leurs. Ceci est souvent ralis en faisant rsider le
   code du gestionnaire de disque dans le MBR et les secteurs suivants
   (OnTrack nomme ce code DDO : Dynamic Drive Overlay - recouvrement
   dynamique de disque), comme a, il est charg avant n'importe quel
   autre systme d'exploitation. C'est pourquoi on peut avoir des
   problmes en dmarrant depuis une disquette quand un gestionnaire de
   disque dur a t install.

   Le rsultat est plus ou moins le mme avec un BIOS qui fait des
   conversions - mais particulirement, c'est quand on utilise plusieurs
   systmes d'exploitation sur le mme disque dur que ces gestionnaires
   peuvent poser beaucoup de problmes.

   Depuis sa version 1.3.14, Linux supporte le gestionnaire de disque dur
   OnTrack. EZ-Drive quant  lui est support depuis la version 1.3.29.
   Quelques dtails supplmentaires sont donns dans ce qui suit.

8. Les conversions du noyau pour les disques durs IDE

   Si le noyau de Linux dtecte la prsence de gestionnaire de disque sur
   un disque dur IDE, il va essayer de recartographier le disque de la
   mme manire que l'aurait fait le gestionnaire de disque, comme a
   Linux voit le mme partitionnement pour, par exemple, DOS avec OnTrack
   ou EZ-Drive. Cependant, AUCUNE recartographie n'est effectue quand
   une gomtrie a t passe en ligne de commande - donc une option de
   la ligne de commande comme `hd=_cyls_,_ttes_,_secs_' peut trs bien
   briser la compatibilit avec un gestionnaire de disque.

   La nouvelle cartographie est obtenue en essayant les valeurs 4, 8, 16,
   32, 64, 128, 255 pour le nombre de ttes (H*C reste constant) jusqu'
   ce que C <= 1024 ou que H = 255.

   Ci-dessous les dtails - les titres des sous-sections sont les
   messages qui apparaissent dans les diffrents messages de dmarrage.
   Ici et partout ailleurs dans ce texte, les types des partitions sont
   donns en hexadcimal.

8.1 EZD

   EZ-Drive est dtect par le fait que le type de la premire partition
   primaire est 55. La gomtrie est recartographie comme dcrit
   ci-dessus, et la table des partitions du secteur 0 est supprime - 
   la place, la table des partitions est celle lue sur le secteur 1. Le
   nombre de blocs du disque n'est pas chang, mais les critures sur le
   secteur 0 sont rediriges vers le secteur 1. Ce comportement peut tre
   modifi en recompilant le noyau avec #define FAKE_FDISK_FOR_EZDRIVE 0
   dans ide.c.

8.2 DM6 : DDO

   OnTrack DiskManager (sur le premier disque dur) est dtect grce au
   type 54 de la premire partition primaire. La gomtrie est
   recartographie comme dcrit ci-dessus et la totalit du disque est
   dcale de 63 secteurs (comme a, l'ancien secteur 63 devient le
   numro 0). Ensuite un nouveau MBR (avec une table des partitions) est
   lu depuis le nouveau secteur 0. Bien sr ce dcalage a pour but de
   librer de la place pour le DD0 - c'est pourquoi il n'y a pas de
   dcalage sur les autres disques durs.

8.3 DM6 : AUX

   OnTrack DiskManager (sur les autres disques durs) est dtect grce au
   type 51 ou 53 de la premire partition primaire. La gomtrie est
   recartographie comme dcrit ci-dessus.

8.4 DM6 : MBR

   Une version plus ancienne de OnTrack DiskManager n'est pas dtecte
   grce au type de partition, mais par signature. (Un test est effectu
   pour savoir si la valeur de dcalage trouve dans les octets 2 et 3 du
   MBR n'est pas suprieure  430, et si le short trouv  cette valeur
   de dcalage est gal  0x55AA et qu'il est suivi par un octet impair.)
   Une fois encore, la gomtrie est recartographie comme dcrit
   ci-dessus.

8.5 PTBL

   Finalement, il y a un test qui tente de dduire une conversion 
   partir des valeurs start et end de la partition primaire : si
   n'importe quelle partition a comme secteurs de dbut et de fin
   respectivement 1 et 63, et comme dernier numro de tte 31, 63, 127 ou
   254, alors,  partir du moment o il est habituel de terminer des
   partitions sur une limite de secteur, et qui plus est depuis que
   l'interface IDE utilise au plus 16 ttes, il est suppos qu'une
   conversion du BIOS est active, et la geomtrie est recartographie
   pour utiliser respectivement 32, 64, 128 ou 255 ttes. Cependant, le
   disque n'est pas recartographi quand la vision actuelle de la
   gomtrie a dj 63 secteurs par piste et au moins autant de ttes
   (cela signifie sans doute qu'il a dj t recartographi).

9. Consquences

   Qu'est-ce que tout cela signifie ? Pour les utilisateurs de Linux
   seulement une chose : qu'ils doivent s'assurer que LILO et fdisk
   utilisent la bonne gomtrie, o `bonne' pour fdisk est dfinie comme
   la gomtrie utilise par les autres systmes d'exploitation sur le
   mme disque dur, et pour LILO comme la gomtrie qui va permettre des
   changes valides avec le BIOS au moment du dmarrage. (En gnral les
   deux vont de pair.)

   Comment fdisk connat-il la gomtrie ? Il demande au noyau en
   utilisant l'ioctl HDIO_GETGEO. Mais l'utilisateur peut passer outre
   ceci en prcisant la gomtrie de manire interactive, ou sur la ligne
   de commande.

   Comment LILO connat-il la gomtrie ? Il demande au noyau en
   utilisant l'ioctl HDIO_GETGEO. Mais l'utilisateur peut passer outre
   ceci en utilisant l'option `disk=' dans le fichier /etc/lilo.conf
   (voyez la page de manuel lilo.conf(5)). On peut galement passer
   l'option linear  LILO, il va alors stocker des adresses LBA  la
   place des CHS dans son fichier `map', et retrouvera la gomtrie 
   utiliser au moment du dmarrage (en utilisant la fonction 8 de INT13
   pour connatre la gomtrie du disque dur).

   Comment le noyau sait-il rpondre ? Et bien, en tout premier lieu,
   l'utilisateur doit avoir spcifi de manire explicite la gomtrie
   avec la commande en ligne du noyau `hda=_cyls_,_ttes_,_secs_' (voyez
   la page de manuel bootparam(7)). Sinon, le noyau devra deviner,
   probablement en se servant des valeurs obtenues  partir du BIOS ou du
   matriel lui-mme.

10. Dtails

10.1 Dtails de l'IDE - les sept gomtries

   Le gestionnaire IDE a cinq sources d'information concernant la
   gomtrie. La premire (G_user) est celle donne par l'utilisateur sur
   la ligne de commande. La deuxime (G_bios) est la `BIOS Fixed Disk
   Parameter Table' - table des paramtres de disque fixe du BIOS - (pour
   le premier et second disque dur seulement) qui est lue au dmarrage du
   systme, avant le passage au mode 32 bits. Les troisime (G_phys) et
   quatrime (G_log) sont donnes par le contrleur IDE en rponse  la
   commande IDENTIFY - ce sont les gomtries `physique' et `logique du
   moment'.

   D'un autre ct, le gestionnaire a besoin de deux valeurs pour la
   gomtrie : d'abord G_fdisk, donne par un ioctl HDIO_GETGEO, et
   ensuite G_used, qui est effectivement utilise pour les
   Entres/Sorties. G_fdisk et G_used sont toutes deux initialises avec
   la valeur de G_user si elle est fournie, avec G_bios quand le CMOS dit
   que cette valeur est prsente, et avec G_phys autrement. Si G_log
   semble vraisemblable, alors G_used est positionne  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 ttes est compris dans l'intervalle 1-16.

   En d'autres termes : la ligne de commande prend le pas sur le BIOS et
   va dterminer ce que va voir fdisk, mais si elle donne une gomtrie
   convertie (avec plus de 16 ttes), alors pour les Entres/Sorties
   qu'effectuera le noyau elle sera elle-mme remplace par les valeurs
   que fournira la commande IDENTIFY.

   Remarquez que G_bios est assez peu fiable : pour des systmes qui
   dmarrent depuis un priphrique SCSI, les premier et second disques
   durs peuvent trs bien tre SCSI ; et la gomtrie que le BIOS aura
   donn pour sda sera utilise par le noyau pour hda. Du reste, les
   disques durs qui ne sont pas dclars dans la configuration du BIOS ne
   sont pas vus par ce dernier. Cela signifie que, par exemple, dans un
   systme uniquement IDE o hdb n'est pas dclar dans la configuration,
   les gomtries rapportes par le BIOS pour les premier et second
   disques vont tre appliques  hda et hdc.

10.2 Dtails pour le SCSI

   La situation pour le SCSI est lgrement diffrente, puisque les
   commandes SCSI utilisent dj les numros de blocks logiques, donc une
   `gomtrie' est compltement hors de propos pour les vritables
   Entres/Sorties. Cependant, le format de la table des partitions est
   toujours le mme, donc fdisk ne fait pas la diffrence entre des
   disques IDE et SCSI. Comme on peut le voir  partir de la description
   dtaille ci-dessus, chaque gestionnaire de disques s'invente une
   gomtrie diffrente. 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 ttes, 32 secteurs par piste (cela a pour effet de
   donner une valeur tout  fait sympathique et commode de 1Mio par
   cylindre), si possible, comme a il n'y aura pas de problme quand
   vous dplacerez le disque dur d'un contrleur  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 systme uniquement Linux d'utiliser
   plus de 8 Gio. C'est un bug.

   Quelle est la vraie gomtrie ? La rponse la plus facile est qu'elle
   n'existe pas. Et si elle existait, vous ne voudriez pas la connatre,
   et  coup sr 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 contrleur SCSI et le disque dur. Laissez-moi le redire :
   seules les personnes stupides donnent  fdisk,  LILO ou au noyau la
   vritable gomtrie d'un disque SCSI.

   Mais si vous tes curieux et que vous insistez, vous devez demander au
   disque dur lui-mme. Il y a l'importante commande READ CAPACITY qui
   donnera la capacit complte 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 ttes (c'est une donne qui ne peut pas tre
   change), et dans la Format Page (page 03) donne le nombre d'octets
   par secteur, et de secteurs par piste. Ce dernier nombre est
   typiquement dpendant du rang, et le nombre de secteurs par piste
   varie - les pistes extrieures ont plus de secteurs que les pistes
   intrieures. Le programme Linux scsiinfo donnera cette information. Il
   y a de nombreux dtails et complications, et il est clair que personne
   (probablement mme pas le systme d'exploitation) ne dsire utiliser
   cette information. Du reste, tant que nous ne nous intressons qu
   fdisk et  LILO, on a typiquement des rponses du style
   C/H/S=4476/27/171 - valeurs qui ne peuvent pas tre utilises par
   fdisk parce que la table des partitions ne rserve 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 ?
   Et bien, soit du contrleur SCSI, soit en faisant une supposition
   claire. Certains gestionnaires de disque semblent croire que nous
   voulons connatre la `ralit', mais bien sr 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 ttes
   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 rle.
   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 rvlent pas la vraie
   taille, et limiteront les utilisateurs de la plupart des versions de
   fdisk  n'avoir accs qu' environ 8 Gio de leur disque - une srieuse
   limitation de nos jours.

   Dans le texte ci-dessous, M reprsente la capacit totale du disque
   dur, et C, H, S, le nombres de cylindres, de ttes et de secteurs par
   piste. Il suffit de donner H, S si l'on voit C comme tant dfini par
   M / (H*S).

   Par dfaut, 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 suprieur  1024, auquel cas
          H=255, S=63, C = min(1023, M/(H*S)). (Comme a C est tronqu,
          et H*S*C n'est pas une approximation de la capacit M du disque
          dur. Ceci va drouter 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 suprieur  1024 ou que,
          encore mieux, l'option du BIOS `> 1 GB' ait t active, auquel
          cas H=255 et S=63.

   _aha1542 :_
          Demande au contrleur lequel des deux schmas 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 dmarrage 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 suprieur  1024 ou que,
          mieux encore, le paramtre de dmarrage "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 mme cas se prsente, le mode de conversion
          tendu est utilis seulement si l'utilisateur le demande au
          travers du paramtre de dmarrage (de ce fait, quand une
          SEEPROM est trouve, le paramtre de dmarrage est ignor).
          Cela signifie qu'une configuration qui fonctionne en 2.0.36
          peut ne pas dmarrer avec un noyau 2.2.6 (LILO ncessite alors
          le mot-cl `linear', ou le noyau a besoin du paramtre
          `aic7xxx=extended' au dmarrage).

   _buslogic :_
          H=64 et S=32  moins que C ne soit suprieur  1024, ou que,
          encore mieux, le mode de conversion tendu ait t autoris au
          niveau du contrleur, auquel cas si M < 2^22 alors H=128,
          S=32 ; sinon H=255, S=63. Cependant, aprs avoir fait ce choix
          pour (C,H,S), la table des partitions est lue, et si pour l'une
          des trois possibilits (H,S) = (64,32), (128,32), (255,63) la
          valeur endH=H-1 est vue quelque part, alors cette paire est
          utilise, et le message "Adopting Geometry from Partition
          Table" ("Adoption de la gomtrie lue dans la table des
          partitions") est affich au dmarrage.

   _fdomain :_
          Il trouve l'information sur la gomtrie dans la Table des
          Paramtres des Disques du BIOS (BIOS Drive Parameter Table), ou
          lit la table des partitions et utilise H=endH+1, S=endS pour la
          premire 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 and u14_34f :_
          Un de ces trois couples de rfrence est utilis ((H,S) =
          (16,63), (64,32), (64,63)) en fonction du mode de cartographie
          du contrleur.

   Si le gestionnaire ne prcise pas la gomtrie, 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
   dcompte des secteurs commence  1.) Plus prcisment, 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 assumant 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)*endS, alors accepter le fait que cette
   partition se termine effectivement sur la frontire 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 suprieur), S =
   M/(1024*H) (arrondi au chiffre suprieur), C = M/(H*S) (arrondi au
   chiffre infrieur). Ceci a pour effet de gnrer un triplet (C,H,S)
   avec C gal  1024 au plus, et S gal  62 au plus.

11. La limite de Linux pour l'IDE  8Gio

   Le gestionnaire IDE de Linux obtient la gomtrie et la capacit d'un
   disque (et beaucoup d'autres choses) en utilisant une requette ATA
   IDENTIFY. Rcemment encore le gestionnaire ne croyait pas en la valeur
   retourne pour lba_capacity si elle tait plus de 10% suprieure  la
   capacit calcule par C*H*S. Cependant, par suite d'un accord entre
   les industriels, les disques IDE de grande capacit donnent les
   valeurs C=16383, H=16 et S=63, pour un total de 16514064 secteurs (7.8
   Go) indpendemment de leur taille relle, mais donnent cette taille
   relle dans lba_capacity.

   Les noyaux rcents de Linux (2.0.34, 2.1.90), savent cela et agissent
   en consquence. Si vous avez un noyau Linux plus ancien et que vous ne
   voulez pas passer  une version plus rcente, et que ce dit noyau ne
   voit que 8 Gio d'un bien plus gros disque dur, alors essayez de
   remplacer la routine lba_capacity_is_ok dans
   /usr/src/linux/drivers/block/ide.c par quelque chose du genre

static int lba_capacity_is_ok (struct hd_driveid *id) {
        id->cyls = id->lba_capacity / (id->heads * id->sectors);
        return 1;
}

   Pour une modification plus sre, voyez le noyau 2.1.90.

11.1 Complications du BIOS

   Comme nous venons de le dire, les gros disques durs donnent la
   gomtrie C=16383, H=16, S=63 indpendamment de leur vraie taille,
   alors que cette dernire est visible par la valeur de LBAcapacity.
   Certains BIOS ne savent pas cela, et convertissent ce 16383/16/63 en
   quelque chose qui a moins de cylindres et plus de ttes, par exemple
   1024/255/63 ou 1027/255/63. Donc, le noyau ne doit pas seulement
   reconnatre la gomtrie particulire 16383/16/63, mais galement
   toutes ses versions mutiles par le BIOS. Depuis le noyau 2.2.2 ceci
   est fait correctement (en prenant la vision du BIOS de H et S, et en
   calculant C = capacit/(H*S)). En gnral, ce problme est rsolu en
   mettant le disque en mode Normal dans la configuration du BIOS (ou,
   encore mieux, a None, ne le dclarant pas du tout au BIOS). Si cela
   est impossible parce que vous devez dmarrer  partir de ce disque
   dur, ou l'utiliser avec DOS/Windows, et que vous n'envisagez pas un
   passage au noyau 2.2.2 ou mieux, utilisez les paramtres de dmarrage
   du noyau.

11.2 Les cavaliers

   Beaucoup de disques durs IBM ont de cavaliers qui vous permettent de
   choisir entre des gomtries  15 ou  16 ttes. Le rglage par dfaut
   vous donnera une gomtrie  16 ttes. Parfois, les deux gomtries
   adressent le mme nombre de secteurs, parfois la version  15 ttes
   est plus petite. Vous devez avoir une bonne raison pour changer cette
   valeur : Petri Kaukasoina a crit : `Un disque dur IBM Deskstar 16 GP
   de 10.1 Go (modle IBM-DTTA-351010) avait ses cavaliers positionns
   pour prsenter 16 ttes par dfaut mais ce vieux PC (avec un AMI BIOS)
   ne dmarrait pas et j'ai eu  modifier les cavaliers pour le faire
   passer en 15 ttes. hdparm -i donne RawCHS=16383/15/63 et
   LBAsects=19807200. J'utilise 20960/15/63 pour avoir la capacit
   totale.' La gomtrie 16383/15/63 n'est pas encore reconnue par le
   noyau, donc des paramtres de dmarrage explicites sont ici
   ncessaires. Pour le positionnement des cavaliers voyez
   http://www.storage.ibm.com/techsup/hddtech/hddtech.htm.

12. La limite  65535 cylindres de Linux

   L'ioctl HDIO_GETGEO retourne le nombre de cylindres dans un short.
   Cela signifie que si vous avez plus de 65535 cylindres, le nombre est
   tronqu, et (pour une configuration SCSI typique avec 1 Mio de
   cylindres) un disque de 80 Gio peut apparatre comme ne faisant que 16
   Gio. Une fois que le problme a t dtect, il est facile de
   l'viter.

13. Partitions tendues et partitions logiques

   Ci-dessus, nous avons vu la structure du MBR (secteur 0) : code du
   programme d'amorage suivi par 4 entres de la table des partitions de
   16 octets chacunes, suivies par une signature AA55. Les entres de la
   table des partitions de type 5 ou F ou 85 (en hexadcimal) ont une
   signification particulire : elles dcrivent les partitions
   _tendues_ : espaces qui seront ultrieurement fractionns en partitions
   _logiques_. (Donc, une partition tendue n'est qu'une bote, et ne
   peut pas tre utilise par elle-mme ; on utilise alors les partitions
   logiques qu'elle contient.) Ce n'est que la position du premier
   secteur de la partition tendue qui est important. Ce premier secteur
   contient une table des partitions avec quatre entres : une est une
   partition logique, une est une partition tendue et deux sont
   inutilises. De cette manire, on obtient une chane de secteurs de
   table des partitions, disperss sur le disque dur, o le premier
   dcrit trois partitions primaires et la partition tendue, et chaque
   secteur de table des partitions qui suit dcrit une partition logique
   et la position du prochain secteur de table des partitions.

   Il est important de comprendre cela : Quand les gens font des btises
   en partitionnant leur disque, ils veulent savoir : `est-ce que mes
   donnes sont toujours l ?' Et la rponse est gnralement : `oui'.
   Mais si des partitions logiques ont t cres, alors les secteurs de
   table des partitions les dcrivant sont crits au dbut des ces
   partitions logiques, et les donnes qui taient initialement  ces
   emplacements sont perdues.

   Le programme sfdisk montre la chane complte. Par exemple,

# sfdisk -l -x /dev/hda

Disk /dev/hda: 16 heads, 63 sectors, 33483 cylinders
Units = cylinders of 516096 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls   #blocks   Id  System
/dev/hda1          0+    101     102-    51376+  83  Linux
/dev/hda2        102    2133    2032   1024128   83  Linux
/dev/hda3       2134   33482   31349  15799896    5  Extended
/dev/hda4          0       -       0         0    0  Empty

/dev/hda5       2134+   6197    4064-  2048224+  83  Linux
    -           6198   10261    4064   2048256    5  Extended
    -           2134    2133       0         0    0  Empty
    -           2134    2133       0         0    0  Empty

/dev/hda6       6198+  10261    4064-  2048224+  83  Linux
    -          10262   16357    6096   3072384    5  Extended
    -           6198    6197       0         0    0  Empty
    -           6198    6197       0         0    0  Empty
...
/dev/hda10     30581+  33482    2902-  1462576+  83  Linux
    -          30581   30580       0         0    0  Empty
    -          30581   30580       0         0    0  Empty
    -          30581   30580       0         0    0  Empty

#

   Il est possible de construire une mauvaise table des partitions.
   Beaucoup de noyaux entrent dans une boucle s'il y a des partitions
   tendues qui pointent sur elles-mmes ou sur une partition place
   avant dans la chane. Il est possible d'avoir deux partitions tendues
   dans un de ces secteurs de table des partitions, comme a la chane de
   la table de partitions se divise.(Ceci peut arriver par exemple avec
   un fdisk qui ne reconnat pas les partitions types 5, F ou 85 comme
   tendues, et qui cre une 5  la suite d'une F.) Des programmes de
   type fdisk non standards peuvent provoquer de telles situations, et
   quelques manipulations sont ncessaires pour les rparer. Le noyau de
   Linux acceptera une division au niveau le plus extrieur. Ainsi, vous
   pouvez avoir deux chanes de partitions logiques. C'est parfois utile
   - par exemple, on peut utiliser pour l'une le type 5 afin qu'elle soit
   vue par DOS, et pour l'autre le type 85, invisible pour DOS, comme a
   DOS FDISK ne plantera pas  cause d'une partition logique au-del du
   cylindre 1024.

14. Rsolution des problmes

   Beaucoup de personnes pensent qu'elles ont des problmes, alors qu'en
   ralit rien ne cloche. Elles peuvent galement penser que leurs
   problmes sont dus  la gomtrie du disque, alors que cela n'a rien 
   voir. Tout ce que nous avons vu ci-dessus peut vous avoir paru
   compliqu, mais matriser le domaine de la gomtrie des disques durs
   est trs facile : ne faites rien du tout, et tout ira bien ; ou
   peut-tre faudra-t-il donner  LILO le mot-cl `linear' s'il ne
   dpasse pas le stade LI au dmarrage. Regardez bien les messages de
   dmarrage du noyau, et souvenez-vous qu'au plus vous tripoterez les
   gomtries (en spcifiant le nombre de ttes et de cylindres  LILO et
    fdisk, et en les passant comme argument au noyau), au moins cela
   aura de chances de fonctionner. En gros, les valeurs par defaut sont
   les bonnes.

   Et souvenez-vous : la gomtrie des disques durs n'est utilise nulle
   par dans Linux, donc les problmes que vous pouvez avoir en vous
   servant de Linux ne sont pas dus  a. En fait, la gomtrie des
   disques durs n'est utilise que par LILO et par fdisk. Donc, si LILO
   ne parvient pas  charger le noyau, a peut tre un problme de
   gomtrie. Si d'autres systmes d'exploitation ne comprennent pas la
   table des partitions, a peut tre un problme de gomtrie. Rien
   d'autre. En particulier, si mount ne semble pas vouloir fonctionner,
   ne vous posez jamais de question sur la gomtrie - le problme est
   ailleurs.

14.1 Problme : Linux invente une fausse gomtrie pour mon disque.

   Il est assez possible qu'un disque dur obtienne une mauvaise
   gomtrie. Le noyau de Linux questionne le BIOS au sujet de hd0 et hd1
   (les disques du BIOS numrots 80H et 81H) et suppose que ces donnes
   sont pour hda et hdb. Mais, sur un systme qui dmarre depuis du SCSI,
   les deux premiers disques peuvent trs bien tre des disques durs
   SCSI, et de ce fait il peut arriver que le cinquime disque, qui est
   hda, c'est--dire le premier disque IDE, se voit assigner une
   gomtrie appartenant  sda. Ceci est facilement rsolu en donnant, au
   dmarrage ou dans le fichier /etc/lilo.conf, les paramtres pour hda
   `hda=C,H,S' avec les valeurs appropries pour C, H et S.

14.2 Faux problme : Des disques identiques ont des gomtries diffrentes ?

   `Je possde deux disques durs IBM identiques de 10 Go. Cependant,
   fdisk donne des tailles diffrentes pour les deux. Voyez :

# fdisk /dev/hdb
Disk /dev/hdb: 255 heads, 63 sectors, 1232 cylinders
Units = cylinders of 16065 * 512 bytes

   Device Boot  Start      End   Blocks   Id  System
/dev/hdb1           1     1232  9896008+  83  Linux native
# fdisk /dev/hdd
Disk /dev/hdd: 16 heads, 63 sectors, 19650 cylinders
Units = cylinders of 1008 * 512 bytes

   Device Boot  Start      End   Blocks   Id  System
/dev/hdd1           1    19650  9903568+  83  Linux native

   Comment cela est-il possible ?

   Que se passe-t-il ici ? Bien, avant tout ces disques sont rellement
   de 10 Giga : hdb a comme taille 255*63*1232*512 = 10133544960, et hdd
   a pour taille 16*63*19650*512 = 10141286400, donc tout va bien, et le
   noyau voit les deux comme des 10 Go. Pourquoi y a-t-il cette
   diffrence de taille ? C'est parce que le noyau obtient ses donnes du
   BIOS pour les deux premiers disques IDE, et le BIOS a recartographi
   hdb pour qu'il ait 255 ttes (et 16*19650/255=1232 cylindres).
   L'arondi infrieur cote ici au moins 8 Mo.

   Si vous voulez recartographier hdd de la mme manire, donnez au noyau
   l'option de dmarrage `hdd=1232,255,63'.

14.3 Faux problme : fdisk voit beaucoup plus d'espace que df ?

   fdisk vous donnera le nombre de blocs qu'il y a sur le disque dur. Si
   vous avez cr un systme de fichier sur le disque, disons avec
   mke2fs, alors ce systme de fichier a besoin d'un peu de place pour sa
   comptabilit - typiquement quelque chose comme 4% de la taille du
   systme de fichier, un peu plus si vous demandez beaucoup de inodes 
   mke2fs. Par exemple :

# sfdisk -s /dev/hda9
4095976
# mke2fs -i 1024 /dev/hda9
mke2fs 1.12, 9-Jul-98 for EXT2 FS 0.5b, 95/08/09
...
204798 blocks (5.00%) reserved for the super user
...
# mount /dev/hda9 /quelque/part
# df /quelque/part
Filesystem         1024-blocks  Used Available Capacity Mounted on
/dev/hda9            3574475      13  3369664      0%   /mnt
# df -i /quelque/part
Filesystem           Inodes   IUsed   IFree  %IUsed Mounted on
/dev/hda9            4096000      11 4095989     0%  /mnt
#

   Nous avons une partition de 4095976 blocs, crez sur cette dernire un
   systme de fichier ext2, montez-la quelque part, et remarquez qu'elle
   n'a que 3574475 blocs - 521501 blocs (12%) ont t perdus en inodes et
   autres pour de la comptabilit. Remarquez que la diffrence entre le
   total de 3574475 blocs et les 3369664 disponibles pour l'utilisateur
   est gale aux 13 blocs utiliss plus les 204798 blocs rservs  root.
   Cette dernire valeur peut tre change  l'aide de tune2fs. Ce `-i
   1024' n'est raisonnable que dans le cadre d'un spoule de forums
   d'utilisateurs ou quelque chose du mme style, avec normement de
   petits fichiers. Par dfaut on mettrait :

# mke2fs /dev/hda9
# mount /dev/hda9 /quelque/part
# df /quelque/part
Filesystem         1024-blocks  Used Available Capacity Mounted on
/dev/hda9            3958475      13  3753664      0%   /mnt
# df -i /quelque/part
Filesystem           Inodes   IUsed   IFree  %IUsed Mounted on
/dev/hda9            1024000      11 1023989     0%  /mnt
#

   A prsent, seulement 137501 blocs (3,3%) sont utiliss pour les
   inodes, comme cela, nous disposons de 384 Mo de plus qu'avant.
   (Apparemment, chaque inode occupe 128 octets.) D'un autre ct, ce
   systme de fichier peut avoir au plus 1024000 fichiers (plus
   qu'assez), contre 4096000 (trop) auparavant.
