20.9. Usare Vinum nel Filesystem Root

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:

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.

20.9.1. Lanciare Vinum abbastanza presto per il Filesystem Root

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.

    Nota:

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

20.9.2. Rendere un volume di root basato su Vinum accessibile dall'avvio

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:

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

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

  3. È 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

20.9.3. Esempi di configurazioni con root basata su Vinum

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.

20.9.4. Risoluzione Problemi

Se qualcosa va storto, serve un modo per tornare in una situazione di normalità. Segue una lista di alcuni tipici problemi, completi di soluzione.

20.9.4.1. Il Codice di Avvio si Carica, ma il Sistema non si Avvia

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.

20.9.4.2. Si Carica Solo l'Avvio Primario

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.

20.9.4.3. Non si Carica Niente, l'Avvio va in Panico

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.

20.9.5. Differenze per FreeBSD 4.X

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