今天有人在群里问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
为什么日志切割需要重启软件?
一个有意思的事情是:
原因是这样的:
所以就算你移动文件或重命名文件,但是软件还使用的是原来的「索引编号」找到的「索引节点」,所以读取的还是以前的数据块。
关于监控
所以在日常服务的监控中,磁盘空间不足的原因,除了物理空间不足外,还可能是「索引节点」已用完。这两点都是需要监控的。
参考文献
- 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?