Per una macchina con filesystem completamente in mirroring con Vinum è desiderabile mettere in mirroring anche il filesystem di root; fare questo è meno semplice che non per un filesystem arbitrario, dato che:
Il filesystem root deve essere disponibile nella parte iniziale del processo di boot, quindi l'infrastruttura di Vinum deve essere già disponibile in quel momento.
Il volume contenente il filesystem root contiene anche il sistema di avvio e il kernel, che devono essere letti usando le funzioni native del sistema (ovvero il BIOS, sui PC) che spesso non conoscono i dettagli di Vinum.
Nelle sezioni seguenti, il termine «volume root»
è usato generalmente per descrivere il volume Vinum che contiene il
filesystem root. È probabilmente una buona idea usare il nome
"root"
per questo volume, ma non è necessario.
Tutti gli esempi nelle prossime sezioni usano questo nome.
Ci sono varie misure da prendere per fare in modo che questo accada:
Vinum deve essere disponibile nel kernel già all'avvio,
quindi il metodo per lanciare Vinum automaticamente descritto
in Sezione 20.8.1.1, «Avvio Automatico» non può essere
utilizzato e il parametro start_vinum
in
realtà non va impostato in questo tipo
di configurazione. La prima possibilità è di
compilare Vinum staticamente dentro al kernel, in modo che sia
sempre disponibile, ma questo non è normalmente desiderabile.
Un'altra opportunità à di fare in modo che
/boot/loader
(Sezione 12.3.3, «Stadio Tre, /boot/loader
») carichi il modulo kernel di Vinum prima di
lanciare il kernel. Questo può essere fatto utilizzando la
riga:
vinum_load="YES"
nel file /boot/loader.conf
.
Vinum deve essere inizializzato subito in modo da poter fornire
il volume per il filesystem root. Per default la porzione kernel di
Vinum non cerca dischi che contengano informazioni sui volumi Vinum
fino a quando un amministratore (o uno degli script di partenza) non
esegue un comando di vinum start
.
I seguenti paragrafi spiegano i passi necessari per FreeBSD 5.X e superiori. L'impostazione richiesta da FreeBSD 4.X è diversa ed è descritta dopo, in Sezione 20.9.5, «Differenze per FreeBSD 4.X».
Inserendo la linea:
vinum.autostart="YES"
dentro a /boot/loader.conf
, Vinum viene
istruito, alla partenza del kernel, di controllare automaticamente
tutti i dischi alla ricerca di informazioni sui volumi Vinum.
Da notare il fatto che non è necessario istruire il
kernel sulla locazione del filesystem root.
/boot/loader
cerca il nome del device di root
in /etc/fstab
e passa l'informazione al kernel.
Quando è necessario montare il filesystem root, il kernel,
tramite il nome di device fornitogli, capisce a quale driver deve
chiedere la conversione di tale nome in ID interno di device (numero
maggiore/minore).
Dato che il codice di avvio di FreeBSD è attualmente di soli
7.5 KB ed è già appesantito dalla lettura di file (come
/boot/loader
) da un filesystem UFS, è
semplicemente impossibile insegnargli anche a leggere le strutture
interne di Vinum in modo da fargli leggere i dati della configurazione
di Vinum per ricavarne gli elementi del volume di boot stesso.
Sono quindi necessari alcuni trucchi per dare al codice di avvio
l'illusione di una partizione "a"
standard contenente
il filesystem di root.
Perché questo sia anche solo possibile, il volume di root deve rispondere ai seguenti requisiti:
Il volume di root non deve essere in striping o in RAID-5.
Il volume di root non deve contenere la concatenazione di più di un sottodisco per ogni plex.
Da notare che è desiderabile e possibile avere plex multipli,
contenente ognuno una replica del filesystem root. Il processo di
avvio, però, usa solo una di queste repliche per trovare i file
necessario all'avvio, fino a quando il kernel monta il filesystem di
root stesso. Ogni singolo sottodisco in questi plex avrà quindi
bisogno di una propria partizione "a"
illusoria,
affinché la periferica relativa possa essere avviabile. Non
è strettamente necessario che ognuna di queste finte partizioni
"a"
sia locato con lo stesso spiazzamento all'interno
della propria periferica, rispetto alle periferiche contenenti gli altri
plex del volume. È comunque probabilmente una buona idea creare
i volumi Vinum in modo che le periferiche in mirror siano simmetriche,
per evitare confusione.
Per poter configurare queste partizioni "a"
,
in ogni periferica contenente parte del volume di root, bisogna fare le
seguenti cose:
La locazione (spiazzamento dall'inizio della periferica) e la dimensione del sottodisco che è parte del volume di root deve essere esaminato, usando il comando:
#
vinum l -rv root
Da notare che gli spiazzamenti e le dimensioni in Vinum sono
misurati in byte. Devono essere divisi per 512 per ottenere il
numero di blocchi necessari nel comando
disklabel
.
Esegui il comando:
#
disklabel -e devname
per ogni periferica che partecipa al volume di root.
devname
deve essere o il nome della slice
(ad esempio ad0s1
) o il nome del disco (ad
esempio da0
) per dischi senza tabella delle
slice (ovvero i nomi che si usano anche con fdisk).
Se c'è già una partizione "a"
sulla periferica (presumibilmente contenente un filesystem root
precedente all'uso di Vinum), dovrebbe essere rinominata in altro
modo, in modo da restare accessibile (non si sa mai), ma non essere
usata più per default per avviare il sistema. Da notare che
le partizioni attive (ad esempio un filesystem root attualmente
montato) non possono essere rinominati, quindi questo deve essere
eseguito o avviando da un disco «Fixit» o (in caso di
mirror) in un processo a due passi dove il disco non di avvio viene
modificato per primo.
Infine, lo spiazzamento della partizione Vinum sulla periferica
va aggiunto allo spiazzamento del rispettivo sottodisco di root
rispetto alla periferica stessa. Il risultato sarà il valore
di "offset"
(spiazzamento) per la nuova
partizione "a"
. Il valore
"size"
(dimensione) per questa partizione
può essere copiato pari pari dal calcolo fatto sopra.
Il valore "fstype"
deve essere
4.2BSD
. I valori "fsize"
,
"bsize"
e "cpg"
devono
preferibilmente essere scelti per corrispondere al vero e proprio
filesystem, anche se in questo contesto non sono molto
importanti.
In questo modo una nuova partizione "a"
sarà creata ricoprendo le partizioni Vinum su questa
periferica. Da notare che disklabel
permetterà questa ricopertura solo se la partizione Vinum
è stata appropriatamente marcata usando un
"fstype"
pari a "vinum"
fstype.
È tutto! Ora una falsa partizione "a"
esiste su ogni periferica che abbia una replica del volume di root.
È altamente raccomandabile verificare nuovamente i risultati,
usando un comando come:
#
fsck -n /dev/devnamea
Bisogna ricordarsi che tutte le informazioni contenute nei file di
controllo devono essere relative al filesystem di root nel volume Vinum
che, quando si imposta un nuovo volume di root Vinum, potrebbe non
coincidere con quello del filesystem root attualmente attivo.
In particolare bisogna stare attenti ai file
/etc/fstab
e
/boot/loader.conf
.
Al seguente riavvio il sistema dovrebbe ricavare le informazioni di controllo appropriate dal filesystem di root Vinum e agire di consequenza. Alla fine del processo di inizializzazione del kernel, dopo che tutte le periferiche sono state annunciate, l'avvertimento principale che conferma il successo dell'avvio è un messaggio simile a questo:
Mounting root from ufs:/dev/vinum/root
Dopo aver creato il volume di root Vinum,
vinum l -rv root
dovrebbe produrre qualcosa di simile
a:
... Subdisk root.p0.s0: Size: 125829120 bytes (120 MB) State: up Plex root.p0 at offset 0 (0 B) Drive disk0 (/dev/da0h) at offset 135680 (132 kB) Subdisk root.p1.s0: Size: 125829120 bytes (120 MB) State: up Plex root.p1 at offset 0 (0 B) Drive disk1 (/dev/da1h) at offset 135680 (132 kB)
I valori su cui fare caso sono il 135680
dello
spiazzamento (relativo alla partizione
/dev/da0h
). Questo si traduce in 265 blocchi da
512 byte nei termini di disklabel
.
/dev/da1h
, contenente la seconda replica del
volume di root, ha una configurazione simmetrica.
La disklabel
per queste periferiche dovrebbe
essere simile a questa:
... 8 partitions: # size offset fstype [fsize bsize bps/cpg] a: 245760 281 4.2BSD 2048 16384 0 # (Cyl. 0*- 15*) c: 71771688 0 unused 0 0 # (Cyl. 0 - 4467*) h: 71771672 16 vinum # (Cyl. 0*- 4467*)
Si può notare che il parametro "size"
per
la finta partizione "a"
corrisponde al valore di cui
abbiamo parlato prima, mentre il parametro "offset"
è la somma dello spiazzamento all'interno della partizione Vinum
"h"
e lo spiazzamento all'interno della periferica (o
slice). Questa è una tipica configurazione necessaria per
evitare il problema descritto in Sezione 20.9.4.3, «Non si Carica Niente, l'Avvio va in Panico».
Si può anche notare che l'intera partizione
"a"
è completamente contenuta dalla partizione
"h"
, che contiene tutti i dati Vinum per questa
periferica.
Notate che in questo esempio l'intera periferica è dedicata a Vinum e non c'è spazio per partizioni pre-Vinum, dato che questo disco è stato configurato da nuovo per il solo scopo di far parte di una configurazione Vinum.
Se qualcosa va storto, serve un modo per tornare in una situazione di normalità. Segue una lista di alcuni tipici problemi, completi di soluzione.
Se per qualsiasi ragione in sistema non prosegue nell'avvio, si
può interrompere il processo di avvio premendo il tasto
spazio all'avviso dei 10 secondi. Le variabili di
avvio potranno quindi essere esaminate usando il comando
show
e manipolate con set
e
unset
.
Se l'unico problema è che il modulo kernel di Vinum non
è ancora presente nella lista dei moduli da caricare
automaticamente, un semplice load vinum
aiuterà.
Quando pronti, il processo di avvio può continuare con un
boot -as
. Le opzioni -as
comunicano al kernel di montare il filesystem di root
(-a
) e di interrompere il processo di avvio in
modalità singolo utente (-s
),
quando il filesystem di root è montato a sola lettura. In
questo modo benché uno solo dei plex do un volume multi-plex
sia stato montato, non si rischia inconsistenza dei dati tra i vari
plex.
Alla richiesta di un filesystem di root da montare, ogni
periferica che contenga un filesystem di root valido può essere
usata. Se /etc/fstab
è stato impostato
correttamente, il default dovrebbe essere
ufs:/dev/vinum/root
o simile. Una tipica
alternativa potrebbe essere ufs:da0d
, una
ipotetica partizione contenente un filesystem root pre-Vinum.
Bisogna fare attenzione quando si sceglie una delle partizioni
"a"
alias di un sottodisco della periferica root di
Vinum, perché in una configurazione in mirror questo monterebbe
solo un pezzo della root in mirror. Se questo filesystem deve poi
essere montato in lettura/scrittura è necessario rimuovere gli
altri plex del volume root di Vinum dato che conterrebbero comunque
dati non consistenti.
Se /boot/loader
non si carica, ma l'avvio
primario si carica comunque (si capisce dal singolo trattino nella
colonna di sinistra dello schermo subito dopo l'inizio dell'avvio), si
può tentare di fermare l'avvio primario in questo punto,
premendo il tasto spazio. Questo fermerà
l'avvio nella seconda fase, vedi Sezione 12.3.2, «Stadio Uno, /boot/boot1
, e Stadio Due,
/boot/boot2
». Qua si
può fare un tentativo di caricare una differente partizione, ad
esempio la partizione contenente il precedente filesystem di root
"a"
, prima di sostituirlo come sopra
indicato.
Questa situazione accade quando l'installazione di Vinum ha distrutto il codice di avvio. Sfortunatamente Vinum lascia solo 4 KB liberi all'inizio della sua partizione prima di scrivere il proprio header. Purtroppo le due fasi dell'avvio e la disklabel compresa tra le due attualmente occupa 8 KB, quindi se la partizione Vinum è creata con spiazzamento 0 in una slice o disco che dovrebbe essere avviabile, la configurazione di Vinum distruggerà il codice di avvio.
Similmente, se la situazione sopra descritta è stata
risolta avviando da un disco di «Fixit», e il codice di
avvio re-installato usando disklabel -B
come
descritto in Sezione 12.3.2, «Stadio Uno, /boot/boot1
, e Stadio Due,
/boot/boot2
», il codice di avvio
distruggerà l'header di Vinum, che non saprà più
trovare i propri dischi. Benché nessun dato, di configurazione
o contenuto, sia distrutto da questo processo, che risulta quindi
recuperabile reinserendo la stessa configurazione di Vinum, la
situazione è in realtà di difficile risoluzione: sarebbe
necessario spostare l'intera partizione Vinum di almeno 4 KB, in modo
da lasciare abbastanza spazio sia per il codice di avvio che per
l'header Vinum.
In FreeBSD 4.X alcune funzioni interne necessarie a Vinum per poter
trovare automaticamente tutti i dischi non sono presenti e il codice che
ricava l'ID interno della periferica di root non è abbastanza
intelligente da gestire automaticamente nomi come
/dev/vinum/root
, quindi le cose vengono fatte
in modo un po' diverso.
Bisogna dire esplicitamente a Vinum quali dischi controllare, usando
una riga di /boot/loader.conf
come la
seguente:
vinum.drives="/dev/da0
/dev/da1
"
È importante indicare tutti i drive che possono contenere dati Vinum. Non è un problema indicare drive di troppo, non è neanche necessario aggiungere esplicitamente ogni slice e/o partizione, dato che Vinum cercherà header Vinum in tutte le slice e partizioni dei drive nominati.
Dato che le procedure utilizzate per interpretare il nome del
filesystem di root e derivarne l'ID di periferica (numeri
maggiore e minore) sono adatte per gestire solo nomi
«classici» di periferica come
/dev/ad0s1a
, non riescono a capire nomi di
volumi root come /dev/vinum/root
. Per questo
motivo Vinum ha bisogno di pre-impostare durante la propria
inzializzazione il parametro kernel interno che contiene l'ID della
periferica di root. Questo viene fatto indicando il nome del
volume di root nella variabile di avvio vinum.root
.
La riga di /boot/loader.conf
adatta per fare questo
è simile alla seguente:
vinum.root="root"
Quando l'inizializzazione del kernel cerca di trovare la periferica
root da montare controlla se qualche modulo del kernel ha già
pre-inizializzato il parametro kernel apposito; se questo è il
caso e la periferica che dice di essere la
periferica di root ha il numero maggiore e minore corrispondenti al
driver come trovato dal nome della periferica di root passata (ovvero
"vinum"
, nel nostro caso), userà l'ID di
periferica pre-allocato, anziché cercar di trovarne uno da solo.
In tal modo durante l'usuale avvio automatico può continuare a
montare il volume di root Vinum per il filesystem di root.
Bisogna comunque notare che anche quando boot -a
richiede di inserire manualmente il nome della periferica di root tale
nome non può essere intepretato nel caso sia un nome riferito a
un volume Vinum. Se è inserito un nome di periferica non
riferito a una periferica Vinum, la non corrispondenza col numero
maggiore pre-allocato del parametro di root e del driver ricavato dal
nome farà sì che la procedura utilizzi il normale
interprete, quindi una stringa come ufs:da0d
funzionerà come previsto. Da notare che se questo fallisce non
si può più provare una stringa come
ufs:vinum/root
, dato che non verrebbe
interpretata; l'unica via di uscita è riavviare e ripartire da
zero. (Alla richiesta di «askroot», la parte iniziale
/dev/
può sempre essere omessa.)
Questo, ed altri documenti, possono essere scaricati da ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/
Per domande su FreeBSD, leggi la
documentazione prima di contattare
<questions@FreeBSD.org>.
Per domande su questa documentazione, invia una e-mail a
<doc@FreeBSD.org>.