btrfsルートサブボリュームを受信したスナップショットに置き換える方法は?

btrfsルートサブボリュームを受信したスナップショットに置き換える方法は?

既存のフルディスクbtrfs(パーティション化されていない)ファイルシステムをbcacheに変換したいと思います。
これを行うには、データを移動してドライブを再フォーマットする必要がありました。
ほんの数ステップでこれを行うのに十分なハードドライブ容量があります。

私はbtrfsを使用しているので、これを簡単にするとbtrfs send思いました。btrfs receive

まず、変換したいファイルシステムの読み取り専用スナップショットを作成し、それを別のファイルシステムのサブボリュームに送信し始めました。

私にとって不明な点は、スーパーブロック変換が発生した後に対応する冗長サブボリュームを元のディスクに復元する方法です。

マンページにはbtrfs receive新しいサブボリュームのみを作成でき、プロセスが完了するとそのサブボリュームを読み取り専用にすることができます。

それでは、受信したスナップショットで書き込み可能な新しいルートサブボリュームを置き換える方法は?

答え1

それでは、受信したスナップショットで書き込み可能な新しいルートサブボリュームを置き換える方法は?

あなたはできません。

あなたの場合、トップレベル(ルート)サブボリューム(ID 5)は/Linuxファイルシステムのボリュームであり、隣接するものはありません。ご存知のように、btrfs-receive読み取り専用サブボリュームを作成するため、読み取り専用サブボリュームから読み取り/書き込みスナップショットサブボリュームを作成する必要があります。これを行うには、外部からサブボリュームを作成できる必要があります/。置き換えることはできません。トップレベルのサブボリュームの理由です。

次のように言われました。

読み取り専用スナップショットを作成しました。FSまず変換して次に送りたいです。サブボリューム他のfsから。

しかし、あなたがすることは読み取り専用のスナップショットを作成することです。サブボリューム、全体のBTRFSファイルシステムではありません。トップレベルのスナップショットを作成する方法はわかりません。奇妙な。

partclone最善の方法は、ファイルシステム全体をバックアップしてから復元するなどのツールを使用することです。それ以外の場合は、サブボリュームを変更する必要があります。ボールでリストしたもの~から平らな、これがあなたが持っているものです入れ子になった。入れ子になったレイアウトを使用すると、次のような結果が得られます。

/ (top-level)
|
|__ /rootfs (subvolume)
|   |
|   _/home
|
|__ /rootfs-backup (read-only subvolume, which you can delete later)
|   |
|   _/home

ネストしたレイアウトを使用すると、ファイルシステムのすべてのサブボリュームのスナップショットを作成できます(とにかく実行する必要がない最上位レベルを除く)。その後、ファイルシステム全体ではなくrootfsサブボリュームのみをマウントします。/たとえば、mount -t btrfs /dev/sda1 -o defaults,subvol=/rootfs

答え2

私が受け取るものは何でも新しい読み取り専用サブボリュームになります。これがBtrfsがどのように機能するかです。 Emmanuelが他の答えで示唆したように、これを別の方法で行う明確で直感的な方法はありません。

受信したサブボリュームをルートボリュームとして機能させる手順は次のとおりです。

cd /mnt/drv/receivedvolume
btrfs property set -ts . ro false # make it writeable
btrfs subvolume list . # take note of the ID of the volume, i'll use 123 here
btrfs subvolume set-default 123 /mnt/drv

より安心するために、インストールsubvolid=123オプション/etc/fstabやその他のインストールタスクを追加することもできます。

これが実際にシステムの問題である場合は、/ブートローダを再インストールする必要があるかもしれません

関連情報