zfs rename / move root filesystem to child


9

同様の質問が存在しますが、mvこの場合は純粋な「移動」ではなく「コピーしてから削除」として機能するため、解決策(を使用)はひどいです。

そこで、私はプールを作成しました:

zpool create tank /dev/loop0

そこにある別のストレージからデータを直接rsyncして、データがにあるようにしました/tank

zfs list
NAME      USED  AVAIL  REFER  MOUNTPOINT
tank      591G  2.10T   591G  /tank

今では、/tankファイルシステムに直接ではなく、子ファイルシステムにデータを置く必要があることに気づきました。

では、プール内の子になるように、既存のルートファイルシステムを移動または名前変更するにはどうすればよいでしょうか。

単純な名前変更は機能しません:

zfs rename tank tank/mydata
cannot rename to 'tank/mydata': datasets must be within same pool

(ところで、実際にプールが1つしかないのに、データセットが同じプール内にないというメッセージが表示されるのはなぜですか。)

すべてのデータのコピー(mvまたはデータセット全体を別のデバイスに送信して戻す)を伴う解決策があることは知っていますが、シンプルでエレガントな方法はありませんか?

この段階ではスナップショットは気にしないことに注意してください(まだ気にする必要はありません)。

回答:


4

(コメントのメモを参照してください、これは機能しますが、最初のスナップショットを削除することはできないため、良い解決策ではありません)

ZFSでは、これは驚くほど簡単です。スナップショット、クローン、そしてrmだけです。余分なスペースやコピー時間は必要ありません。

zfs snapshot tank@mydata
zfs clone tank@mydata tank/newname
zfs set mountpoint=/beep/boop tank/newname
rm -rf /tank/*

zpoolに他のファイルシステムがある場合のマウントポイントを変更しない場合は、rm -rfを実行するときに注意してください。新しいファイルシステム(/ tank / newname)または他の子ファイルシステム(tank / *)の内容を誤って再帰的に削除したくない場合。ファイルがルートfs(/ tank /)になく、新しいファイルシステムにのみあることを確認したら、その初期スナップショットを削除することもできます。

zfs delete tank@mydata

もっともらしい答えのように思えます(データを移動せずに新しいデータセットに入れる他の方法は考えられません)が、残念ながらこの元のスナップショットを削除することはできません。クローンにはいくつかの厄介な副作用があります。新しいデータセットはそれに依存しているため、tank @ mydataを削除することはできません。新しいデータセットをプロモートして、tank @ mydataをtank / newname @ mydataに移動できますが、依存関係を入れ替えたため、新しいデータセットを削除しようとすると、「データセットはすでに存在しています」という面白いエラーが発生します(少なくともFreeBSDでは、OSではなくZFS固有である可能性が高いと思います)。
マットUSD

@USDMatt:あなたは完全に正しいです。サブファイルシステム(tank / a-> tank / a @ snap-> tank / asnap-clone-> tank / renamed-asnap-clone)で作業している場合、これは完全に機能しますが、ルートのルートで作業している場合は機能しませんzpool。バグのように感じます。プールのルートファイルシステムをいっぱいにしないもう1つの理由として、それをチョークしてください)。
notpeter

4

@USDMattによって文書化された問題を考えると、ZFS送信/受信がおそらく最善の方法です。

zfs snapshot tank@snap
zfs send tank@snap | zfs receive tank/anotherfs
zfs set mountpoint=/beep/boop tank/anotherfs
rm -rf /tank/*
zfs destroy tank@snap

タンクzpoolに他のファイルシステムがある場合のマウントポイントを変更しない場合は、rm -rfを実行するときに注意してください。新しいファイルシステム(/ tank / newname)または他の子ファイルシステム(/ tank / *)の内容を誤って再帰的に削除したくない場合。


0

単純なエレガントな方法はないと思います...マウントポイントを変更するだけでいいのですが...

mkdir /tank
zfs set mountpoint=/tank/mydata <possibly renamed tank set>

または、タンクの名前を変更して、必要な場所にマウントします...

それか、または適切な場所にファイルシステムを作成し、cp、mv、またはzfsで送受信します...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.