Come montare il file system ZFS esterno senza alterare / alterare il file system corrente o esterno


11

Sto usando FreeBSD 10.2 usando ZFS su root come file system (zroot01) . Ho un disco rigido esterno con un file system ZFS da un altro sistema FreeBSD 10.2 (zroot02) che voglio montare temporaneamente, di sola lettura, quindi posso estrarre alcuni file da esso, quindi disconnetterlo in seguito. Io non voglio che il sistema ZFS esterno per clobber o sostituire il mio file system corrente, né voglio i dati sul esterno per essere corrotti / alterata sia.

Per dimostrare ciò che sto cercando di realizzare, se stavo usando UFS farei qualcosa del genere:

mount -t ufs -o ro /dev/ada0s2 /mnt/my-fun-mountpoint

... dov'è /dev/ada0s2la partizione sul mio disco esterno ed /mnt/my-fun-mountpointè nella /mntdirectory del mio sistema operativo esistente.

Tutta la ricerca e la lettura della pagina man non ha fornito un metodo cristallino per farlo. Le risposte che ho trovato sono finite col prendere il controllo del mio file system attuale e corromperlo irreparabilmente, ovviamente non il risultato che sto cercando. Ci ho provato un po 'di tempo fa, quindi non ricordo quali comandi ho provato, sfortunatamente.

Potete per favore fornire alcune indicazioni chiare su come farlo? Grazie in anticipo per il vostro aiuto.

Risposte:


13

Bene, dipende davvero da quanto vuoi che sia il pool. E no, non è uno scherzo.

Innanzitutto, un po 'di terminologia: in ZFS, si importa un pool e, facoltativamente, si montano i (qualsiasi) file system al suo interno. È possibile importare una piscina senza montare i file system passando -Nper zpool importe poi in seguito montare i file system desiderato usando zfs mount. (Questo è uno scenario perfettamente valido se, ad esempio, si desidera accedere a un solo file system su molti, o se si desidera fare qualcosa di simile a uno scrub offline del pool.)

ZFS non è un grande fan dell'accesso in sola lettura. Ad esempio, se ZFS rileva un errore che è in grado di riparare, credo che riparerà l'errore e scriverà i dati riparati sul disco anche se il pool è stato importato in sola lettura. La mia comprensione è che, in ZFS Parlace, "sola lettura" si applica solo allo stato visibile dall'utente del pool e dei suoi set di dati. Se, d'altra parte, fai una copia binaria del disco in un file (o set di file), rendi quei file veramente di sola lettura e provi a importare il pool da lì, ZFS non sarà in grado di importare il piscina, non importa quanto ci provi. Se rendi i file scrivibili, funzionerà bene. (In realtà l'ho provato solo poche settimane fa, anche se usando uno zvol, e ZFS ha rifiutato con veemenzaper importare il pool. Quando ho impostato zvol in lettura / scrittura anziché in sola lettura, il pool è stato importato correttamente.) Altri file system come (su Linux) ext4 e probabilmente altri gestiscono questa situazione in modo abbastanza elegante, ma ZFS si interrompe.

Se sei sfortunato e non hai RAM ECC installata nel sistema in cui stai importando il pool, allora il tentativo di ZFS di correggere eventuali errori riscontrati potrebbe effettivamente peggiorare le cose , anche se le opinioni differiscono sul fatto che si tratti effettivamente di un rischio reale in pratica. Personalmente sono dell'opinione che qualsiasi dato a cui tengo abbastanza da proteggere con ZFS e snapshot e ridondanza e backup a livello di archiviazione e quant'altro meriti la protezione offerta dalla RAM ECC, ma molti PC non hanno RAM ECC.

Quindi, è possibile importare la piscina in modalità di sola lettura, con una specifica di root alternativa per evitare che un passo su qualsiasi altra cosa c'è di dita dei piedi, ma è necessario essere consapevoli che non è necessariamente vero di sola lettura in un senso forense. (Tuttavia, assicurerà di non modificare accidentalmente nulla nel pool.) Per eseguire un'importazione in sola lettura, supponendo che il pool sia denominato tanke che i nodi del dispositivo siano / siano disponibili in /dev, usa un comando come:

# zpool import tank -d /dev -o readonly=on -R /mnt/someplace

Questo cercherà /devtutto ciò che contiene un pool ZFS con il nome tank, lo importa, impostando temporaneamente la proprietà del pool readonlysu on(il che significa che tutte le scritture avviate dall'utente verranno rifiutate) e impostando temporaneamente la sua altrootproprietà su /mnt/someplace. (Questi valori di proprietà sono "temporanei", nel senso che non sono persistenti sul / i disco / i come valori di proprietà correnti, quindi se si esporta e reimporta il pool senza di essi, i valori torneranno alla normalità. Potrebbero può essere eventualmente scritto nella cronologia del pool, che una volta importato il pool è possibile esaminarezpool history tank se sei così incline.) Una volta importato il pool, vedrai i tuoi file in / mnt / da qualche parte e avrai accesso normale e di sola lettura ad essi, inclusi tutti gli snapshot che sono già stati fatti sui set di dati nel pool.

Dato il tuo esempio, sospetto che useresti qualcosa del tipo:

# zpool import zroot02 -d /dev -o readonly=on -R /mnt/my-fun-mountpoint

Al termine, ricordarsi di esportare in modo pulito il pool:

# zpool export tank

o forse

# zpool export zroot02

Ciò smonterà tutti i file system e gli altri set di dati all'interno del pool, scaricherà tutti i buffer (nella misura in cui sia necessario eseguire lo flush in primo luogo), contrassegnerà il pool come non importato su tutti i dispositivi costituenti ed eseguirà tutte le altre attività di pulizia necessarie per garantire che il pool può essere tranquillamente spostato su un altro sistema e importato lì in seguito.


1
Se sei davvero sicuro di ciò che affermi nel tuo terzo paragrafo sia corretto, sarebbe un bug con l'implementazione di BSD ZFS. L'importazione in sola lettura del pool ZFS è stata progettata per essere veramente di sola lettura, ovvero non tenta mai di scrivere o correggere dati o metadati, inclusa la cronologia del pool. Vedi arc.stillopensolaris.org/txt/PSARC_2010_306.txt
jlliagre

1
@jlliagre Ne sono abbastanza sicuro, ma potrebbe essere stato nel contesto di un'altra implementazione di ZFS. Tuttavia, non vedo davvero perché differiscano in un aspetto così fondamentale; Credo che tutte le implementazioni ZFS open-source condividano una quantità significativa di codice che riconduce il suo lignaggio a Sun. Potrei solo creare una sorta di ambiente di test per questo e cercarlo con un bastone, quindi vedere cosa succede, ma ci vorrà del tempo prima che io possa dedicare il tempo per farlo davvero.
un CVn del
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.