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]