Wat betekent dit allemaal? Voor Linux gebruikers slechts één ding:
dat ze ervoor moeten zorgen dat LILO en fdisk
de juiste
geometrie gebruiken waar met `juist' voor fdisk
de gebruikte
geometrie wordt bedoeld die door andere besturingssystemen op dezelfde
disk worden gebruikt, en voor LILO de geometrie die tijdens het opstarten
een succesvolle interactie met de BIOS activeert.
(Gewoonlijk komen deze twee overeen.)
Hoe weet fdisk
van de geometrie?
Het vraagt het de kernel, door gebruik te maken van de HDIO_GETGEO
ioctl.
Maar de gebruiker kan de geometrie interactief of op de opdrachtregel
overschrijven.
Hoe weet LILO van de geometrie?
Het vraagt het de kernel, door gebruik te maken van de HDIO_GETGEO
ioctl.
Maar de gebruiker kan de geometrie overschrijven door gebruik te maken van de
`disk=
' optie in /etc/lilo.conf
(zie lilo.conf(5)).
Men kan ook de linear
optie aan LILO opgeven, en het zal LBA
adressen in zijn mapbestand opslaan in plaats van CHS adressen,
en de te gebruiken geometrie tijdens het booten uitzoeken (door de
INT 13 Functie 8 gebruiken om te vragen naar de geometrie).
Hoe weet de kernel wat te antwoorden?
Als eerste kan de gebruiker een expliciete geometrie hebben opgegeven met
een `hda=
cyls,
heads,
secs'
kernel opdrachtregeloptie (zie bootparam(7)), misschien handmatig, of door
de bootloader te vragen een dergelijke optie aan de kernel te leveren.
En anders zal de kernel ernaar raden, waarschijnlijk door waarden te verkrijgen
van de BIOS of de hardware.
Het is (sinds Linux 2.1.79) mogelijk de ideeën van de kernel
over de geometrie te wijzigen door gebruik te maken van het
/proc
bestandssysteem.
Bijvoorbeeld
# 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
#
Soms is het handig een bepaalde geometrie te forceren door
op de kernel opdrachtregel
`hda=
cyls,
heads,
secs' toe te voegen.
Men wil bijna altijd secs=63,
en het doel van deze toevoeging is de heads te specificeren.
(Tegenwoordig zijn redelijke waarden heads=16 en heads=255.)
Wat zou men voor cyls op moeten geven? Precies dat aantal dat
de juiste totale capaciteit van C*H*S sectoren oplevert.
Voor een drive met bijvoorbeeld 71346240 sectoren (36529274880 bytes)
zou men C kunnen berekenen als 71346240/(255*63)=4441 (bijvoorbeeld met
behulp van het programma bc
), en als bootparamter hdc=4441,255,63
op kunnen geven.
Hoe weet men wat de juiste totale capaciteit is? Bijvoorbeeld,
# 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
geeft twee manieren waarop het totaal aantal sectoren van 71346240 kan
worden gevonden.
De kerneluitvoer
# dmesg | grep hdc
...
hdc: Maxtor 93652U8, 34837MB w/2048kB Cache, CHS=70780/16/63
hdc: [PTBL] [4441/255/63] hdc1 hdc2 hdc3! hdc4 < hdc5 > ...
vertelt ons over (op z'n minst) 34837*2048=71346176 en over (op z'n minst)
70780*16*63=71346240 sectoren. In dit geval blijkt de tweede waarde exact
correct te zijn, maar in het algemeen zijn beiden mogelijk naar beneden
afgerond. Dit is een goede manier om de diskgrootte te benaderen wanneer
hdparm
niet beschikbaar is.
Geef nooit een te grote waarde op voor cyls!
In het geval van SCSI-disks wordt het precieze aantal sectoren gegeven in
de kernel bootmeldingen:
SCSI device sda: hdwr sector= 512 bytes. Sectors= 17755792 [8669 MB] [8.7 GB]
(en MB, GB zijn naar afgerond, niet naar beneden afgerond, en `binary').