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
géométrie, où `bonne' pour fdisk
est définie comme la géométrie utilisée par
les autres systèmes d'exploitation sur le même disque dur, et pour LILO
comme la géométrie qui va permettre des échanges valides avec le BIOS au
moment du démarrage. (En général les deux vont de pair.)
Comment fdisk
connaît-il la géométrie ?
Il demande au noyau en utilisant l'ioctl HDIO_GETGEO
.
Mais l'utilisateur peut passer outre cela en précisant la géométrie de manière
interactive, ou sur la ligne de commande.
Comment LILO connaît-il la géométrie ?
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
géométrie à utiliser au moment du démarrage (en utilisant la fonction 8 de INT13
pour connaître la géométrie du disque dur).
Comment le noyau sait-il répondre ?
Eh bien, en tout premier lieu, l'utilisateur doit avoir spécifié de manière
explicite, soit à la main soit par l'intermédiaire du chargeur d'amorce, la géométrie
avec la commande en ligne du noyau `hda=
cyls,
têtes,
secs'
(voyez la page de manuel bootparam(7)).
Par exemple, vous pouvez demander à LILO de fournir une telle option en ajoutant une ligne
`append = "hda=
cyls,
têtes,
secs"
' dans le fichier /etc/lilo.conf
(voyez la page de manuel de lilo.conf(5)).
Sinon, le noyau devra deviner, probablement en se servant des valeurs obtenues à
partir du BIOS ou du matériel lui-même.
Il est possible (depuis Linux 2.1.79) de changer l'idée qu'a le noyau de la géométrie en utilisant le
système de fichiers /proc
.
Par exemple :
# sfdisk -g /dev/hdc
/dev/hdc: 4441 cylinders, 255 heads, 63 sectors/track
# cd /proc/ide/ide1/hdc
# echo bios_cyl:17418 bios_head:128 bios_sect:32 > settings
# sfdisk -g /dev/hdc
/dev/hdc: 17418 cylinders, 128 heads, 32 sectors/track
#
Parfois il est utile de forcer une certaine géométrie en ajoutant `hda=
cyls,
têtes,
secs'
à la ligne de commande du noyau. On voudra pratiquement toujours secs=63, et le but recherché en ajoutant cela
est de spécifier têtes. (Des valeurs raisonnables de nos jours sont têtes=16 et têtes=255.)
Que devra-t-on mettre pour cyls ? Précisément le nombre qui donnera la bonne capacité totale de C*H*S secteurs.
Par exemple, pour un disque dur avec 71346240 secteurs (36529274880 octets) on calculera C comme étant
71346240/(255*63)=4441 (par exemple en utilisant le programme bc
), et on donnera le paramètre de démarrage
hdc=4441,255,63
.
Comment connaît-on la capacité totale exacte ? Par exemple,
# hdparm -g /dev/hdc | grep sectors
geometry = 4441/255/63, sectors = 71346240, start = 0
# hdparm -i /dev/hdc | grep LBAsects
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=71346240
donne deux manières de trouver le nombre total de secteurs 71346240.
Le message du noyau
# dmesg | grep hdc
...
hdc: Maxtor 93652U8, 34837MB w/2048kB Cache, CHS=70780/16/63
hdc: [PTBL] [4441/255/63] hdc1 hdc2 hdc3! hdc4 < hdc5 > ...
nous donne (au moins) 34837*2048=71346176 et (au moins) 70780*16*63=71346240 secteurs.
Dans ce cas c'est la seconde valeur qui apparaît comme correcte, mais en général les deux
peuvent être arrondies à des valeurs inférieures.
C'est une bonne façon d'approximer la taille du disque dur quand hdparm
n'est pas disponible.
Ne donnez jamais une valeur trop grande à cyls
!
Dans le cas de disques durs SCSI, le nombre précis de secteurs est donné dans les messages de démarrage
du noyau :
SCSI device sda: hdwr sector= 512 bytes. Sectors= 17755792 [8669 MB] [8.7 GB]
(et Mo, Go sont arrondis, pas arrondis à la valeur inférieure, et `binaires').