最近一个同事面试的时候,碰到一道面试题,大致意思是这样:一台linux服务器,磁盘空间还剩余很多,但是却报磁盘空间不足,为什么?

这个问题应该是inode使用完导致的。要处理这个问题,要么删除不再使用的文件,要么增加文件系统的空间。
使用命令df -i可以查看文件系统inode的使用情况,例如
root@debian:/tmp# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1             499712  133153  366559   27% /
tmpfs                 129310       5  129305    1% /lib/init/rw
udev                  128223     612  127611    1% /dev
tmpfs                 129310       1  129309    1% /dev/shm
使用ls -i可以查看文件或目录的inode信息:
root@debian:/mnt# ls -li
total 1154
2250 -r--r--r-- 1 root root     27 Feb  5 08:27 autorun.inf
2496 dr-xr-xr-x 1 root root   2048 Feb  5 08:27 css
2258 lr-xr-xr-x 1 root root      1 Feb  5 08:27 debian -> .
2560 dr-xr-xr-x 1 root root   2048 Feb  5 08:27 dists
3072 dr-xr-xr-x 1 root root   4096 Feb  5 08:27 doc
14080 dr-xr-xr-x 1 root root   2048 Feb  5 08:27 firmware
2272 -r--r--r-- 1 root root 110070 Jan 17 04:12 g2ldr
2275 -r--r--r-- 1 root root   8192 Jan 17 04:12 g2ldr.mbr
14144 dr-xr-xr-x 1 root root   2048 Feb  5 08:27 install
14208 dr-xr-xr-x 1 root root   2048 Feb  5 08:27 install.386
14336 dr-xr-xr-x 1 root root   4096 Feb  5 08:27 isolinux
2290 -r--r--r-- 1 root root 481874 Feb  5 08:30 md5sum.txt
14656 dr-xr-xr-x 1 root root   2048 Feb  5 08:27 pics
14720 dr-xr-xr-x 1 root root   2048 Feb  5 08:27 pool
2304 -r--r--r-- 1 root root   9561 Feb  5 08:30 README.html
2315 -r--r--r-- 1 root root 142252 Feb  4 22:52 README.mirrors.html
2319 -r--r--r-- 1 root root  76632 Feb  4 22:52 README.mirrors.txt
2307 -r--r--r-- 1 root root    398 Feb  5 08:27 README.source
2311 -r--r--r-- 1 root root   6062 Feb  5 08:30 README.txt
2324 -r--r--r-- 1 root root 319525 Jan 17 04:12 setup.exe
156096 dr-xr-xr-x 1 root root   2048 Feb  5 08:27 tools
2331 -r--r--r-- 1 root root    237 Feb  5 08:27 win32-loader.ini

以下是inode的一些概念性的东西,在此记录,以备不时之需。

inode 是 UNIX 操作系统中的一种数据结构,它包含了与文件系统中各个文件相关的一些重要信息。在 UNIX 中创建文件系统时,同时将会创建大量的 inode 。通常,文件系统磁盘空间中大约百分之一空间分配给了 inode 表。

有 时,人们使用了一些不同的术语,如 inode 和索引编号 (inumber)。这两个术语非常相似,并且相互关联,但它们所指的并不是同样的概念。 inode 指的是数据结构;而索引编号实际上是 inode 的标识编号,因此也称其为 inode 编号 或者索引编号。索引编号只是文件相关信息中一项重要的内容。下一个部分将介绍 inode 中的其他一些属性。

inode 表包含一份清单,其中列出了对应文件系统的所有 inode 编号。当用户搜索或者访问一个文件时,UNIX 系统通过 inode 表查找正确的 inode 编号。在找到 inode 编号之后,相关的命令才可以访问该 inode ,并对其进行适当的更改。

例如,使用 vi 来编辑一个文件。当您键入 vi <filename> 时,在 inode 表中找到 inode 编号之后,才允许您打开该 inode 。在 vi 的编辑会话期间,更改了该 inode 中的某些属性,当您完成操作并键入 :wq 时,将关闭并释放该 inode 。通过这种方式,如果两个用户试图对同一个文件进行编辑, inode 已经在第一个编辑会话期间分配给了另一个用户 ID (UID),因此第二个编辑任务就必须等待,直到该 inode 释放为止。

inode 的结构

对于经验丰富的 UNIX 开发人员或者管理员来说, inode 的结构相对比较简单,但是可能还有一些您尚不了解的、令人惊讶的有关 inode 的内幕。下面的定义仅给出了 inode 中所包含的、UNIX 用户经常使用的一些重要信息:

* inode 编号
* 用来识别文件类型,以及用于 stat C 函数的模式信息
* 文件的链接数目
* 属主的 UID
* 属主的组 ID (GID)
* 文件的大小
* 文件所使用的磁盘块的实际数目
* 最近一次修改的时间
* 最近一次访问的时间
* 最近一次更改的时间

从根本上讲, inode 中包含有关文件的所有信息(除了文件的实际名称以及实际数据内容之外)。

以上所列举的信息对于文件来说非常重要,并且在 UNIX 中频繁使用。如果没有这些信息,那么文件将被认为遭到破坏和不可用。

与 其他的操作系统相比,UNIX 系统中的目录和文件可能看起来有所不同,但事实并非如此。在 UNIX 中,目录本身就是文件,只是在它们的 inode 中使用了一些附加的设置。目录 本质上就是一个包含了其他文件的文件。另外,其模式信息中设置了一些相应的标志,以告知系统该文件实际上是一个目录。