无法找到 inode 耗尽的原因

无法找到 inode 耗尽的原因

我有一个安装了 Debian Linux 的 Xen VPS,文件系统为 ext4。有一次我发现所有 inode 都已使用。我检查了以下内容:

~# df -i
Filesystem      Inodes   IUsed IFree IUse% Mounted on
rootfs         3932160 3932160     0  100% /
udev             59227     262 58965    1% /dev
tmpfs            63251     215 63036    1% /run
/dev/xvda      3932160 3932160     0  100% /
tmpfs            63251       2 63249    1% /run/lock
tmpfs            63251       2 63249    1% /run/shm

然后我尝试找到所有 inode 的使用位置。通常它们被 PHP 会话文件使用(因为 cron 任务或 PHP 内部清理器损坏)。但我找不到哪个目录包含大量文件。我尝试了很多方法,其中一种是:

/# for i in /*; do echo $i; find $i |wc -l; done
/aquota.group
1
/aquota.user
1
/bin
124
/boot
9
/dev
264
/etc
1746
/home
1
/initrd.img
1
/lib
4002
/lib64
2
/lost+found
1
/media
1
/mnt
1
/opt
1
/proc
26590
/root
17
/run
214
/sbin
127
/selinux
1
/srv
3
/sys
3609
/tmp
1
/usr
37020
/var
8636
/vmlinuz
1

/# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=59227,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=50604k,mode=755)
/dev/xvda on / type ext4 (rw,relatime,errors=remount-ro,user_xattr,barrier=1,data=ordered,usrquota,grpquota)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=101200k)

Filesystem     Type     1K-blocks     Used Available Use% Mounted on
rootfs         rootfs    61927420 37390672  21391020  64% /
udev           devtmpfs     10240        0     10240   0% /dev
tmpfs          tmpfs        50604      120     50484   1% /run
/dev/xvda      ext4      61927420 37390672  21391020  64% /
tmpfs          tmpfs         5120        0      5120   0% /run/lock
tmpfs          tmpfs       101200        0    101200   0% /run/shm

/# find . | wc -l
78898

下一步我该做什么?

答案1

如果您希望 find 命令排除属于其他挂载点的 inode,请在 find 命令行中包含 -xdev。输出末尾的 78898 可能大于在 rootfs 分区中可找到的文件总数,因为它包括其他挂载点下的文件。这并不能解释您询问的差异;它只是意味着实际差异可能更大一些。

首先要检查的是,您是否有未链接的打开文件。以 root 身份运行以下命令的输出应显示这些文件:

lsof +L1

您可能打开未链接的文件的一个示例是,在软件包升级之前启动的进程会用较新的文件替换这些文件(我的某个系统上的几个 sshd 进程打开了未链接的文件)。另一种可能性是,进程故意取消链接打开的文件,以向其他进程隐藏其内容。

如果这不能完全解释差异,那么另一种可能性是,未被删除的文件对于 find 命令来说仍然不可见,因为它们隐藏在其他挂载点之下。有多种方法可以调查这种可能性,但首先计算打开的已删除文件可能更有意义。

相关内容