假设我有一个 BTRFS 文件系统 A,其只读子卷位于<mount-point-A>/snaps/good-one
.我想创建一个 BTRFS 文件系统 B(可以在同一台机器或另一台机器上),其中包含内容该子卷的位于<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