Avanti Indietro Indice

10. Dettagli

10.1 Dettagli sui dischi IDE - le sette geometrie

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.

10.2 Dettagli sui dischi SCSI

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.

aha1740, dtc, g_NCR5380, t128, wd7000:

H=64, S=32.

aha152x, pas16, ppa, qlogicfas, qlogicisp:

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.

advansys:

H=64, S=32 se C <= 1024, se è abilitata l'opzione `> 1 GB' nel BIOS i valori assunti sono rispettivamente 255 e 63.

aha1542:

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".

aic7xxx:

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)

buslogic:

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").

fdomain:

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.

in2000:

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.

seagate:

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.

ultrastor and u14_34f:

Utilizza una coppia di valori (H,S) in funzione di come il controller mappa il disco. ((H,S) = (16,63), (64,32), (64,63))

Se il driver non specifica la geometria del disco possiamo richiedere i dati alla tabella delle partizioni oppure utilizzare tutta la capacità del disco.

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)*endS, allora la partizione è allineata sul confine di un cilindro. Si pongono H = endH+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.


Avanti Indietro Indice