web-dev-qa-db-ja.com

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

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

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

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

...どこ /dev/ada0s2は外付けドライブのパーティションであり、/mnt/my-fun-mountpoint の中に /mnt既存のオペレーティングシステムのディレクトリ。

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

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

11
Will B

まあ、それは本当にあなたがプールにしたい方法読み取り専用に依存します。いいえ、それは冗談ではありません。

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

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

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

そのため、読み取り専用モードでプールをインポートできます。特定の代替ルートを使用して、他のつま先を踏まないようにできますが、必ずしもである必要はないことに注意する必要があります法医学的な意味での読み取り専用。 (ただし、誤ってプール内の何かを変更しないようにします。)読み取り専用インポートを実行するには、プールの名前がtankであり、デバイスノードが/devで利用できる場合は、次のようなコマンドを使用します。

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

これは、tankという名前のZFSプールを保持しているものがないか/devを検索し、インポートして、プールプロパティreadonlyonに一時的に設定します(つまり、ユーザーが開始したすべての書き込みが拒否されます)、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

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

13
a CVn