DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

硬链接备份的 du 大小忽大忽小:先确定是否在同一次扫描中统计

多份硬链接备份一起运行 du 时,后面的目录可能很小;单独统计却变大。核对一次扫描的去重范围,区分集合总量、单份内容和重复计名。

用 rsync 的 link-dest 建立多份备份后,du -sh backup/* 显示后面的目录很小,单独统计同一个目录却大了很多。这种差异不一定表示备份重复复制了数据。GNU du 默认在一次扫描中只计算同一文件的一个硬链接;多个目录一起统计时,共享文件可能已经计入前面的目录。

以下针对 GNU coreutils 的 du 和实际使用硬链接的备份。其他 du 实现、文件系统快照、写时复制或压缩不能直接套用相同口径。

两次命令统计的集合不同

硬链接是同一文件的多个名称,不能把某一个名称当成唯一的原文件,再把其余名称当成没有内容的快捷方式。判断是否指向同一文件,要同时比较文件系统设备和 inode,而不只看文件名或字节数。

一次 du 扫描多个备份目录时,同一文件的空间只计一次。参数顺序影响它先遇到哪个名称,所以某个目录显示的小数值,不是这个目录内所有文件的独立完整大小,也不一定是这一备份创建时严格新增的数据量。

单独对后面的备份运行 du,是一次新的扫描。前面备份中的同一文件没有被这次扫描计过,因而会计入这个备份的结果。目录内容没有变化,两种统计仍可以不同。

需要总占用,还是需要每份备份的内容规模

如果想估计选定备份集合的占用,在同一次调用中列出这个集合,并保留总计。路径为示例:

du -shc -- /backup/snap-a /backup/snap-b

默认硬链接去重作用于这次扫描。每个目录的行可能随参数顺序变化,分析集合时应看 total 及整个扫描范围,不能把多个独立 du 调用的结果相加后声称都是不共享的磁盘占用。扫描期间备份仍在写入、文件不可读或目录被删除,也会使结果不完整,应核对错误信息和退出状态。

如果想看单份备份内的文件集合,可以单独统计它:

du -sh -- /backup/snap-b

该结果仍会去掉这份备份内部的重复硬链接。若确实需要每个名称都计一次,GNU du 的小写 l 可以改变这一规则:

du -shl -- /backup/snap-b

这是按名称重复计量的口径,不是证明物理磁盘上又存了一份数据。要评估导出到不保留硬链接关系的目标所需容量,还要考虑目标文件系统、文件实际长度、稀疏文件和导出工具行为,不能把一个 du 数字当作完整容量保证。

大写 L 和 P 控制符号链接是否跟随,与硬链接去重不同;因此用这两个选项切换,并不能解决这里的统计疑问。

没有共享 inode 时,继续查备份是否真的复用了文件

在两份备份中选择一个预期未变化的普通文件,读取其设备、inode 和硬链接数。如果设备与 inode 相同,就能确认这两个名称共享同一个文件;如果不同,不能仅凭内容相同认定是硬链接。

没有形成预期硬链接时,检查备份工具的实际参数、link-dest 路径、目标文件系统及文件是否满足复用条件。不要为了让 du 数字变小,直接把正在变化的业务文件与备份文件手工链接起来:共享同一文件意味着原地修改可能影响其他名称看到的内容,备份过程必须遵循工具和项目的保留策略。

du 依据操作系统报告的信息估算空间。即使硬链接判断正确,文件系统元数据、写时复制共享块、压缩、快照保留和开放文件等情况,也会使它与底层设备或 df 的数字不同。本场景先解释同一目录在两种扫描范围下的差异,不能据此推断其他空间占用已经排除。

清理前不要把小数值当成可释放空间

删除一份硬链接备份,只会移除其中的名称;其他备份仍引用的文件不会因此释放全部数据空间。仍有开放文件引用等情况时,实际释放还可能滞后。后面某份目录在一次联合扫描中很小,也不能据此认定它没有恢复价值。

本问题通常只需要纠正统计方法,无须重建或删除备份。验收时使用固定、完整且可读的扫描集合,记录参数与总计,并在预期共享文件上确认链接关系。如果确实需要清理,先按备份策略验证保留点可恢复,再制定删除范围;du 的统计口径不能代替恢复验证,也没有撤销删除备份的能力。