有没有办法获得文件系统中某个用户拥有的所有文件及其大小的列表?我的意思是,不是通过使用或类似的工具遍历目录树find
,因为我已经这样做了,并且似乎存在这些工具找不到的隐藏文件。我想要一个直接迭代文件系统索引节点的工具。
上下文:我在 CentOS 7.9 服务器中的配额有问题。我在某个文件系统上有 1100GB 的给定配额/share/storage
,并且我的已用空间以每分钟 100MB(大约)的速度永久增长,即使我没有登录服务器,也没有我拥有的进程。所以我现在几乎所有的空间都用完了。但是,如果我执行$ du /share/storage/user
,它会报告只有 556GB。
我知道可能有我拥有的文件,但它们可能位于其他目录中(例如/tmp
或其他用户帐户中的其他目录)。我检查了所有这些,但没有发现任何东西。
我检查了正在写入的打开文件lsof
,但也没有找到任何内容。
所以我的想法是获得索引节点列表和这些文件的大小,然后在一段时间后将其与列表进行比较。
注意:我拥有服务器的 root 访问权限。
服务器是 HPC 集群的前端,因此计算节点可以通过 NFS 在文件系统上写入。但是我检查了计算节点中当前没有进程。
答案1
我们已经发现问题了。计算节点中运行的进程不断写入文件(文件大小达到 >500GB)。该文件对应的目录在前端被删除,并且由于某种原因进程不断从计算节点写入该文件。一旦进程被终止,文件的空间就被释放。
因此,在这种情况下,我建议在计算节点中查找陈旧进程。
编辑:关于我发布的问题(find
例如遍历所有索引节点而不遍历文件系统本身),我没有尝试,但似乎你可以使用 df 获取文件系统的索引节点数量:
[mstorti@seshat ~]$ df -i /share/storage/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 45753856 26022211 19731645 57% /share/storage
然后我猜你可以循环遍历所有可能的索引节点(从1到45753856),然后对于每个索引节点检查每个索引节点是否已分配(从你可以使用的shell debugfs
),然后存储所有当前的索引节点及其文件中的大小。然后稍后,你做同样的事情并进行比较,幸运的是你可以找到占用空间的文件。
然而,正如我之前所说,我认为最好使用lsof
,但请记住在集群中的所有计算节点中都这样做。