|
Il driver IDE può determinare la geometria di un disco in quattro modi. Il primo (G_user) è quello di passare le informazioni da linea di comando. Il secondo (G_bios) è la lettura in fase di inizializzazione della Tavola dei Parametri del Disco nel BIOS (solo per il primo e il secondo disco) prima del passaggio alla modalità a 32 bit. Il terzo (G_phys) e il quarto (G_log) sono le risposte del controller IDE al comando IDENTIFY, sono rispettivamente la geometria `fisica' e `logica' del disco.
Il driver ha bisogno di due valori per determinare la geometria:
uno è dato da G_fdisk, ottenuto da una chiamata a HDIO_GETGEO
ioctl,
l'altro da G_used, che è utilizzato per le operazioni di I/O.
Sia G_fdisk che G_used sono inizializzati da G_user se vengono passati i valori,
altrimenti da G_bios o da G_phys.
Se G_log ha un valore ragionevole questo viene assegnato a G_used.
Nel caso in cui G_used non sia ragionevole ma lo sia G_phys quest'ultimo valore sarà
assegnato a G_used. Per `valore ragionevole' si intende un numero di testine compreso tra 1 e 16.
Per dirla in altri termini: i parametri passati da linea di comando
forzano i valori del BIOS e determinano la geometria che vedrà fdisk
.
Tuttavia se i parametri si riferiscono ad una geometria tradotta con
più di 16 testine l'I/O del kernel sarà forzato dai valori ricavati dal comando IDENTIFY.
Bisogna osservare che il G_bios è piuttosto inattendibile: per i sistemi inizializzati da un driver SCSI il primo ed il secondo disco possono essere SCSI e la geometria che il BIOS attribuisce a sda è quella usata dal kernel per hda. Tuttavia, i dischi che non sono impostati nel Setup del BIOS non possono essere visti da quest'ultimo. Ciò significa che, per esempio, in un sistema IDE dove non sia presente hdb le geometrie riportate dal BIOS per il primo e per il secondo disco siano attribuite a hda e hdc.
Per i dischi SCSI la situazione è diversa. Questi dischi utilizzano
la LBA per cui determinare una `geometria' è del tutto irrilevante.
Il formato della tavole delle partizioni è praticamente lo stesso,
fdisk
deve crearsi una qualche geometria, utilizza HDIO_GETGEO
,
perché non è in grado di distinguere tra dischi IDE e SCSI.
Come si vedrà in seguito ogni driver crea una sua geometria.
Veramente una grande confusione.
Se non si utilizza il DOS è meglio evitare le impostazioni di traduzione estese ed utilizzare se possibile 64 testine, 32 settori per traccia (per gli esigenti può andar bene 1MB per cilindro) così facendo si evitano problemi se si cambia controller. Alcuni driver (aha152x, pas16, ppa, qlogicfas, qlogicisp) sono così legati ai limiti del DOS da non permettere l'utilizzo di più di 8GiB anche nel caso in cui Linux sia il solo sistema installato. Questo è un baco.
Qual è la geometria reale? La risposta più facile è che non esiste.
E se anche esistesse voi non dovreste occuparvene e di sicuro
MAI E POI MAI dovreste richiedere tali informazioni a fdisk
, a LILO o al kernel.
Questa è una cosa di cui di occupano il controller SCSI e il disco.
Lasciatemelo ripetere: solo gli stupidi richiedono a fdisk
/LILO/kernel
la geometria di un disco SCSI.
Tuttavia se siete persone curiose ed insistenti potete leggere
tali valori dal disco stesso. Il comando READ CAPACITY dà la capacità totale
del disco; MODE SENSE riporta il numero di cilindri e testine
nella Rigid Disk Drive Geometry Page (page 04, questi valori non possono essere modificati)
e il numero di byte per settore e i settori per traccia nella Format Page (page 03).
Quest'ultimo valore dipende dalla formattazione ed è variabile, le tracce più esterne
hanno più settori di quelle interne.
Il programma scsiinfo
fornisce questi dati. Ci sono molti altri dettagli
e difficoltà da superare, è palese che nessuno utilizzerà questo genere di informazioni
(molto probabilmente nemmeno lo stesso sistema operativo).
Considerato che stiamo parlando di fdisk
e di LILO i valori tipici
sono: C/H/S=4476/27/171, valori questi che non possono essere utilizzati da fdisk
perché la tabella delle partizioni riserva per la terna C/H/S rispettivamente
18, 8 e 6 bit.
Ma allora come fa HDIO_GETGEO
a ricavare tali valori?
Interrogando o il controller SCSI o facendo delle richieste appropriate
al kernel.
Qualche driver sembra pensare che le nostre richieste vogliano determinare
la geometria reale mentre a noi interessa conoscere il valore dei parametri
utilizzati da FDISK sia che si utilizzi DOS che OS/2 (o Adaptec AFDISK, ecc...)
È da sottolineare che fdisk
utilizza il numero delle testine H e dei settori per traccia S
per convertire i numeri dei settori LBA nel corrispondente indirizzo c/h/s;
il numero dei cilindri C non riveste un ruolo importante in questa conversione.
Certi driver indicano che la capacità del drive è di almeno
1023*
255*
63 settori
assegnando a C,H,S i seguenti valori:1023,255,63.
Così facendo non si ottiene la vera dimensione del disco e si limita l'accesso
ai primi 8GB a molte versioni di fdisk
- un vero problema d'attualità.
Nelle descrizioni a seguire con M si indica la capacità totale del disco,
con C,H,S il numero di cilindri, testine e settori per traccia.
È sufficente ottenere i valori di H e S se si ricava C dalla relazione M / (H*
S).
I valori predefiniti di H e S sono rispettivamente 64 e 32.
H=64, S=32.
H=64, S=32 se C <=
1024, altrimenti H=255, S=63, C =
min(1023, M/(H*S)). (C rappresenta un valore troncato,
H*
S*
C non è un'approssimazione della capacità M.
Per questo molte versioni di fdisk
si comportano in modo anomalo).
Il sorgente ppa.c
utilizza M+1 invece di M per cui genera un messaggio
d'errore dicendo che M è più piccolo di 1 a causa di un baco in sd.c
.
H=64, S=32 se C <=
1024, se è abilitata l'opzione `> 1 GB' nel BIOS
i valori assunti sono rispettivamente 255 e 63.
Richiede al controller quale delle due traduzioni possibili sta utilizzando e utilizza o H=255, S=63 o H=64, S=32. Nel primo caso durante il boot si ha il messaggio "aha1542.c: Using extended bios translation".
H=64, S=32 se C <=
1024, inoltre se viene utilizzato il parametro "extended"
o si imposta il bit `extended' nella SEEPROM o nel BIOS i valori saranno:
H=255, S=63.
L'opzione extended viene sempre impostata se non viene rilevata nessuna SEEPROM
con il kernel 2.0.36 mentre con la versione 2.2.6 se non viene trovata
la SEEPROM l'opzione è impostata solo se l'utente specifica in fase d'avvio
il parametro "extended" (nel caso venga rilevata una SEEPROM tale parametro verrà
ignorato).
Tutto ciò significa che un sistema che funziona con il 2.0.36 può non avviarsi con il 2.2.6 (e richiedere l'opzione `linear' per LILO o il parametro `aic7xxx=extended' da passare al kernel al boot)
H=64, S=32 finché C >=
1024. Se si imposta la traduzione estesa nel controller
si hanno due casi a seconda che sia verificata o meno la condizione M <
2^22:
nel primo caso H=128, S=32 altrimenti H=255, S=63.
Dopo aver effettuato la scelta della terna (C,H,S) viene letta la tabella delle
partizioni e si verifica che il valore endH=H-1 appartenga ad una delle tre condizioni
possibili (H,S) = (64,32), (128,32), (255,63). Sarà utilizzata la coppia che soddisfa la condizione,
tale scelta è segnalata da un messaggio durante il boot ("Adopting Geometry from Partition Table").
Ricava le informazioni sulla geometria o dalla tabella dei parametri BIOS
del drive o dalla tavola delle partizioni.
Utilizza i valori: H=endH+1, S=endS per la prima partizione, purché non sia vuota,
oppure H=64, S=32 se M <
2^21 (1 GB), H=128, S=63 se M <
63*
2^17 (3.9 GB) e H=255,
S=63 in tutti gli altri casi.
Utilizza la prima coppia di valori (H,S) = (64,32), (64,63), (128,63), (255,63)
che verifica la condizione C <=
1024. Nell'ultimo caso il valore di C è troncato a 1023.
Legge C,H,S dal disco (orrore!). Se C o S sono troppo grandi
allora imposta S=17 e H=2 e raddoppia H finché C <=
1024.
Significa che H sarà impostato a zero nel caso in cui
M > 128*
1024*
17 (1.1 GB). Questo è un baco.
Utilizza una coppia di valori (H,S) in funzione di come il controller mappa il disco. ((H,S) = (16,63), (64,32), (64,63))
Diamo uno sguardo alla tabella delle partizioni.
Per convenzione le partizioni terminano in un cilindro esterno per cui dato
fine
= (endC,endH,endS) per una partizione qualsiasi si pone H = endH+1
e S = endS
(ricordo che i settori si contano a partire da 1).
Il procedimento è descritto appresso in modo più preciso.
Tra le partizioni non vuote si considera quella con il valore beginC
più grande.
Si controlla il valore end+1
di questa partizione, calcolato sia come somma di partenza
con lunghezza
sia ipotizzando che la partizione termini al confine di un cilindro.
Se entrambi i valori coincidono, o se endC
= 1023 e la somma partenza+lunghezza
è multiplo
di (endH+1)
, allora la partizione è allineata sul confine di un cilindro. Si pongono H = *
endSendH+1
e
S = endS
. Nel caso in cui le verifiche siano negative o perché non ci sono partizioni o
perché non hanno dimensioni note si utilizza la capacità del disco M.
L'algoritmo è così schematizzabile: porre H = M/(62*
1024) (arrotondato all'intero superiore),
S = M/(1024*
H) (arrotondato all'intero superiore), C = M/(H*
S) (arrotondato all'intero
inferiore). I valori di (C,H,S) che si ottengono sono al massimo 1024 per C e 62 per S.
Hosting by: hurra.com
Generated: 2007-01-26 17:56:16