Linux磁盘inode字节数占满的问题
Zabbix监控发现Linux服务器的根⽬录 inode使⽤100%,查看⽇志发现程序⽆法继续写⽂件,但是⽤df -h查看磁盘容量还有剩余。
有的同学会有疑问,磁盘inode是什么?
理解inode,要从⽂件储存说起。
⽂件储存在硬盘上,硬盘的最⼩存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会⼀个个扇区地读取,这样效率太低,⽽是⼀次性连续读取多个扇区,即⼀次性读取⼀个"块"(block)。这种由多个扇区组成的"块",是⽂件存取的最⼩单位。"块"的⼤⼩,最常见的是4KB,即连续⼋个sector组成⼀个block。
⽂件数据都储存在"块"中,那么很显然,我们还必须到⼀个地⽅储存⽂件的元信息,⽐如⽂件的创建者、⽂件的创建⽇期、⽂件的⼤⼩等等。这种储存⽂件元信息的区域就叫做inode,中⽂译名为"索引节点"。
每⼀个⽂件都有对应的inode,⾥⾯包含了与该⽂件有关的⼀些信息。
⼆、inode内容
inode包含⽂件的元信息,具体来说有以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13* ⽂件的字节数
* ⽂件拥有者的User ID
* ⽂件的Group ID
* ⽂件的读、写、执⾏权限
* ⽂件的时间戳,共有三个:ctime指inode上⼀次变动的时间,mtime指⽂件内容上⼀次变动的时间,atime指⽂件上⼀次打开的时间。
* 链接数,即有多少⽂件名指向这个inode
* ⽂件数据block的位置
可以⽤stat命令,查看某个⽂件的inode信息:
总之,除了⽂件名以外的所有⽂件信息,都存在inode之中。⾄于为什么没有⽂件名,下⽂会有详细解释。
三、inode结构
了解⼀下⽂件系统如何存取⽂件的:
1、根据⽂件名,通过Directory⾥的对应关系,到⽂件对应的Inode number
2、再根据Inode number读取到⽂件的Inode table
3、再根据Inode table中的Pointer读取到相应的Blocks
这⾥有⼀个重要的内容,就是Directory,他不是我们通常说的⽬录,⽽是⼀个列表,记录了⼀个⽂件/⽬录名称对应的Inode
number。如下图:
四、inode⼤⼩
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统⾃动将硬盘分成两个区域。⼀个是数据区,
存放⽂件数据;另⼀个是inode区(inode table),存放inode所包含的信息。
每个inode节点的⼤⼩,⼀般是128字节或256字节。inode节点的总数,在格式化时就给定,⼀般是每1KB或每2KB就设置⼀个inode。假定在⼀块1GB的硬盘中,每个inode节点的⼤⼩为128字节,每1KB就设置⼀个inode,那么inode table的⼤⼩就会达到128MB,占整块硬盘的12.8%。
查看每个硬盘分区的inode总数和已经使⽤的数量,可以使⽤df命令。
df -i
查看每个inode节点的⼤⼩,可以⽤如下命令:
sudo dumpe2fs -h /dev/hda | grep "Inode size"
由于每个⽂件都必须有⼀个inode,因此有可能发⽣inode已经⽤光,但是硬盘还未存满的情况。这时,就⽆法在硬盘上创建新⽂件。
五、inode号码
每个inode都有⼀个号码,操作系统⽤inode号码来识别不同的⽂件。
这⾥值得重复⼀遍,Unix/Linux系统内部不使⽤⽂件名,⽽使⽤inode号码来识别⽂件。对于系统来说,⽂件名只是inode号码便于识别的别称或者绰号。
表⾯上,⽤户通过⽂件名,打开⽂件。实际上,系统内部这个过程分成三步:
⾸先,系统到这个⽂件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,到⽂件数据所在的block,读出数据。
使⽤ls -i命令,可以看到⽂件名对应的inode号码:
ls -
六、⽬录⽂件
Unix/Linux系统中,⽬录(directory)也是⼀种⽂件。打开⽬录,实际上就是打开⽬录⽂件。
⽬录⽂件的结构⾮常简单,就是⼀系列⽬录项(dirent)的列表。每个⽬录项,由两部分组成:所包含⽂件的⽂件名,以及该⽂件名对应的inode号码。
ls命令只列出⽬录⽂件中的所有⽂件名:
ls /etc
ls -i命令列出整个⽬录⽂件,即⽂件名和inode号码:
linux命令查看文件夹大小ls -i /etc
如果要查看⽂件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出⽂件的详细信息。
ls -l /etc
理解了上⾯这些知识,就能理解⽬录的权限。⽬录⽂件的读权限(r)和写权限(w),都是针对⽬录⽂件本⾝。由于⽬录⽂件内只有⽂件名和inode号码,所以如果只有读权限,只能获取⽂件名,⽆法获取其他信息,因为其他信息都储存在inode节点中,⽽读取inode节点内的信息需要⽬录⽂件的执⾏权限(x)。
七、硬链接
⼀般情况下,⽂件名和inode号码是"⼀⼀对应"关系,每个inode号码对应⼀个⽂件名。但是,Unix/Linux系统允许,多个⽂件名指向同⼀个inode号码。
这意味着,可以⽤不同的⽂件名访问同样的内容;对⽂件内容进⾏修改,会影响到所有⽂件名;但是,删除⼀个⽂件名,不影响另⼀个⽂件名的访问。这种情况就被称为"硬链接"(hard link)。
ln命令可以创建硬链接:
ln 源⽂件⽬标⽂件
运⾏上⾯这条命令以后,源⽂件与⽬标⽂件的inode号码相同,都指向同⼀个inode。inode信息中有⼀项叫做"链接数",记录指向该inode的⽂件名总数,这时就会增加1。
反过来,删除⼀个⽂件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有⽂件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。
这⾥顺便说⼀下⽬录⽂件的"链接数"。创建⽬录时,默认会⽣成两个⽬录项:"."和".."。前者的inode号码就是当前⽬录的inode号码,等同于当前⽬录的"硬链接";后者的inode号码就是当前⽬录的⽗⽬录的inode号码,等同于⽗⽬录的"硬链接"。所以,任何⼀个⽬录的"硬链接"总数,总是等于2加上它的⼦⽬录总数(含隐藏⽬录)。
⼋、软链接
除了硬链接以外,还有⼀种特殊情况。
⽂件A和⽂件B的inode号码虽然不⼀样,但是⽂件A的内容是⽂件B的路径。读取⽂件A时,系统会⾃动将访问者导向⽂件B。因此,⽆论打开哪⼀个⽂件,最终读取的都是⽂件B。这时,⽂件A就称为⽂件B的"软链接"(soft link)或者"符号链接(symbolic link)。
这意味着,⽂件A依赖于⽂件B⽽存在,如果删除了⽂件B,打开⽂件A就会报错:"No such file or directory"。这是软链接与硬链接最⼤的不同:⽂件A指向⽂件B的⽂件名,⽽不是⽂件B的inode号码,⽂件B的inode"链接数"不会因此发⽣变化。
ln -s命令可以创建软链接。
ln -s 源⽂⽂件或⽬录⽬标⽂件或⽬录
九、inode的特殊作⽤
由于inode号码与⽂件名分离,这种机制导致了⼀些Unix/Linux系统特有的现象:
(1) 有时,⽂件名包含特殊字符,⽆法正常删除。这时,直接删除inode节点,就能起到删除⽂件的作⽤。
(2) 移动⽂件或重命名⽂件,只是改变⽂件名,不影响inode号码。
(3) 打开⼀个⽂件以后,系统就以inode号码来识别这个⽂件,不再考虑⽂件名。因此,通常来说,系统⽆法从inode号码得知⽂件名。
第3点使得软件更新变得简单,可以在不关闭软件的情况下进⾏更新,不需要重启。因为系统通过inode号码,识别运⾏中的⽂件,不通过⽂件名。更新的时候,新版⽂件以同样的⽂件名,⽣成⼀个新的inode,不会影响到运⾏中的⽂件。等到下⼀次
运⾏这个软件的时候,⽂件名就⾃动指向新版⽂件,旧版⽂件的inode则被回收。
⾔归正传,下⾯是如何解决磁盘inode满的问题
1.使⽤df -i查看磁盘inode节点使⽤情况,果然是inode节点满了。
2.进⼊到可能的⽬录,运⾏ for i in /*; do echo $i; find $i | wc -l; done统计当前⽬录使⽤节点的情况
逐级修改⽬录到问题所在的⽂件夹
for i in /u01/adump/*; do echo $i; find $i | wc -l; done
[root@oracle01 adump]# ls | wc -l
7036335
3.发现oracle adump⽬录下被⼤量的⼩⽂件占满,决定清理掉时间较长的aud审计⽂件。
注意:oracle的adump⽂件夹存放的是审计⽂件,可以删除此⽂件夹下的内容,不能删除⽬录。
总结:解决inode节点满的⼀般⽅法就是删除占⽤inode节点的异常⽂件。
补充:删除⼤量的⼩⽂件如果仅使⽤rm -rf 会报以下的错
/bin/rm: argument list too long
报错提⽰原因:⽂件夹下的⽂件数⽬过多,命令⾏过长所致。
解决⽅法:我们可以结合xargs命令来删除,ls | xargs -n 9 rm -rf ,ls列出当前⽬录下的所有⽂件,以空格作为分隔, xargs 是⼀个过滤器, -n 9 表⽰每9个⽂件作为⼀组,作为命令 rm -rf 的参数,这样命令⾏就不会过长了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。