web-dev-qa-db-ja.com

zfs rename / move root filesystem to child

同様の質問 exists ですが、解決策(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、またはデータセット全体を別のデバイスに送信して戻す)を伴う解決策があることは知っていますが、シンプルでエレガントな方法はありませんか?

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

9
Anton

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

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
4
notpeter

@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/*)の内容を誤って再帰的に削除したくない場合。

4
notpeter

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

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

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

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

0
ewwhite