Comment monter un système de fichiers ZFS externe sans encombrer / altérer le système de fichiers actuel ou externe

11

J'utilise FreeBSD 10.2 en utilisant ZFS sur root comme système de fichiers (zroot01) . J'ai un disque dur externe avec un système de fichiers ZFS d'un autre système FreeBSD 10.2 (zroot02) que je souhaite monter temporairement, en lecture seule, afin de pouvoir en extraire certains fichiers, puis le déconnecter par la suite. Je ne veux pas que le système ZFS externe s'encombre ou remplace mon système de fichiers actuel, ni que les données sur l'extérieur soient corrompues / modifiées non plus.

Pour démontrer ce que j'essaie d'accomplir, si j'utilisais UFS, je ferais quelque chose comme ceci:

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

... où se /dev/ada0s2trouve la partition sur mon disque externe et se /mnt/my-fun-mountpointtrouve dans le /mntrépertoire de mon système d'exploitation existant.

L'ensemble de la recherche et de la lecture des pages de manuel n'a pas fourni de méthode claire pour le faire. Quelles réponses que je ne trouve fini par prendre sur mon système de fichiers en cours et corrompant au - delà de la réparation - évidemment pas le résultat que je cherche. J'ai essayé cela il y a quelque temps, donc je ne me souviens pas des commandes que j'ai essayées, malheureusement.

Pouvez-vous s'il vous plaît fournir des conseils clairs sur la façon de procéder? Merci d'avance pour votre aide.

Sera
la source

Réponses:

13

Eh bien, cela dépend vraiment de la façon dont vous souhaitez que la piscine soit en lecture seule. Et non, ce n'est pas une blague.

Tout d'abord, un peu de terminologie: dans ZFS, vous importez un pool et montez éventuellement les (tous) systèmes de fichiers qu'il contient. Vous pouvez importer une piscine sans monter des systèmes de fichiers en passant -Nà zpool importpuis monter plus tard tous les systèmes de fichiers souhaités à l' aide zfs mount. (Il s'agit d'un scénario parfaitement valide si, par exemple, vous souhaitez accéder à un seul système de fichiers parmi plusieurs, ou si vous voulez faire quelque chose qui ressemble à un nettoyage hors ligne du pool.)

ZFS n'est pas un grand fan de l'accès en lecture seule. Par exemple, si ZFS détecte une erreur qu'il est capable de réparer, je pense qu'il va réparer l'erreur et écrire les données réparées sur le disque même si vous avez importé le pool en lecture seule. D'après ce que je comprends, dans le langage ZFS, la "lecture seule" s'applique uniquement à l' état visible par l' utilisateur du pool et de ses jeux de données. Si, d'autre part, vous faites une copie binaire du disque dans un fichier (ou un ensemble de fichiers), rendez ces fichiers vraiment en lecture seule et essayez d'importer le pool à partir de là, ZFS ne pourra pas importer le fichier piscine du tout, peu importe vos efforts. Si vous rendez les fichiers accessibles en écriture, cela fonctionnera correctement. (J'ai en fait essayé il y a quelques semaines, mais en utilisant un zvol, et ZFS a refusé avec véhémencepour importer le pool. Lorsque j'ai défini le zvol en lecture / écriture au lieu de lecture seule, le pool a été importé correctement.) D'autres systèmes de fichiers comme (sous Linux) ext4 et probablement d'autres gèrent cette situation quelque peu gracieusement, mais ZFS rechigne.

Si vous n'avez pas de chance et que la RAM ECC n'est pas installée dans le système sur lequel vous importez le pool, la tentative de ZFS de corriger les erreurs rencontrées pourrait en fait aggraver les choses , bien que les avis divergent quant à savoir s'il s'agit réellement d'un risque réel. en pratique. Personnellement, je suis d'avis que toutes les données que je tiens suffisamment à protéger avec ZFS et les instantanés et la redondance et les sauvegardes au niveau du stockage et ainsi de suite méritent également la protection offerte par la RAM ECC, mais de nombreux PC n'ont pas de RAM ECC.

Ainsi, vous pouvez importer le pool en mode lecture seule, avec une racine alternative spécifique pour l'empêcher de marcher sur les autres orteils, mais vous devez être conscient qu'il n'est pas nécessairement vraiment en lecture seule dans un sens médico-légal. (Cependant, cela garantira que vous ne modifiez rien accidentellement dans le pool.) Pour effectuer une importation en lecture seule, en supposant que le pool est nommé tanket que le ou les nœuds de périphérique sont disponibles dans /dev, vous devez utilisez une commande comme:

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

Cela recherchera /devtout ce qui contient un pool ZFS avec le nom tank, l'importera, définira temporairement la propriété du pool readonlysur on(ce qui signifie que toutes les écritures initiées par l'utilisateur seront rejetées) et définira temporairement sa altrootpropriété sur /mnt/someplace. (Ces valeurs de propriété sont "temporaires" dans le sens où elles ne sont pas conservées sur le (s) disque (s) en tant que valeurs de propriété actuelles, donc si vous exportez et réimportez le pool sans elles, les valeurs reviendront à la normale. Elles pourraient éventuellement être écrit dans l'historique du pool, qui une fois le pool importé, vous pouvez le consulter aveczpool history tank si vous êtes si enclin.) Une fois le pool importé, vous verrez vos fichiers sous / mnt / quelque part et y aurez un accès normal en lecture seule, y compris tous les instantanés déjà créés sur les jeux de données du pool.

Compte tenu de votre exemple, je soupçonne que vous utiliseriez quelque chose comme:

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

Lorsque vous avez terminé, n'oubliez pas d'exporter proprement le pool:

# zpool export tank

ou peut-être

# zpool export zroot02

Cela démontera tous les systèmes de fichiers et autres ensembles de données du pool, videra tous les tampons (dans la mesure où tout besoin de vidage en premier lieu), marquera le pool comme non importé sur tous les périphériques constitutifs et effectuera toutes les autres tâches de maintenance nécessaires pour garantir que la piscine peut être déplacée en toute sécurité vers un autre système et y être importée plus tard.

un CVn
la source
1
Si vous êtes vraiment sûr que ce que vous déclarez dans votre troisième paragraphe est correct, ce serait un bogue avec l'implémentation BSD ZFS. L'importation en lecture seule du pool ZFS a été conçue pour être vraiment en lecture seule, c'est-à-dire qu'elle n'essaie jamais d'écrire ou de corriger des données ou des métadonnées, y compris l'historique du pool. Voir arc.stillopensolaris.org/txt/PSARC_2010_306.txt
jlliagre
1
@jlliagre Je suis tout à fait sûr, mais cela pourrait avoir été dans le contexte d'une autre implémentation ZFS. Cependant, je ne vois pas vraiment pourquoi ils différeraient sur un aspect aussi fondamental; Je crois que toutes les implémentations ZFS open-source partagent une quantité importante de code qui retrace sa lignée jusqu'à Sun. Je pourrais simplement mettre en place une sorte d'environnement de test pour cela et le pousser avec un bâton, puis voir ce qui se passe, mais il faudra un certain temps avant que je puisse consacrer du temps à le faire.
un CVn du