Cómo montar un sistema de archivos ZFS externo sin alterar / alterar el sistema de archivos actual o externo

11

Estoy usando FreeBSD 10.2 usando ZFS en la raíz como sistema de archivos (zroot01) . Tengo un disco duro externo con un sistema de archivos ZFS de otro sistema FreeBSD 10.2 (zroot02) que quiero montar temporalmente, solo lectura, para poder sacar algunos archivos y luego desconectarlo. Yo no quiero que el sistema de ZFS externa a clobber o reemplazo mi actual sistema de archivos, ni quiero los datos en el exterior a ser corrompidos / alterado tampoco.

Para demostrar lo que estoy tratando de lograr, si estuviera usando UFS haría algo como esto:

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

... donde /dev/ada0s2está la partición en mi disco externo y /mnt/my-fun-mountpointestá en el /mntdirectorio de mi sistema operativo existente.

Toda la búsqueda y lectura de la página de manual no ha proporcionado un método claro para hacerlo. ¿Qué respuestas que me encuentro terminó hacerse cargo de mi sistema de archivos actual y corrompiendo irreparablemente - obviamente no es el resultado que estoy buscando. Intenté esto hace un tiempo, así que no recuerdo qué comandos intenté, desafortunadamente.

¿Puede proporcionar alguna orientación clara sobre cómo hacer esto? Gracias de antemano por su ayuda.

Será
fuente

Respuestas:

13

Bueno, realmente depende de cuán de solo lectura desee que sea el grupo. Y no, eso no es una broma.

Primero, un poco de terminología: en ZFS, importa un grupo y, opcionalmente, monta los (cualquier) sistema de archivos dentro de él. Puede importar una piscina sin tener que montar los sistemas de archivos mediante el paso -Na zpool importy luego montar más adelante los sistemas de archivos deseados utilizando zfs mount. (Este es un escenario perfectamente válido si, por ejemplo, desea acceder a un solo sistema de archivos de muchos, o si desea hacer algo parecido a un exfoliante fuera de línea del grupo).

ZFS no es un gran admirador del acceso verdaderamente de solo lectura. Por ejemplo, si ZFS detecta un error que puede reparar, creo que reparará el error y escribirá los datos reparados en el disco, incluso si importó el grupo como de solo lectura. Tengo entendido que, en ZFS parlace, "solo lectura" se aplica solo al estado visible del usuario del grupo y sus conjuntos de datos. Si, por otro lado, realiza una copia binaria del disco en un archivo (o conjunto de archivos), hace que esos archivos sean realmente de solo lectura e intente importar el grupo desde allí, ZFS no podrá importar el piscina en absoluto sin importar cuánto lo intentes. Si hace que los archivos se puedan escribir, funcionará bien. (De hecho, intenté esto hace solo unas semanas, aunque usé un zvol, y ZFS se negó vehementementepara importar el grupo. Cuando configuré el zvol para leer / escribir en lugar de solo lectura, el grupo se importó bien.) Otros sistemas de archivos como (en Linux) ext4 y probablemente otros manejan esta situación con gracia, pero ZFS se resiste.

Si tiene mala suerte y no tiene RAM ECC instalada en el sistema donde está importando el grupo, entonces ZFS 'intentar corregir cualquier error que encuentre podría empeorar las cosas , aunque las opiniones difieren sobre si esto es realmente un riesgo real en la práctica. Personalmente, considero que cualquier dato que me preocupe lo suficiente como para protegerlo con ZFS e instantáneas y redundancia y copias de seguridad a nivel de almacenamiento y otras cosas que no merecen la protección que ofrece ECC RAM también, pero muchas PC no tienen ECC RAM.

Por lo tanto, puede importar la piscina en el modo de sólo lectura, con una raíz alternativa específica para evitar que pisar cualquier otra cosa es dedos de los pies, pero hay que tener en cuenta que no es necesariamente verdad de sólo lectura en un sentido forense. (Sin embargo, se asegurará de que no cambie accidentalmente nada en el grupo). Para realizar una importación de solo lectura, suponiendo que el grupo tenga un nombre tanky que los nodos del dispositivo estén disponibles /dev, debería usa un comando como:

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

Esto se verá en /devnada la celebración de una piscina de ZFS con el nombre tank, importarlos, fijando temporalmente la propiedad de agrupación readonlya on(lo que significa que serán rechazadas todas las escrituras iniciadas por el usuario) y establecer temporalmente su altrootpropiedad a /mnt/someplace. (Estos valores de propiedad son "temporales" en el sentido de que no se conservan en los discos como valores de propiedad actuales, por lo que si exporta y vuelve a importar el grupo sin ellos, los valores volverán a la normalidad. sin embargo, posiblemente se escriba en el historial del grupo, que una vez que se importa el grupo se puede ver conzpool history tank si lo desea.) Una vez que se haya importado el grupo, verá sus archivos en / mnt / en algún lugar y tendrá acceso normal de solo lectura a ellos, incluidas las instantáneas que ya se hayan realizado en los conjuntos de datos del grupo.

Dado su ejemplo, sospecho que usaría algo como:

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

Cuando haya terminado, recuerde exportar limpiamente el grupo:

# zpool export tank

o quizás

# zpool export zroot02

Eso desmontará todos los sistemas de archivos y otros conjuntos de datos dentro del grupo, vaciará todos los búferes (en la medida en que sea necesario enjuagarlos en primer lugar), marcará el grupo como no importado en todos los dispositivos constituyentes y realizará cualquier otra tarea de mantenimiento necesaria para garantizar que el grupo se puede mover de forma segura a un sistema diferente e importar allí más tarde.

un CVn
fuente
1
Si está realmente seguro de que lo que dice en su tercer párrafo es correcto, eso sería un error con la implementación BSD ZFS. La importación de solo lectura del grupo ZFS se diseñó para ser realmente de solo lectura, es decir, nunca intenta escribir o corregir datos o metadatos, incluido el historial del grupo. Ver arc.stillopensolaris.org/txt/PSARC_2010_306.txt
jlliagre
1
@jlliagre Estoy bastante seguro, pero podría haber sido en el contexto de alguna otra implementación de ZFS. Sin embargo, realmente no veo por qué diferirían en un aspecto tan fundamental; Creo que todas las implementaciones de código abierto de ZFS comparten una cantidad significativa de código que rastrea su linaje hasta Sun. Es posible que configure un tipo de entorno de prueba para esto y lo golpee con un palo y luego vea qué sucede, pero pasará algún tiempo antes de que pueda dedicar el tiempo para hacerlo.
un CVn