Mini-HOWTO Gros IDE
 Ou comment utiliser ces gros hideux sous Linux et DOS
 Patrick  LoPresti,  [email protected],  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_.)--)

 11..  IInnttrroodduuccttiioonn

 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.

 22..  UUnn ppeeuu ddee tteecchhnniiqquuee eett ddee tteerrmmiinnoollooggiiee

 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.

 33..  LLee pprroobblleemmee

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

 33..11..  LLaa mmaauuvvaaiissee ssoolluuttiioonn

 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.

 33..22..  LLaa bboonnnnee ssoolluuttiioonn

 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.

 33..33..  EExxeemmppllee rreessuummee

 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

      [email protected]