首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Btrfs快照大小太大。它们真的只包含差异吗?

Btrfs快照大小太大。它们真的只包含差异吗?
EN

Stack Overflow用户
提问于 2022-07-06 09:16:48
回答 1查看 332关注 0票数 0

我对牛快照机制没有很好的理解,但希望它们包含所有具有一个父卷的子卷之间的差异和共享数据。

我制作了一个脚本来检查btrfs快照、磁盘空间的消耗。

代码语言:javascript
运行
复制
#!/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

跑完之后,我展示了它们的大小和我得到的:

代码语言:javascript
运行
复制
❯ 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快照进行了相同的测试,它们占用了较小的磁盘空间。

EN

回答 1

Stack Overflow用户

发布于 2022-08-22 15:58:34

从用户的角度来看,btrfs快照只是包含快照创建时子卷的文件和内容的简单目录。您可以像其他目录一样正常地访问它们。

因此,您使用的userland工具将报告快照中各个文件的大小,就像任何其他文件一样。如果您创建相同子卷的10个快照,那么userland工具(如du )将为每个快照报告相同的总大小,并且对所有10个快照进行总结,将报告磁盘使用率为初始子卷大小的10倍。

但是:由于这些子卷的性质,快照中包含的文件实际上都在磁盘上共享相同的数据块。因此,尽管du将报告10倍的总大小,但它只在磁盘上使用过一次。

复制写入工作的方式是,文件的新副本(例如创建的cp --reflink)或新快照最初只不过是指向磁盘上与原始文件/子卷相同的物理数据的新指针。因此,新文件将不使用任何额外的磁盘空间(除了一些额外的元数据)。

只有当数据被更改时,新的附加数据才被写入磁盘上的新位置,文件/快照的指针被更新以包含该数据块。数据的所有未更改部分仍与原始副本共享。

这就是为什么创建快照非常快,并且几乎不使用额外的磁盘空间的原因。但是随着时间的推移,快照使用的磁盘空间可能会增加,因为它的引用数据块与原来的子卷不同,并且实际上共享的数据块越来越少。

如果您想查看各个子卷之间共享的/唯一的数据量,可以使用btrfs的配额支持特性

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72880856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档