文件数量与 inode 不匹配

文件数量与 inode 不匹配

我注意到 OCFS2 分区上已使用的 inode 数量约为 2800 万个。我移动了一个包含 518K 文件的文件夹,数量变成了 2200 万个。

以下脚本查找文件数量,约为 65,000 个,文件夹数量为 40。

我的问题是,2200万这个数字是从哪里来的?这正常吗?

[root@bopapp1 ~]# cat /etc/issue
Oracle Linux Server release 6.5
Kernel \r on an \m

[root@bopapp1 ~]# uname -a
Linux bopapp1 3.8.13-16.2.1.el6uek.x86_64 #1 SMP Thu Nov 7 17:01:44 PST 2013 x86_64 x86_64 x86_64 GNU/Linux

[root@bopapp1 ~]# df -i
Filesystem                        Inodes    IUsed    IFree IUse% Mounted on
/dev/mapper/vg_testapp2-lv_root  3276800   765283  2511517   24% /
tmpfs                            3089556        3  3089553    1% /dev/shm
/dev/sda1                         128016       55   127961    1% /boot
/dev/mapper/vg_testapp2-lv_home  4882432     9662  4872770    1% /home
/dev/dm-4                       39321087 22543323 16777764   58% /u
/dev/dm-5                       26214055  8319457 17894598   32% /usr/oracle

[root@bopapp1 ~]# cd /u

[root@bopapp1 u]# for i in `find . -type d `; do echo `ls -a $i 2> /dev/null | wc -l` $i; done | sort -n | awk '{sum+=$1} END{print "sum=",sum}'
sum= 62950

答案1

我刚刚意识到我们在这里讨论的是 OCFS2 集群文件系统,而不是常规的磁盘本地文件系统。本节特别适用于 OCFS2。请参阅下面的普通文件系统。

如果我创建一个新的空白 1GiB OCFS2 文件系统并挂载它,我会看到已用 inode 计数为 36378。

创建 100 个空文件后,我没有看到这个数字增加。

创建 10000 个文件后,我看到它增加到 72730 个。

如果我删除所有这些文件,该数字不会减少,但如果我卸载 FS 并将其重新安装,我会看到它更改为 45634。

因此,虽然我不能告诉你为什么,因为我不熟悉这个文件系统,但IUsed返回的计数似乎df与 i 节点的数量不匹配,或者在该文件系统上,i 节点不仅仅是用于文件,或者系统不跟踪其已使用或空闲 i 节点的数量,除非非常粗粒度。

如果您o2info --freeinode从 ocfs2-tools 1.8.2 或更高版本运行,您可以获得一个更接近预期的数字:

$ du -ax ///mnt/1 | grep -c ///
102
$ df -i /mnt/1
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/loop0     262144 45634 216510   18% /mnt/1
$ o2info --freeinode /mnt/1
Slot            Space           Free
  0             10240          10129
  1                 0              0
Total           10240          10129
$ echo $((10240-10129))
111

$ touch /mnt/1/a{1..100}
$ o2info --freeinode /mnt/1
Slot            Space           Free
  0             10240          10029
  1                 0              0
Total           10240          10029
$ o2info --freeinode /mnt/1 | awk 'END{print $2-$3}'
211

$ touch /mnt/1/b{1..20000}
$ o2info --freeinode /mnt/1
Slot            Space           Free
  0             20480            259
  1                 0              0
Total           20480            259
$ o2info --freeinode /mnt/1 | awk 'END{print $2-$3}'
20221

现在,对于传统文件系统......

要通过爬网目录条目来获取索引节点计数的匹配项,您需要根据索引节点编号跟踪您所看到的文件。

find /u -xdev -printf '%i\n' | sort -u | wc -l

du(至少 GNU 实现)还将跳过同一文件的多个实例(硬链接),因此您可以使用:

 du -xa ///u | grep -c ///

这应该会给你相同的结果find

我预计结果会略小于计数,df -i因为一些文件系统(包括ext4)有一些特殊的索引节点,这些索引节点未链接到任何内部使用的目录。

它还将无法计算已删除但仍被某些进程打开的文件(请参阅 参考资料 中的lsof +aL1 /u列表)以及被安装在其中的另一个文件系统屏蔽的文件(示例中的情况并非如此)。

`...`像您一样使用命令替换 ( ) 是错误的。这会调用 split+glob 运算符,该运算符默认在空格上进行分割并对结果单词执行通配操作。因此,只有当文件名都不包含空格、制表符、换行符、 、 或字符时,才能给出有意义*?结果[

ls -a包括您不想计算的.和条目,因为它们是您已经计算过的某些 inode 的硬链接(条目本身除外)。同样,您将多次计算其他硬链接。.../u

答案2

您将永远无法匹配这些数字,因为存在打开但已删除的文件,这些文件使用 inf inode,但对于遍历文件系统的用户不可见。

还有一些无法通过命令看到的隐藏 inode(例如,由 ACL 定义和扩展属性文件使用)find

另一方面,您需要防止多次计算硬链接次数。这可以通过以下方式实现:

find /u -xdev -ls | sort -n -u +0 | wc -l

但请注意,这通常会计算出太少的文件(见上文)。

相关内容