Cosa significa tutto ciò? Per gli utenti Linux una sola cosa:
che devono verificare che LILO e fdisk
utilizzino la geometria corretta.
Per fdisk
la geometria `corretta' è quella utilizzata dagli altri sistemi operativi
installati sullo stesso disco mentre per LILO è quella che permette
un'interazione senza errori con il BIOS in fase di inizializzazione (di solito i due aspetti coincidono).
Come rileva la geometria fdisk
? Interroga il kernel, utilizzando la funzione
ioctl.h HDIO_GETGEO
. L'utente è tuttavia in grado di forzare
la geometria in modo interattivo o da linea di comando.
Come rileva la geometria LILO?
Interroga il kernel utilizzando la ioctl HDIO_GETGEO
.
Tuttavia l'utente può forzare la geometria utilizzando l'opzione `disk=
'
nel file /etc/lilo.conf
(cfr lilo.conf(5)).
È possibile fornire a LILO l'opzione linear
in modo da memorizzare
nella mappa dei file i valori della LBA invece dei CHS e recupererà la geometria da utilizzare
in fase di avvio mediante la funzione 8 dell'INT 13 per richiedere la geometria del disco.
Com'è in grado di rispondere il kernel?
Bene, prima di tutto, l'utente può aver specificato una geometria esplicita
fornendo le opzioni `hda=
cyls,
heads,
secs'
al kernel da riga di comando (cfr. bootparam(7)),
probabilmtente di persona od indicando al "boot loader" di fornire tali valori al kernel.
Per esempio, si può indicare a LILO di fornire tali informazioni opzionali aggiungendo
una riga del tipo `append = "hda=
cyls,
heads,
secs"
'
in /etc/lilo.conf
(cfr. lilo.conf(5)).
D'altrocanto il kernel è in grado di congetturare una geometria utilizzando
possibilmente i valori ottenuti dal BIOS o dai dispositivi hardware.
È possibile (a partire dalla versione 2.1.79) cambiare i valori della
geometria congetturata da kernel utilizzando il filesystem /proc
.
Per esempio:
# 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
#
Qualche volta è utile impostare una precisa geometria da riga di comando:
`hda=
cyls,
heads,
secs'.
Quasi sempre si vuole un valore di secs=63, lo scopo di fornire tale valore è quello di
specificare il valore heads
(valori ragionevoli in questo periodo sono heads=16 e heads=255).
Quali valori si potrebbero specificare per cyls?
Quei valori che forniranno la capacità totale corretta di C*H*S settori.
Per esempio, per un drive con 71346240 settori (36529274880 byte)
si potrebbe calcolare C come 71346240/(255*63)=4441 (usando, e.g., il programma
bc
) e fornire quindi come parametri di avvio: hdc=4441,255,63
.
Come si può stabilire la capacità totale corretta?
Per esempio:
# 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
indica due modi per stabilire il numero totale si settori pari a 71346240.
I messaggi del kernel:
# dmesg | grep hdc
...
hdc: Maxtor 93652U8, 34837MB w/2048kB Cache, CHS=70780/16/63
hdc: [PTBL] [4441/255/63] hdc1 hdc2 hdc3! hdc4 < hdc5 > ...
riportano (perlomeno) 34837*2048=71346176 settori e 70780*16*63=71346240
settori (almeno). In questo caso il secondo valore è quello corretto
ma in generale entrambi sono arrotondati per difetto.
Questo è un buon modo per definire in maniera approssimata le dimensioni del disco quando
hdparm
non è disponibile.
Non assegnate mai a cyls un valore troppo grande!
Nel caso di dischi SCSI il numero preciso dei settori è indicato
dai messaggi forniti dal kernel all'avvio:
SCSI device sda: hdwr sector= 512 bytes. Sectors= 17755792 [8669 MB] [8.7 GB]
(MB e GB sono arrotondati, non per difetto, e in `notazione binaria').