我有一个系统,它会定期创建 btrfs 快照并删除旧快照。今天,我开始收到警告,说系统无法删除一些旧快照。
这是我得到的输出:
root@machine:/path# btrfs sub del 2014-10-26--01-50-01-@ten_minutely
Delete subvolume '/path/2014-10-26--01-50-01-@ten_minutely'
ERROR: cannot delete '/path/2014-10-26--01-50-01-@ten_minutely'
我可以毫无问题地创建和删除新的快照 - 只有今天创建的几个快照表现出这种行为。
权限看起来没问题。Syslog 没有显示任何相关内容。我检查了一下btrfs filesystem df
,文件系统有可用空间 - 既可用于元数据,也可用于数据。
删除命令的 strace 显示:
#...
ioctl(3, 0x5000940f, 0xffa1d1f0) = -1 ENOTEMPTY (Directory not empty)
close(3) = 0
#...
我可以采取哪些进一步措施来调查原因?
答案1
经过一番挖掘,我找到了问题的根源
在无法删除的快照中,有一个子卷- 显然是另一个快照。创建定期快照的系统必须针对同一路径运行两次 - 从而创建第二个快照里面第一个,而不是采用这个名字。
为了记录,我正在使用btrfs-快照旋转通过普通的 cron。由于我有多个快照频率,因此两个必须在同一秒运行。一个潜在的解决方案是切换到anacron
。