【问题标题】:du counting hardlinks towards filesize?du 计算文件大小的硬链接?
【发布时间】:2013-11-13 10:55:51
【问题描述】:

我有一个备份系统,它创建以 Unix 时间戳命名的目录,然后使用硬链接系统(rsync 中的--link-dest)创建增量备份,所以通常第一个备份非常大,然后以后的备份是分数一样大。

这是我当前备份的输出:

root@athos:/media/awesomeness_drive# du -sh lantea_home/*
31G lantea_home/1384197192
17M lantea_home/1384205953
17M lantea_home/1384205979
17M lantea_home/1384206056
17M lantea_home/1384206195
17M lantea_home/1384207349
3.1G    lantea_home/1384207678
14M lantea_home/1384208111
14M lantea_home/1384208128
16M lantea_home/1384232401
15G lantea_home/1384275601
43M lantea_home/1384318801

一切似乎都是正确的,但是,以最后一个目录lantea_home/1384318801为例:

root@athos:/media/awesomeness_drive# du -sh lantea_home/1384318801/
28G lantea_home/1384318801/

我一直有这种行为,为什么第二个 du 命令将目录视为 28G?

注意 - 输出与 -P 和 -L 标志保持相同。

【问题讨论】:

    标签: linux diskspace du


    【解决方案1】:

    硬链接是对同一文件的真实引用(由其 inode 表示)。 “原始”文件和指向它的硬链接也没有区别。两个文件具有相同的状态,both 都是对该文件的引用。移除其中一个可以让另一个保持完整。只有删除最后一个硬链接才会最终删除文件并释放磁盘空间。

    所以如果你问du 它只在一个目录中看到了什么,它并不关心其他地方是否有指向相同内容的硬链接。它只是计算所有文件的大小并将它们总结起来。只有在考虑的目录中的硬链接不会被多次计算。 du 就是这么聪明(并非所有程序都必须如此)。

    所以实际上,目录 A 的 du 大小可能为 28G,目录 B 的大小可能为 29G,但它们加起来仍然只占用 30G,如果你问 du A 和 B 的大小,你会得到那个号码。

    【讨论】:

    • 我想我没有给 du 足够的信任,我不会想到这一点。谢谢!
    • 因为du 只计算它遇到的同一个inode 的第一个硬链接,所以我喜欢连续给它目录:$ du -hc --max-depth=0 dirA dirB 29G /dirA 1G /dirB 30G total
    【解决方案2】:

    并且使用开关“-l”du 也计算每个子目录中的硬链接,所以我可以看到整个备份有多大,而不仅仅是增量增量。

    【讨论】:

    • 多一点解释可能会帮助其他程序员理解它是如何工作的。
    • 这才是真正的答案
    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    相关资源
    最近更新 更多