btrfs 接收到/?

btrfs 接收到/?

假设我有一个 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

相关内容