に読み取り専用サブボリュームを持つBTRFSファイルシステムAがあるとします<mount-point-A>/snaps/good-one
。コンテンツ<mount-point-B>/
サブボリュームは - 通常の読み書きモードになっています。
btrfs send/receive
採用を通じてこれを達成する方法はありますか?サブボリュームを読み取り専用で受信し、どういうわけか<mount-point-B>/good-one
読み取り/書き込みに切り替えるかのように<mount-point-B>/
?それとも、戻りますかrsync
?
答え1
読み取り専用サブボリュームを受信したら、スナップrw
ショットを作成し、オプションで読み取り専用サブボリュームを削除します。
答え2
サブボリュームは自動的に読み取り専用に設定されますが、btrfs receive
いつでも変更できます。ただし、これにより、コピーがオリジナルとして持っているすべての保護が削除されます。
受信が完了したら、次のコマンドを実行します<mount-point-B>
。
sudo btrfs property set <mount-point-B> ro false
これでバックアップの整合性を損なわないようにするには、rw
@Ginnungagapが提案したようにスナップショットを作成します。
答え3
長い話を短く
btrfs sub set-default <VolumeID> ./
完全な答え
以下で読み取り専用ボリュームを受け取ったとします<mount-point-B>/good-one
。
読み書きできるようにします。
cd mount-point-B
sudo btrfs property set -ts ./good-one ro false
IDを入手してください:
sudo btrfs sub show ./good-one | grep "Subvolume ID"
ルートに置きます。
sudo btrfs sub set-default <Subvolume ID> ./
ルートボリュームの変更を確認するには、再マウントする必要があります。元のルートボリュームは非表示になります。
以下は完全なテストスクリプトです。
#!/bin/bash
sudo modprobe loop
cd /tmp
fallocate -l 128M btrfs1 && \
fallocate -l 128M btrfs2 && \
sudo losetup /dev/loop0 ./btrfs1 && \
sudo losetup /dev/loop1 ./btrfs2 && \
sudo mkfs.btrfs -q /dev/loop0 && \
sudo mkfs.btrfs -q /dev/loop1 && \
mkdir btrfs1m && \
mkdir btrfs2m && \
sudo mount /dev/loop0 btrfs1m && \
sudo mount /dev/loop1 btrfs2m && \
sudo touch btrfs1m/file1 && \
sudo touch btrfs2m/file2 && \
sudo btrfs sub snapshot -r btrfs1m/ btrfs1m/s1 && \
sudo btrfs send btrfs1m/s1 | sudo btrfs receive btrfs2m/ && \
sudo umount /dev/loop0 && \
sudo losetup -d /dev/loop0 && \
rm btrfs1 && \
rmdir btrfs1m && \
cd btrfs2m
VID=$(sudo btrfs sub show ./s1 | grep "Subvolume ID" | tr -dc '0-9')
sudo btrfs property set -ts ./s1 ro false && \
sudo btrfs sub set-default $VID ./ && \
cd .. && \
sudo umount /dev/loop1 && \
sudo mount /dev/loop1 btrfs2m && \
echo "Now the received volume sits at the root:" && \
ls btrfs2m && \
sudo mv btrfs2m/file1 btrfs2m/renamed && \
sudo umount /dev/loop1 && \
sudo losetup -d /dev/loop1 && \
rm btrfs2 && \
rmdir btrfs2m