我注意到 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
但请注意,这通常会计算出太少的文件(见上文)。