現在または外部のファイルシステムを変更/変更せずに外部ZFSファイルシステムをマウントする方法


11

ファイルシステム(zroot01)としてrootでZFSを使用して、FreeBSD 10.2を使用しています。一時的にマウントして読み取り専用にしたい別のFreeBSD 10.2システム(zroot02)の ZFSファイルシステムを備えた外付けハードディスクがあり、そこからいくつかのファイルを取得して、後で切断することができます。私はしませんクロバーに外部ZFSシステムをしたいか、私の現在のファイルシステムを置き換え、また私は、外部のデータがいずれかの変更/破損している可能性がしたいです。

私が達成しようとしていることを示すために、UFSを使用している場合は、次のようにします。

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

...どこ/dev/ada0s2私の外付けドライブ上のパーティションがあると/mnt/my-fun-mountpointしている/mnt私の既存のオペレーティングシステムのディレクトリ。

すべての検索とmanページの読み取りは、そうするための明確な方法を提供していません。私見つけた答え、結局、現在のファイルシステムを乗っ取って、修復できないほど破損してしまいました。明らかに、私が探している結果ではありません。しばらく前に試したので、残念ながら、どのコマンドを試したか覚えていません。

これを行う方法について明確なガイダンスを提供していただけますか?よろしくお願いします。

回答:


13

まあ、それは本当にプールをどのように読み取り専用にしたいかに依存します。いいえ、それは冗談ではありません。

まず、ちょっとした用語:ZFSでは、プールをインポートし、オプションでその中の(任意の)ファイルシステムをマウントします。あなたは渡すことによって、任意のファイルシステムをマウントせずにプールをインポートすることができます-Nzpool import、その後、後には、使用して任意のファイルシステムをマウントzfs mount。(たとえば、多数のファイルシステムから単一のファイルシステムにのみアクセスしたい場合、またはプールのオフラインスクラブに似た何かを実行したい場合、これは完全に有効なシナリオです。)

ZFSは、本当に読み取り専用アクセスの大ファンではありません。たとえば、ZFSが修復可能なエラーを検出した場合、プールを読み取り専用としてインポートした場合でも、エラーを修復し、修復されたデータをディスクに書き込みます。私の理解では、ZFS parlaceでは、「読み取り専用」はプールとそのデータセットのユーザーに表示される状態にのみ適用されます。一方、ディスクのバイナリコピーをファイル(またはファイルのセット)に作成し、それらのファイルを本当に読み取り専用にして、そこからプールをインポートしようとすると、ZFSはインポートできません。どんなに頑張っても、プールはまったくありません。ファイルを書き込み可能にすると、正常に動作します。(私は実際には数週間前にこれを試しましたが、zvolを使用していますが、ZFSは激しく拒否しましたプールをインポートします。zvolを読み取り専用ではなく読み取り/書き込みに設定すると、プールは正常にインポートされました。)(Linuxの)ext4のような他のファイルシステムやおそらく他のファイルシステムは、この状況をある程度優雅に処理しますが、ZFSはしのぎます。

運が悪く、プールをインポートするシステムにECC RAMがインストールされていない場合、ZFSが発生したエラーを修正しようとすると実際には事態が悪化する可能性がありますが、これが実際にリスクであるかどうかについては意見が異なります実際には。個人的に私は私が十分に気に任意のデータがZFSとスナップショットおよびストレージ・レベルの冗長性とを保護するという意見だバックアップおよびその他もろもろ値するもECC RAMによって提供される保護を、多くのPCは、ECC RAMを持っていません。

だから、あなたは何も他の人のつま先を踏んでから、それを維持するために、特定の代替ルートで、読み取り専用モードでプールをインポートすることができますが、それは必ずしもではないことに注意する必要があり、本当に読み取り専用のフォレンジック意味で。(ただし、誤ってプール内の何かを変更しないようにします。)読み取り専用のインポートを行うには、プールに名前が付けられtankており、デバイスノードがで使用可能であると想定し/devます。次のようなコマンドを使用します。

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

これは/dev、という名前のZFSプールを保持しているものを探し、tankそれをインポートし、一時的にプールプロパティreadonlyをに設定しon(つまり、ユーザーが開始したすべての書き込みが拒否されます)、そのaltrootプロパティを一時的にに設定します/mnt/someplace。(これらのプロパティ値は、現在のプロパティ値としてディスクに永続化されないという意味で「一時的」であるため、これらのプロパティ値なしでプールをエクスポートして再インポートすると、値は通常に戻ります。ただし、プールの履歴に書き込まれる可能性があります。プールがインポートされると、zpool history tank プールがインポートされると、/ mnt / someplaceの下にファイルが表示され、プール内のデータセットで既に作成されているスナップショットを含め、それらのファイルへの通常の読み取り専用アクセスが可能になります。

あなたの例を考えると、私はあなたが次の線に沿って何かを使用するのではないかと思います:

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

完了したら、プールをきれいにエクスポートすることを忘れないでください。

# zpool export tank

多分

# zpool export zroot02

これにより、プール内のすべてのファイルシステムと他のデータセットのマウントが解除され、すべてのバッファがフラッシュされ(最初にフラッシュする必要がある範囲まで)、プールがすべての構成デバイスにインポートされていないものとしてマークれ、その他の必要なハウスキーピングタスクが実行されます。プールを別のシステムに安全に移動し、後でそこにインポートできること。


1
3番目の段落で述べた内容が正しいと本当に確信している場合、それはBSD ZFS実装のバグです。ZFSプールの読み取り専用インポートは、真に読み取り専用になるように設計されています。つまり、プール履歴を含むデータやメタデータの書き込みや修正は決して行われません。arc.stillopensolaris.org/txt/PSARC_2010_306.txtを
jlliagre 2016

1
私は@jlliagre かなり確かに、それは可能性があるいくつかの他のZFSの実装のコンテキストにされています。しかし、なぜそれらがそのような根本的な側面で異なるのか、実際にはわかりません。私はすべてのオープンソースZFS実装が、その系統をSunまでさかのぼるかなりの量のコードを共有していると思います。このために、ある種のテスト環境をセットアップして、それを棒でつついて何が起こるかを確認するだけかもしれませんが、実際にそれを行うために時間を費やすには、しばらく時間がかかります。
CVn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.