我遇到了一个非常奇怪的 Btrfs“发送”文件引用链接问题,经过多次尝试,我找到了详细信息:
首先,我创建了一个名为“1”的子卷:
btrfs subvolume create 1
并在其中添加一个文件:
dd if=/dev/urandom of=1/a bs=64 count=3110017
现在通过 制作只读快照sudo btrfs subvolume snapshot -r 1 1_ro0
,然后执行cp --reflink=always 1/a 1/b
,再次制作 ro 快照:sudo btrfs subvolume snapshot -r 1 1_ro1
。现在计算“btrfs send”的数据大小:
sudo btrfs send -p 1_ro0 1_ro1 | wc -c
它输出64864765
,大约为 61.9MiB。这太不正常了 - 我只是使用 reflink 复制它,我不知道为什么“btrfs send”输出这么多数据。
但是,如果将count
上面的 indd
替换为3110016
(3110017-1),然后再次执行上面的例程,使用wc -c
“btrfs send”,您可以得到 604(604 B),只有 604 字节,这就是我所期望的。
我还制作了一个 bash 脚本来执行这两个测试:
#!/bin/bash
btrfs subvolume create 1
rm -rf 1/*
dd if=/dev/urandom of=1/a bs=64 count=3110017
sudo btrfs subvolume snapshot -r 1 1_ro0
cp --reflink=always 1/a 1/b
sudo btrfs subvolume snapshot -r 1 1_ro1
sudo btrfs send -p 1_ro0 1_ro1 | wc -c
sudo btrfs subvolume delete 1_ro0 1_ro1
rm -rf 1/*
dd if=/dev/urandom of=1/a bs=64 count=3110016
sudo btrfs subvolume snapshot -r 1 1_ro0
cp --reflink=always 1/a 1/b
sudo btrfs subvolume snapshot -r 1 1_ro1
sudo btrfs send -p 1_ro0 1_ro1 | wc -c
sudo btrfs subvolume delete 1_ro0 1_ro1
rm -r 1
如果替换wc -c
为btrfs receive --dump
检查“btrfs send”输出数据,则使用 dd3110016
值,它将输出一些“克隆”条目,如下所示:
clone ./1_ro1/b offset=0 len=134217728 from=./1_ro1/a clone_offset=0
clone ./1_ro1/b offset=134217728 len=64823296 from=./1_ro1/a clone_offset=134217728
...
但对于 dd 值 3110017,它输出:
write ./1_ro1/b offset=197918720 len=49152
write ./1_ro1/b offset=197967872 len=49152
write ./1_ro1/b offset=198017024 len=49152
write ./1_ro1/b offset=198066176 len=49152
write ./1_ro1/b offset=198115328 len=49152
write ./1_ro1/b offset=198164480 len=49152
... (so many more)
其中包含一堆“写入”条目。
我也搜索并注意到这个网站:https://www.spinics.net/lists/linux-btrfs/msg105951.html,这就像谈论文件漏洞,但就我而言,显然不可能。
这太奇怪了,我不知道我错过了什么。
我的btrfs-progs
版本是5.18.1-1
以及安装选项/proc/mount
:rw,relatime,space_cache=v2,subvolid=5,subvol=/
谢谢!