今天有人在群里问inode有关的问题:

 

对于存放大量小文件的磁盘,磁盘空间占用不多,但是inode占用比较多,有什么好的处理方法吗

 

所以,整理一下有关inode的内容。

「扇区」与「块」

文件储存在硬盘上,硬盘的最小存储单位叫做「扇区(Sector)」,每个「扇区」储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,一次性读取一个「块(block)」。一个「块」由多个扇区组成,,大小通常是4KB,即连续八个「扇区」组成一个「块」。

而文件则是存储在「块」里,块是存储文件的最小单位。一个大小为8KB的文件,占用两个「块」;一个大小12KB的文件,占用三个「块」。那大小为9KB的文件占用几个「块」呢?答案是“三个”,因为“文件是存储在「块」里的,块是存储文件的最小单位”。同样的,大小为10KB文件也要占用三个「块」。所以说,大小为10KB的文件,实际占用的硬盘空间大校是12KB。

这么存储不是浪费磁盘空间么?为什么不以“位”为单位进行存储?效率!一切都是为了效率!一“位”一“位”的读取数据效率太低。

但是我们的文件还有一些其他的“元信息”,比如所属用户、所属组、修改时间、访问时间、权限等等,这些信息存在哪里呢?这些信息存储在一个叫「inode」的地方,中文称之为「索引节点」。

「索引节点」- inode

在「inode」中存储了文件所属用户、所属组、修改时间、访问时间、权限、设备ID、文件大小等等信息。!!!但是不包含文件名!!!

每个文件对应一个「索引节点」。

在格式化硬盘时,硬盘被分成两个区域:一个是「数据区」,存放文件数据;另一个是「索引节点区」(inode table),存放所有「索引节点」。所以「inode」也会消耗硬盘空间。每个inode节点的大小,一般是“128B”或“256B”,而「inode」节点的总数,在格式化时就给定。

查看inode的使用情况:df -i

查看inode的大小:dumpe2fs -h /dev/hda | grep "Inode size"

调正inode的数量:这需要在格式化时确定,通常命令有相应的选项,参考文档即可。如果在使用过程中出现「inode」数量不足,那只能备份数据,然后重新格式化磁盘,格式化时指定「inode」的数量。

「索引编号」- inumber

每个「inode」都有一个号码,操作系统用「索引编号」来识别不同的文件。

这里值得重复一遍,在Unix/Linux系统的内部,并不使用文件名,而使用「索引编号」来识别文件。对于系统来说,「文件名」只是「索引编号」便于识别的别称。

查看文件的「索引编号」:ls -i .bashrc

为什么日志切割需要重启软件?

一个有意思的事情是:

 

你看日志切割脚本(logrotate),你会发现在移动(重命名)日志文件之后,需要进行重启(或reload等类似操作)动作,软件才能将日志写入新的文件中。

 

原因是这样的:

 

首先,移动文件或重命名文件,只是改变文件名,不影响「索引编号」。

 

 

其次,在系统内部,打开一个文件分成三步:(1)首先,系统找到这个「文件名」对应的「索引编号」;(2)然后,通过「索引编号」获取「索引节点」信息;(3)最后,根据「索引节点」信息,找到文件数据所在的「块」,读出数据。

 

所以就算你移动文件或重命名文件,但是软件还使用的是原来的「索引编号」找到的「索引节点」,所以读取的还是以前的数据块。

关于监控

所以在日常服务的监控中,磁盘空间不足的原因,除了物理空间不足外,还可能是「索引节点」已用完。这两点都是需要监控的。

参考文献

 

  • WikiNotes/索引节点
  • Wikipedia/inode
  • 理解inode
  • Inode占满导致No space left on device解决
  • How can I increase the number of inodes in an ext4 filesystem?
  • ext4 file-system max inode limit - can anyone please explain?