  Mini-HOWTO Gros IDE
  Ou comment utiliser ces gros hideux sous Linux et DOS
  Patrick  LoPresti,  patl@lcs.mit.edu,  version francaise par
  Herve Mignot
  v1.1, 19 Janvier 1995.

  Les noyaux des versions de Linux ulterieures a la  version  1.1.40  de
  Linux  gerent sans aucune difficulte de gros disques IDE (c'est-a-dire
  comportant plus de 1024 cylindres). Toutefois, de nombreuses distribu-
  tions  utilisent  des versions de noyau plus anciennes sur leur disque
  d'installation, et ce Mini-HOWTO peut donc  vous  etre  utile  (--  Il
  servira surtout aux personnes utilisant conjointement Linux et MS-DOS,
  sur une meme machine. En effet, si le BIOS de cette machine n'est  pas
  un BIOS EIDE, il est necessaire de proceder comme decrit dans ce mini-
  HOWTO pour permettre une cohabitation  tranquille  des  deux  systemes
  d'exploitation.  (_N_._D_._T_.)--)

  11..  IInnttrroodduuccttiioonn

  Il  est  possible d'utiliser Linux avec de gros disques durs EIDE sans
  aucune restriction. Seuls les cas de DOS et Linux seront abordes  dans
  ce document, mais je pense que l'approche presentee ici est utilisable
  avec tout autre systeme d'exploitation.

  J'utilise actuellement la version 1.0.9 du noyau, mais tout ce qui est
  dit  ici  s'applique  pareillement  jusqu'a  la  version  1.1.34.  Les
  versions ulterieures de Linux gerent completement les disques EIDE, ce
  qui  reduit l'interet de tout ce qui suit. Je pense toutefois que cela
  continuera de fonctionner avec les versions de noyau a venir, meme  si
  cela devient inutile.

  22..  UUnn ppeeuu ddee tteecchhnniiqquuee eett ddee tteerrmmiinnoollooggiiee

  Les  secteurs  des  disques  ATA  (IDE) comportent 512 octets. On peut
  adresser un secteur de deux manieres : par son adresse  logique  (_L_B_A_,
  _L_o_g_i_c_a_l _B_l_o_c_k _A_d_d_r_e_s_s), qui est un numero compris entre 0 et le nombre
  total de secteurs du disque, ou par son adresse physique  qui  est  un
  triplet   cylindre-tete-secteur   (_C_H_S_,   _C_y_l_i_n_d_e_r_-_H_e_a_d_-_S_e_c_t_o_r).  Pour
  convertir  des  adresses  logiques  en  adresses  physiques,  il   est
  necessaire de connaitre la _g_e_o_m_e_t_r_i_e _d_u _d_i_s_q_u_e, c'est-a-dire le nombre
  de tetes par cylindre, le nombre de secteurs par tete et le nombre  de
  cylindres  qu'il  comporte.   Ces  informations  permettent  aussi  de
  calculer la taille du disque.

  Les anciens controleurs et les vieux BIOS ne permettent d'utiliser que
  l'adresse  physique  pour adresser un secteur. Tous les controleurs et
  tous les BIOS permettent d'utiliser l'adresse physique pour reperer un
  secteur.   Linux  manipule  le  plus  souvent  possible  des  adresses
  logiques, sauf au plus bas niveau, ou il effectue  une  conversion  de
  ces  adresses en adresses physiques pour dialoguer avec le controleur.
  Linux n'utilise pas le BIOS pour tout cela, sauf  pour  determiner  la
  geometrie du disque.

  La  table  des partitions contient les adresses de debut et de fin des
  partitions sous forme logique ET physique. _f_d_i_s_k  sous  DOS  et  _f_d_i_s_k
  sous  Linux  s'attendent  bien  sur  a  ce  que les deux formes soient
  coherentes entre elles pour chaque partition.  _f_d_i_s_k sous DOS  demande
  au  BIOS  la  geometrie  du  disque, et _f_d_i_s_k sous Linux la demande au
  noyau.
  C'est ici que les  choses  se  corsent.  MS-DOS  et  l'interface  BIOS
  utilisent  un  champ de dix bits pour stocker les numeros de cylindre,
  ne permettant d'utiliser que des numeros compris entre 0 et  1023,  ce
  qui  est  tout  a  fait  insuffisant  pour  les  disques  modernes qui
  comportent habituellement 63 secteurs par tete, 16 tetes par cylindre,
  et  un  tres  grand  nombre de cylindres (_N_._D_._T_. plus de 2 000 pour un
  disque de 1 Go). La solution pour pouvoir exploiter  ces  disques,  en
  depit  de  cette  limitation  est une bidouille : un BIOS EIDE ment au
  sujet de la geometrie du disque en divisant par deux (ou  par  quatre)
  le nombre de cylindres et en doublant (respectivement, en quadruplant)
  le nombre de tetes. Quand une requete comportant une adresse  physique
  lui arrive, le BIOS considerera que cette requete utilise la geometrie
  bidon et la convertira pour dialoguer avec le controleur du disque. Ce
  mecanisme est appele une _c_o_n_v_e_r_s_i_o_n _d_'_a_d_r_e_s_s_e.

  33..  LLee pprroobblleemmee

  Quand  le  noyau  Linux  demande au BIOS la geometrie du disque (il se
  contente en fait de  lire  les  parametres  CMOS),  il  obtiendra  une
  reponse  erronee  indiquant  qu'il y a plus de seize tetes. Mais Linux
  sait que cela n'est pas possible,  et  le  noyau  (source  dans  hd.c)
  abandonne  et  ignore  le disque. (Notons que meme si le BIOS retourne
  une geometrie trafiquee, les requetes faites au controleur  de  disque
  doivent  se  faire  conformement  a  la  geometrie  reelle  du disque.
  Eliminer le test effectue dans hd.c ne suffit donc pas.)

  33..11..  LLaa mmaauuvvaaiissee ssoolluuttiioonn

  Une solution est d'utiliser le programme  de  parametrage  (_s_e_t_u_p)  du
  BIOS pour supprimer completement la conversion d'adresse. On peut soit
  fixer soi-meme le nombre de cylindres/tetes/secteurs conformement a la
  geometrie  du  disque, soit simplement inhiber la conversion d'adresse
  selon ce que permet son programme de parametrage du BIOS.

  Vous pouvez alors repartitionner votre disque dur avec _f_d_i_s_k sous  DOS
  et/ou  sous  Linux,  puis  installer les deux systemes d'exploitation.
  Cela fonctionnera sous reserve d'observer les restrictions  suivantes.

  Le  probleme  reste  que le BIOS ne peut etre utilise pour acceder aux
  cylindres au-dela du 1024-ieme. Toutes vos partitions DOS devront donc
  se situer avant cette limite, ainsi que toutes informations auxquelles
  le BIOS aura besoin d'acceder.  Ainsi, LILO utilise le BIOS pour faire
  le  sale  boulot  et  donc,  si  vous voulez utiliser LILO pour lancer
  Linux, vous devez vous assurer que le noyau (plus precisement toute la
  partition  racine)  se  situe avant cette limite du 1024-ieme secteur.
  Linux, lui, accedera sans probleme a l'integralite du disque.

  33..22..  LLaa bboonnnnee ssoolluuttiioonn

  Les limitations sont toujours  genantes,  et  nous  allons  donc  nous
  debrouiller  pour les eviter. Nous devons donc continuer a utiliser le
  mecanisme de conversion d'adresses et resoudre  chacun  des  problemes
  que cela engendre.

  Pour  resoudre  le  probleme au niveau du noyau, nous allons passer en
  parametre la veritable geometrie au noyau grace a une  ligne  d'option
  au demarrage. Ceci peut se faire a partir de l'invite d'initialisation
  de        LILO,         en         tapant         <image         name>
  hd=<nb.  cylindres>,<nb. tete>,<nb. secteurs>.  On peut aussi utiliser
  un ordre append= dans le fichier de configuration de LILO  (_l_i_l_o_._c_o_n_f)
  pour que cela se fasse automatiquement.

  Le  noyau  peut  maintenant  reconnaitre  et  utiliser le disque, mais
  lorsqu'un  programme  utilisateur  (comme  _f_d_i_s_k   ou   le   programme
  d'installation  de  LILO)  demande au noyau la geometrie du disque, le
  noyau lui renvoie la  vraie  geometrie  et  non  celle  obtenue  apres
  conversion. Et donc _f_d_i_s_k sous Linux (qui interroge le noyau) et _f_d_i_s_k
  sous DOS (qui interroge le BIOS) n'utilisent pas la meme geometrie, ce
  qui  est tres genant au niveau des informations a placer dans la table
  des partitions du disque dur.  De meme, le programme d'installation de
  LILO  calculera  des  adresses physiques incompatibles avec ce dont le
  BIOS (donc LILO lors du demarrage) a besoin.

  Le probleme avec _f_d_i_s_k est simple a resoudre  :  lorsque  vous  lancez
  _f_d_i_s_k  sous  Linux,  passez  en  mode  expert,  et  fixez le nombre de
  cylindres/tetes/secteurs aux valeurs utilisables  par  le  BIOS.  Puis
  editez  votre  table des partitions et ecrivez-la, _f_d_i_s_k sous Linux et
  sous DOS seront ainsi d'accord.

  Le probleme de LILO est aussi simple  a  resoudre  :  ajouter  l'ordre
  linear  a  votre  fichier _l_i_l_o_._c_o_n_f. LILO utilisera alors des adresses
  logiques et non des adresses physiques, l'obligeant ainsi  a  calculer
  les  adresses  physiques au demarrage et non lors de son installation.
  C'est donc la geometrie fournie par le BIOS qui sera utilisee,  plutot
  que celle fournie par le noyau, et ainsi tout fonctionnera.

  33..33..  EExxeemmppllee rreessuummee

  Nous disposons d'un disque EIDE d'un giga-octet sur lequel nous allons
  installer Linux. Voici comment proceder.

  1. Noter au niveau du programme de  parametrage  (_s_e_t_u_p)  du  BIOS  la
     geometrie  trafiquee  du disque. Par exemple, il est indique que le
     disque comporte 525 cylindres, 64 tetes, et 63 secteurs.  Comme  il
     n'est  pas  possible qu'il y ait plus de seize tetes sur ce disque,
     on en deduit qu'il comporte en fait 2100 cylindres, 16 tetes et  63
     secteurs.

  2. Demarrer sous DOS, lancer fdisk pour creer une partition DOS.

  3. A  partir  d'une  disquette  de  demarrage  de  la Slackware, taper
     ramdisk hd=2100,16,63 avant le lancement du  chargement  du  noyau.
     Puis  lancer  fdisk  (sous Linux). Si on tape p, un tas de messages
     d'erreur apparait.  Passer en mode expert x,  fixer  le  nombre  de
     cylindres  a  525, le nombre de tetes a 64. Une fois revenu en mode
     normal, si on tape p pour voir la liste des partitions,  il  n'y  a
     plus  d'erreur. Il est alors possible creer ses partitions.  Ecrire
     la table, puis redemarrer avec la disquette de la Slackware (il est
     conseille de redemarrer la machine apres avoir modifie la table des
     partitions).

  4. Proceder ensuite a l'installation de la Slackware, normalement,  en
     creant (entre autres) un fichier lilo.conf classique.

  5. Editer le fichier lilo.conf (dans ce cas /mnt/etc/lilo.conf) pour y
     ajouter les lignes suivantes au debut :

     append="hd=2100,16,63"
     linear

  6. Lancer la commande lilo -r /mnt.

  7. Installer, eventuellement,  si  c'est  absolument  necessaire,  DOS
     et/ou Windows.

  Bonne chance a tous !

       Patrick LoPresti

       patl@lcs.mit.edu

