我对牛快照机制没有很好的理解,但希望它们包含所有具有一个父卷的子卷之间的差异和共享数据。
我制作了一个脚本来检查btrfs快照、磁盘空间的消耗。
#!/usr/bin/zsh
for i in {1..2000}
do
echo 'line'$i >> /btrfs/test-volume/btrfs-doc.txt
/usr/bin/time -f "execution time: %E" btrfs subvolume snapshot /btrfs/test-volume /btrfs/snapshots/test-volume-snap$i
done
跑完之后,我展示了它们的大小和我得到的:
❯ btrfs filesystem df /btrfs
Data, single: total=8.00MiB, used=6.84MiB
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=102.38MiB, used=33.39MiB
GlobalReserve, single: total=3.25MiB, used=0.00B
❯ btrfs filesystem du -s /btrfs
Total Exclusive Set shared Filename
18.54MiB 6.74MiB 36.00KiB /btrfs
❯ df -h /btrfs
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgstoragebox-btrfs 2.0G 77M 1.8G 5% /btrfs
❯ du -sh /btrfs
20M /btrfs
❯ ll /btrfs/test-volume/btrfs-doc.txt
-rw-r--r-- 1 root root 17K Jul 6 14:50 /btrfs/test-volume/btrfs-doc.txt
❯ tree -hU /btrfs/snapshots
/btrfs/snapshots
├── [ 26] test-volume-snap1
│ └── [ 6] btrfs-doc.txt
├── [ 26] test-volume-snap2
│ └── [ 12] btrfs-doc.txt
├── [ 26] test-volume-snap3
│ └── [ 18] btrfs-doc.txt
...
├── [ 26] test-volume-snap1998
│ └── [ 16K] btrfs-doc.txt
├── [ 26] test-volume-snap1999
│ └── [ 16K] btrfs-doc.txt
└── [ 26] test-volume-snap2000
└── [ 16K] btrfs-doc.txt
2000 directories, 2000 files
所有的实用程序计算的大小不同,我不能说/btrfs/snapshots
dir实际消耗了多少磁盘空间,但我看到它比文件/btrfs/test-volume/btrfs-doc.txt
的至少两倍大得多。目前,我认为应该是双倍大小,以防btrfs快照包含差异和共享数据链接。
相比之下,我对LVM快照进行了相同的测试,它们占用了较小的磁盘空间。
发布于 2022-08-22 15:58:34
从用户的角度来看,btrfs
快照只是包含快照创建时子卷的文件和内容的简单目录。您可以像其他目录一样正常地访问它们。
因此,您使用的userland工具将报告快照中各个文件的大小,就像任何其他文件一样。如果您创建相同子卷的10个快照,那么userland工具(如du
)将为每个快照报告相同的总大小,并且对所有10个快照进行总结,将报告磁盘使用率为初始子卷大小的10倍。
但是:由于这些子卷的性质,快照中包含的文件实际上都在磁盘上共享相同的数据块。因此,尽管du
将报告10倍的总大小,但它只在磁盘上使用过一次。
复制写入工作的方式是,文件的新副本(例如创建的cp --reflink
)或新快照最初只不过是指向磁盘上与原始文件/子卷相同的物理数据的新指针。因此,新文件将不使用任何额外的磁盘空间(除了一些额外的元数据)。
只有当数据被更改时,新的附加数据才被写入磁盘上的新位置,文件/快照的指针被更新以包含该数据块。数据的所有未更改部分仍与原始副本共享。
这就是为什么创建快照非常快,并且几乎不使用额外的磁盘空间的原因。但是随着时间的推移,快照使用的磁盘空间可能会增加,因为它的引用数据块与原来的子卷不同,并且实际上共享的数据块越来越少。
如果您想查看各个子卷之间共享的/唯一的数据量,可以使用btrfs的配额支持特性。
https://stackoverflow.com/questions/72880856
复制相似问题