Sophie

Sophie

distrib > Mandriva > 9.1 > i586 > by-pkgid > f1098342ec4a2b28475e34123ce17201 > files > 547

howto-html-it-9.1-0.5mdk.noarch.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
 <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
 <TITLE>Large Disk HOWTO: Dettagli</TITLE>
 <LINK HREF="Large-Disk-HOWTO-11.html" REL=next>
 <LINK HREF="Large-Disk-HOWTO-9.html" REL=previous>
 <LINK HREF="Large-Disk-HOWTO.html#toc10" REL=contents>
</HEAD>
<BODY>
<A HREF="Large-Disk-HOWTO-11.html">Avanti</A>
<A HREF="Large-Disk-HOWTO-9.html">Indietro</A>
<A HREF="Large-Disk-HOWTO.html#toc10">Indice</A>
<HR>
<H2><A NAME="s10">10. Dettagli</A></H2>

<P>
<H2><A NAME="ss10.1">10.1 Dettagli sui dischi IDE - le sette geometrie </A>
</H2>

<P>
<!--
disk!IDE geometry setting
-->

Il driver IDE pu&ograve; determinare la geometria di un disco in quattro modi.
Il primo (G_user) &egrave; quello di passare le informazioni da linea di comando.
Il secondo (G_bios) &egrave; 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&agrave; 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.
<P>Il driver ha bisogno di due valori per determinare la geometria:
uno &egrave; dato da G_fdisk, ottenuto da una chiamata a <CODE>HDIO_GETGEO</CODE> ioctl,
l'altro da G_used, che &egrave; 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&agrave;
assegnato a G_used. Per `valore ragionevole' si intende un numero di testine compreso tra 1 e 16.
<P>Per dirla in altri termini: i parametri passati da linea di comando
forzano i valori del BIOS e determinano la geometria che vedr&agrave; <CODE>fdisk</CODE>.
Tuttavia se i parametri si riferiscono ad una geometria tradotta con
pi&ugrave; di 16 testine l'I/O del kernel sar&agrave; forzato dai valori ricavati dal comando IDENTIFY.
<P>Bisogna osservare che il G_bios &egrave; 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 &egrave; 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&ograve; 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. 
<P>
<P>
<H2><A NAME="ss10.2">10.2 Dettagli sui dischi SCSI </A>
</H2>

<P>
<!--
disk!SCSI geometry setting
-->

Per i dischi SCSI la situazione &egrave; diversa. Questi dischi utilizzano
la LBA per cui determinare una `geometria' &egrave; del tutto irrilevante.
Il formato della tavole delle partizioni &egrave; praticamente lo stesso,
<CODE>fdisk</CODE> deve crearsi una qualche geometria, utilizza <CODE>HDIO_GETGEO</CODE>,
perch&eacute; non &egrave; in grado di distinguere tra dischi IDE e SCSI.
Come si vedr&agrave; in seguito ogni driver crea una sua geometria.
Veramente una grande confusione. 
<P>Se non si utilizza il DOS &egrave; meglio evitare le impostazioni di traduzione
estese ed utilizzare se possibile 64 testine, 32 settori per traccia (per gli esigenti
pu&ograve; andar bene 1MB per cilindro) cos&igrave; facendo si evitano problemi
se si cambia controller.
Alcuni driver (aha152x, pas16, ppa, qlogicfas, qlogicisp) sono cos&igrave;
legati ai limiti del DOS da non permettere l'utilizzo di pi&ugrave; di 8GiB anche nel
caso in cui Linux sia il solo sistema installato. Questo &egrave; un baco.
<P>Qual &egrave; la geometria reale? La risposta pi&ugrave; facile &egrave; che non esiste.
E se anche esistesse voi non dovreste occuparvene e di sicuro
MAI E POI MAI dovreste richiedere tali informazioni a <CODE>fdisk</CODE>, a LILO o al kernel.
Questa &egrave; una cosa di cui di occupano il controller SCSI e il disco.
Lasciatemelo ripetere: solo gli stupidi richiedono a <CODE>fdisk</CODE>/LILO/kernel
la geometria di un disco SCSI.
<P>Tuttavia se siete persone curiose ed insistenti potete leggere
tali valori dal disco stesso. Il comando READ CAPACITY d&agrave; la capacit&agrave; 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 &egrave; variabile, le tracce pi&ugrave; esterne 
hanno pi&ugrave; settori di quelle interne.
Il programma <CODE>scsiinfo</CODE> fornisce questi dati. Ci sono molti altri dettagli 
e difficolt&agrave; da superare, &egrave; palese che nessuno utilizzer&agrave; questo genere di informazioni
(molto probabilmente nemmeno lo stesso sistema operativo).
Considerato che stiamo parlando di <CODE>fdisk</CODE> e di LILO i valori tipici
sono: C/H/S=4476/27/171, valori questi che non possono essere utilizzati da <CODE>fdisk</CODE>
perch&eacute; la tabella delle partizioni riserva per la terna C/H/S rispettivamente
18, 8 e 6 bit.
<P>Ma allora come fa <CODE>HDIO_GETGEO</CODE> 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...)
<P>&Egrave; da sottolineare che <CODE>fdisk</CODE> 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&agrave; del drive &egrave; di almeno
1023<CODE>*</CODE>255<CODE>*</CODE>63 settori
assegnando a C,H,S i seguenti valori:1023,255,63.
Cos&igrave; facendo non si ottiene la vera dimensione del disco e si limita l'accesso
ai primi 8GB a molte versioni di <CODE>fdisk</CODE> - un vero problema d'attualit&agrave;.
<P>Nelle descrizioni a seguire con M si indica la capacit&agrave; totale del disco,
con C,H,S il numero di cilindri, testine e settori per traccia.
&Egrave; sufficente ottenere i valori di H e S se si ricava C dalla relazione M / (H<CODE>*</CODE>S). 
<P>I valori predefiniti di H e S sono rispettivamente 64 e 32.
<P>
<DL>
<DT><B>aha1740, dtc, g_NCR5380, t128, wd7000:</B><DD><P>H=64, S=32.
<P>
<DT><B>aha152x, pas16, ppa, qlogicfas, qlogicisp:</B><DD><P>H=64, S=32 se C <CODE>&lt;=</CODE> 1024, altrimenti H=255, S=63, C =
min(1023, M/(H*S)). (C rappresenta un valore troncato,
H<CODE>*</CODE>S<CODE>*</CODE>C non &egrave; un'approssimazione della capacit&agrave; M.
Per questo molte versioni di <CODE>fdisk</CODE> si comportano in modo anomalo).
Il sorgente <CODE>ppa.c</CODE> utilizza M+1 invece di M per cui genera un messaggio
d'errore dicendo che M &egrave; pi&ugrave; piccolo di 1 a causa di un baco in <CODE>sd.c</CODE>.
<P>
<DT><B>advansys:</B><DD><P>H=64, S=32 se C <CODE>&lt;=</CODE> 1024, se &egrave; abilitata l'opzione `> 1 GB' nel BIOS
i valori assunti sono rispettivamente 255 e 63. 
<P>
<DT><B>aha1542:</B><DD><P>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".
<P>
<DT><B>aic7xxx:</B><DD><P>H=64, S=32 se C <CODE>&lt;=</CODE> 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 &egrave; impostata solo se l'utente specifica in fase d'avvio
il parametro "extended" (nel caso venga rilevata una SEEPROM tale parametro verr&agrave;
ignorato).
Tutto ci&ograve; significa che un sistema che funziona con il 2.0.36 pu&ograve; 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)
<P>
<DT><B>buslogic:</B><DD><P>H=64, S=32 finch&eacute; C <CODE>>=</CODE> 1024. Se si imposta la traduzione estesa nel controller
si hanno due casi a seconda che sia verificata o meno la condizione M <CODE>&lt;</CODE> 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&agrave; utilizzata la coppia che soddisfa la condizione,
tale scelta &egrave; segnalata da un messaggio durante il boot ("Adopting Geometry from Partition Table").
<P>
<DT><B>fdomain:</B><DD><P>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&eacute; non sia vuota,
oppure H=64, S=32 se M <CODE>&lt;</CODE> 2^21 (1 GB), H=128, S=63 se M <CODE>&lt;</CODE> 63<CODE>*</CODE>2^17 (3.9 GB) e H=255,
S=63 in tutti gli altri casi.
<DT><B>in2000:</B><DD><P>Utilizza la prima coppia di valori (H,S) = (64,32), (64,63), (128,63), (255,63)
che verifica la condizione C <CODE>&lt;=</CODE> 1024. Nell'ultimo caso il valore di C &egrave; troncato a 1023.
<P>
<DT><B>seagate:</B><DD><P>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&eacute; C <CODE>&lt;=</CODE> 1024.
Significa che H sar&agrave; impostato a zero nel caso in cui
M > 128<CODE>*</CODE>1024<CODE>*</CODE>17 (1.1 GB). Questo &egrave; un baco.
<P>
<DT><B>ultrastor and u14_34f:</B><DD><P>Utilizza una coppia di valori (H,S) in funzione di come il controller mappa il disco.
((H,S) = (16,63), (64,32), (64,63))
<P>
</DL>

Se il driver non specifica la geometria del disco possiamo richiedere i dati alla tabella delle
partizioni oppure utilizzare tutta la capacit&agrave; del disco.
<P>Diamo uno sguardo alla tabella delle partizioni.
Per convenzione le partizioni terminano in un cilindro esterno per cui dato
<CODE>fine</CODE> = (endC,endH,endS) per una partizione qualsiasi si pone H = <CODE>endH+1</CODE> e S = <CODE>endS</CODE>
(ricordo che i settori si contano a partire da 1).
Il procedimento &egrave; descritto appresso in modo pi&ugrave; preciso.
Tra le partizioni non vuote si considera quella con il valore <CODE>beginC</CODE> pi&ugrave; grande.
Si controlla il valore <CODE>end+1</CODE> di questa partizione, calcolato sia come somma di <CODE>partenza</CODE>
con <CODE>lunghezza</CODE> sia ipotizzando che la partizione termini al confine di un cilindro.
Se entrambi i valori coincidono, o se <CODE>endC</CODE> = 1023 e la somma <CODE>partenza+lunghezza</CODE> &egrave; multiplo 
di <CODE>(endH+1)<CODE>*</CODE>endS</CODE>, allora la partizione &egrave; allineata sul confine di un cilindro. Si pongono H = <CODE>endH+1</CODE> e
S = <CODE>endS</CODE>. Nel caso in cui le verifiche siano negative o perch&eacute; non ci sono partizioni o
perch&eacute; non hanno dimensioni note si utilizza la capacit&agrave; del disco M.
L'algoritmo &egrave; cos&igrave; schematizzabile: porre H = M/(62<CODE>*</CODE>1024) (arrotondato all'intero superiore),
S = M/(1024<CODE>*</CODE>H) (arrotondato all'intero superiore), C = M/(H<CODE>*</CODE>S) (arrotondato all'intero
inferiore). I valori di (C,H,S) che si ottengono sono al massimo 1024 per C e 62 per S.  
<P>
<HR>
<A HREF="Large-Disk-HOWTO-11.html">Avanti</A>
<A HREF="Large-Disk-HOWTO-9.html">Indietro</A>
<A HREF="Large-Disk-HOWTO.html#toc10">Indice</A>
</BODY>
</HTML>