btrfs,从快照进行备份时臭名昭著的 ENOSPC 错误

btrfs,从快照进行备份时臭名昭著的 ENOSPC 错误

我的系统是 Fedora 19 x86_64 w/3.10.7 内核。我正在尝试使用 btrfs 快照来备份我的/,如下所示:

#!/bin/bash
btrfs subvolume snapshot / /snap/
tar -cvf - /snap 2>/dev/null | /opt/bup/bin/bup split -n nb -vv
btrfs subvolume delete /snap

不幸的是,系统在此过程中间的某个地方耗尽了可用空间。btrfs filesystem df /报告实际上有一些可用空间:

[root@cellar ~]# btrfs filesystem df /
Data: total=107.21GB, used=75.06GB
System, DUP: total=8.00MB, used=20.00KB
System: total=4.00MB, used=0.00
Metadata, DUP: total=3.50GB, used=3.00GB
Metadata: total=8.00MB, used=0.00

但我既不能创建也不能删除单个文件。每次运行脚本时,这都是 100% 可重现的。在大约 30 分钟随机尝试删除任何不重要的内容后,我通常能够从这种情况中恢复。看来问题的根源是元数据空间不足。当没有快照时,我的系统使用大约 2.39-2.40GB 的元数据空间。

这对我来说看起来像是一个错误。为什么此时根本没有大量写入的情况下,快照需要 0.6GB 的元数据空间?为什么 btrfs 无法使用剩余的 0.5GB 元数据空间?我尝试使用btrfs balance,但它没有重新定位任何东西,所以我猜 FS 已经完美平衡了。是否可以以某种方式保留更多元数据空间? (可能我需要重新格式化整个分区,但我无法在mkfs.btrfs手册中找到与元数据空间大小相关的任何内容)。我想我可以使用选项设置更大的节点大小-n,但我不确定它是否有帮助。

答案1

嗯,BTRFS 快照默认不是只读的。我尝试使用它btrfs subvolume snapshot -r来创建只读快照,这很有帮助。元数据空间不再短缺。

相关内容