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_.)--) 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 hd=,,. 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 patl@lcs.mit.edu .