  HOWTO - Disques de grande capacit
  Andries Brouwer, aeb@cwi.nl, version franaise par Xavier
  Serpaggi, xavier.serpaggi@libertysurf.fr
  v2.2d, 12 septembre 1999

  Tout sur la gomtrie des disques durs et la limite des 1024 cylin
  dres.

  11..  EEnnoonncc dduu pprroobbllmmee

  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.  Cela 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. Cela 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2..  RRssuumm

  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 _p_a_s 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3..  UUnniittss eett ttaaiilllleess

  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.  Cela
  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3..11..  TTaaiillllee dd''uunn sseecctteeuurr

  Dans le cadre de ce texte, un secteur a une taille de 512 octets.
  Cela 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3..22..  TTaaiillllee dd''uunn ddiissqquuee

  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4..  AAccccss  uunn ddiissqquuee dduurr

  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 _g__o_m__t_r_i_e, c'est--dire les valeurs de
  C, H et S.


  44..11..  AAccccss ddiissqquueess dduu BBIIOOSS eett llaa lliimmiittee ddeess 11002244 ccyylliinnddrreess

  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). Cela 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. Cela 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4..22..  HHiissttooiirree dduu BBIIOOSS eett ddeess lliimmiitteess ddee ll''IIDDEE


     SSppcciiffiiccaattiioonn AATTAA ((ppoouurr lleess ddiissqquueess dduurrss IIDDEE)) -- llaa lliimmiittee ddeess 113377
        GGoo
        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.


     BBIIOOSS IInntt 1133 -- llaa lliimmiittee ddeess 88,,55 GGoo
        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, cela est une srieuse limitation. Cela
        signifie que DOS ne peut utiliser les actuels disques de grande
        capacit.


     LLaa lliimmiittee ddeess 552288 MMoo
        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.  Cela 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.


     LLaa lliimmiittee ddeess 22,,11 GGoo ((aavvrriill 11999966))
        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. Cela 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.


     LLaa lliimmiittee ddeess 33,,22 GGoo
        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.


     LLaa lliimmiittee ddeess 44,,22 GGoo ((ffvvrriieerr 11999977))
        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.


     LLaa lliimmiittee ddeess 77,,99 GGoo
        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 qu'une fausse gomtrie comportant 240 ttes
        soit obtenue, valable jusqu' une taille de
        1024*240*63*512=7927234560 octets.


     LLaa lliimmiittee ddeess 88,,44 GGoo

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


     LLaa lliimmiittee ddeess 3333,,88 GGoo ((AAoott 11999999))
        Le prochain obstacle se prsente avec une taille de 33,8 Go.  Le
        problme est qu'avec les 16 ttes et les 63 secteurs/piste par
        dfaut, a donne un nombre de cylindres suprieur  65535, qui
        ne rentre pas dans un short. Peut-tre qu'aucun BIOS actuel
        n'est capable de supporter de tels disques durs. Linux a encore
        besoin d'un patch.

  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5..  DDmmaarrrraaggee

  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 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5..11..  LLIILLOO eett ll''ooppttiioonn ``lliinneeaarr''

  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'informations 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 cela 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5..22..  11002244 ccyylliinnddrreess ccee nn''eesstt ppaass 11002244 ccyylliinnddrreess

  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 1 Mio = 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6..  GGoommttrriiee dduu ddiissqquuee dduurr,, ppaarrttiittiioonnss eett ``oovveerrllaapp''

  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 _t_a_b_l_e _d_e_s _p_a_r_t_i_t_i_o_n_s 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 fichiers 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 cela 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7..  CCoonnvveerrssiioonn eett GGeessttiioonnnnaaiirreess ddee DDiissqquueess DDuurrss

  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.  Cela 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8..  CCoonnvveerrssiioonnss dduu nnooyyaauu ppoouurr lleess ddiissqquueess dduurrss IIDDEE

  Si le noyau de Linux dtecte la prsence d'un 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=_c_y_l_s,_t__t_e_s,_s_e_c_s' 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8..11..  EEZZDD

  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8..22..  DDMM66 :: DDDDOO

  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8..33..  DDMM66 :: AAUUXX

  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8..44..  DDMM66 :: MMBBRR

  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8..55..  PPTTBBLL

  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9..  CCoonnssqquueenncceess

  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
  cela 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
  cela 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 ?  Eh bien, en tout premier lieu,
  l'utilisateur doit avoir spcifi de manire explicite la gomtrie
  avec la commande en ligne du noyau `hda=_c_y_l_s,_t__t_e_s,_s_e_c_s' (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.


  1100..  DDttaaiillss


  1100..11..  DDttaaiillss ddee ll''IIDDEE -- lleess sseepptt ggoommttrriieess

  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.


  1100..22..  DDttaaiillss ppoouurr llee SSCCSSII

  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 1 Mio 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 ?
  Eh 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.


     aahhaa11774400,, ddttcc,, gg__NNCCRR55338800,, tt112288,, wwdd77000000 ::
        H=64, S=32.


     aahhaa115522xx,, ppaass1166,, ppppaa,, qqllooggiiccffaass,, qqllooggiicciisspp ::
        H=64, S=32  moins que C ne soit suprieur  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 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.
     aaddvvaannssyyss ::
        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.


     aahhaa11554422 ::
        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")


     aaiicc77xxxxxx ::
        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).


     bbuussllooggiicc ::
        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.


     ffddoommaaiinn ::
        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.


     iinn22000000 ::
        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.


     sseeaaggaattee ::
        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.


     uullttrraassttoorr eett uu1144__3344ff ::
        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 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)*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).  Cela a pour effet de gnrer un triplet (C,H,S)
  avec C gal  1024 au plus, et S gal  62 au plus.


  1111..  LLiimmiittee ddee LLiinnuuxx ppoouurr ll''IIDDEE  88 GGiioo

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


  1111..11..  CCoommpplliiccaattiioonnss dduu BBIIOOSS

  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 cela
  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,  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.

  Si un BIOS rapporte 16320/16/63, c'est en gnral pour pouvoir aboutir
   1024/255/63 aprs conversion.


  1111..22..  DDeess ccaavvaalliieerrss ppoouurr sslleeccttiioonnnneerr llee nnoommbbrree ddee tttteess

  Beaucoup de disques durs IBM ont des 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.


  1111..33..  DDeess ccaavvaalliieerrss ppoouurr ffiixxeerr llaa ccaappaacciitt ttoottaallee

  De nombreux disques durs IBM ont des cavaliers qui vous permettent de
  faire apparatre leur taille infrieure  leur valeur relle.  C'est
  une btise que de le faire, et probablement aucun utilisateur de Linux
  ne voudra utiliser cette fonctionnalit, mais certains BIOS plantent
  avec de gros disques. En gnral la solution consiste  conserver le
  disque entirement en dehors du contrle du BIOS. Cela n'est faisable
  que si ce disque dur n'est pas votre disque de dmarrage.

  Par exemple, un disque dur Deskstar de 25 Go (DJNA-352500) a des
  cavaliers qui peuvent tre positionns pour qu'il apparaisse comme
  ayant une capacit de 2 Go.  Quel gaspillage !

  Une limite plus rcente est celle des 33,8 Go. Linux aussi a besoin
  d'une modification pour tre capable de grer des disques durs aussi
  grands que cela. Des disques durs avec une capacit suprieure 
  celle-l, comme le Deskstar de 37,5 Go (DPTA-353750) ont des cavaliers
  qui peuvent tre positionns pour qu'ils prsentent une taille de
  33,8 Go. Vous pouvez galement regarder la page sur la limite de
  33,8 Go du BIOS.



  1122..  LLiimmiittee ddee LLiinnuuxx  6655553355 ccyylliinnddrreess

  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.


  1122..11..  PPrroobbllmmeess ddee ll''IIDDEE aavveecc ddeess ddiissqquueess dduurrss ddee 3344 GGoo eett pplluuss

  Des units avec une taille suprieure  33,8 Go ne fonctionneront pas
  avec les noyaux rcents. Les dtails sont les suivants.  Supposez que
  vous ayez achet un tout nouveau disque dur IBM-DPTA-373420 qui offre
  une capacit de 66835440 secteurs (34,2 Go). Les noyaux rcents vous
  diront que la taille est de 769*16*63 = 775152 secteurs (0,4 Go), ce
  qui est quelque peu tonnant. Et le fait de donner les paramtres
  hdc=4160,255,63 au dmarrage n'aide en rien -- ils sont tout
  simplement ignors.  Que se passe-t-il ? La routine idedisk_setup()
  retrouve la gomtrie rapporte par le disque dur (qui est
  16383/16/63) et crase ce que l'utilisateur avait demand sur la ligne
  de commande, de telle manire que les donnes de l'utilisateur ne sont
  utilises que pour la gomtrie du BIOS. La routine current_capacity()
  ou idedisk_capacity() recalcule le nombre de cylindres comme tant
  66835440/(16*63)=66305 mais comme il est stock dans un short, il
  devient 769. Comme lba_capacity_is_ok() a dtruit id->cyls, tous les
  appels se solderont par un chec, et la capacit du disque deviendra
  769*16*63.  Un patch est disponible -- il fera probablement bientt
  partie intgrante d'un noyau officiel.


  1133..  PPaarrttiittiioonnss tteenndduueess eett ppaarrttiittiioonnss llooggiiqquueess

  ``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 chacune, 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 __t_e_n_d_u_e_s :
  espaces qui seront ultrieurement fractionns en partitions _l_o_g_i_q_u_e_s.
  (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, de sorte que la
  chane de la table de partitions se divise. (Cela 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, ainsi DOS FDISK ne plantera pas  cause d'une
  partition logique au-del du cylindre 1024.



  1144..  RRssoolluuttiioonn ddeess pprroobbllmmeess

  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 que 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), 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
  part 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, ce peut tre un problme de
  gomtrie. Si d'autres systmes d'exploitation ne comprennent pas la
  table des partitions, ce 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.


  1144..11..  PPrroobbllmmee :: LLiinnuuxx iinnvveennttee uunnee ffaauussssee ggoommttrriiee ppoouurr mmoonn ddiissqquuee..

  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 voie assigner une
  gomtrie appartenant  sda. Cela 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.



  1144..22..  FFaauuxx pprroobbllmmee :: DDeess ddiissqquueess iiddeennttiiqquueess oonntt ddeess ggoommttrriieess
  ddiiffffrreenntteess ??

  `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 ? Eh 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'.



  1144..33..  FFaauuxx pprroobbllmmee :: ffddiisskk  vvooiitt bbeeaauuccoouupp pplluuss dd''eessppaaccee qquuee ddff ??

  fdisk vous donnera le nombre de blocs qu'il y a sur le disque dur. Si
  vous avez cr un systme de fichiers sur le disque, disons avec
  mke2fs, alors ce systme de fichiers 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 d'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 fichiers 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'utilisa
  teur 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 fichiers peut avoir au plus 1024000 fichiers (plus
  qu'assez), contre 4096000 (trop) auparavant.







