前记:今天解决服务器inodes问题,在此做下整理记录下参考的解决方案。
系统:Centos;一般的Linux系统也可以用这种方法。
情况描述:今天我们邮件服务器收发不了邮件了,而且连接到服务器上开启服务都开不了,起始以为磁盘空间不足,df 看了一下
发现空间是足够的,然后df -i 查看了下inodes,发现根目录下的inodes值使用率为100%了
解决方法:通过以下脚本进行检查,查看到底哪个目录下面的文件最多:
for i in /*; do echo $i; find $i | wc -l; done(如果确定是某个目录下面,则/转换为该目录绝对路径,如/var/spool,则使用for i in /var/spool/*; do echo $i; find $i | wc -l; done)
最终发现/var/soppl目录最多。然后又进一步确定是/var/spool/amavisd/quarantine 目录下面有上百万个文件,机器已经无法正常显示了,后来百度查看了下这个目录是邮件服务器,处理垃圾邮件活病毒邮件隔离的,明白原因了,删除该目录下所有文件;使用xargs命令来删除数量比较多的文件:
ls | xargs -n 10 rm -rf
(直接执行rm -rf *, 报“-bash:/bin/rm:Argument list too long”,提示文件数目太多。)
执行了大约10多小时之后,最终解决问题。
一、 Linux的文件系统
1 我们都知道当我们安装Linux时会首先给系统分区,然后我们会把分区格式化成EXT3格式的文件系统。那么在Linux系统中还有没有其他的文件系统呢,下面我们就简单的介绍一下Linux系统中常见的几种文件系统。
(1)EXT3文件系统:ext3(第三级扩展Linux文件系统,third extended Linux filesystem)。跟EXT2文件不同之处就是增加了日志功能。
(2)EXT2和MSDOS:一般用于软盘
(3)ISO9660:光盘的文件系统
(4)GFS和GFS2:主要用于集群服务器的文件系统(SAN)
二、 Linux文件系统的节点(Inodes)
1 Inode(index node )索引节点
2 首先我们要清楚地是:一个文件其实是由两部分组成:节点表和数据区。Inodes table (节点表)包含了ext2和ext3文件系统的所有属性。节点表里面主要存放文件的类型,权限,UID,GID,Link count,大小和时间戳,数据存放在磁盘的什么位置。数据区里面就是存放真正的数据。
3 一个inodes(节点号)的大小大概为128B,一个文件至少要占有1个inodes。通过tune2fs
-l /dev/sda7 可以查看这个分区的inode size,inode count,block count。
我们知道,计算机在识别一个用户是通过UID来识别的,识别一个进程是通过进程号来识别的,那么,同样,计算机识别一个文件是通过一个inode number来识别文件的。而文件名只是给人的识别的。
4 查看节点号的方法:#ls -li
[root@localhost ~]# ls -li total 56 533587 -rw------- 1 root root 1050 Mar 6 02:15 anaconda-ks.cfg 919063 drwxr-xr-x 2 root root 4096 Mar 6 02:43 Desktop 524290 -rw-r--r-- 1 root root 29302 Mar 6 02:15 install.log 524291 -rw-r--r-- 1 root root 3738 Mar 6 02:15 install.log.syslog
前面的一串数字就是文件的节点号,
其实我们的节点号是在分区创建的时候就已经分配好了的。
5 下面我们来学习复制,剪切,删除对文件inode的影响
(1)复制对文件inode的影响
[root@localhost ~]# cd /boot/ [root@localhost boot]# ls -li file 6030 -rw-r--r-- 1 root root 0 Mar 6 13:26 file a
可以看到,这个文件的节点号是6030,现在我们将它复制到另外一个分区
[root@localhost boot]# cp file /var/ [root@localhost boot]# cd /var/ [root@localhost var]# ls -li file 2115361 -rw-r--r-- 1 root root 0 Mar 6 13:27 file
将这个文件复制到/var分区下面后,这个文件的inode number就改变了。
当一个文件从一个分区复制到另外一个分区的时候,系统就分配了另外一个inode给这个文件。
那么在同一个分区复制文件节点号会有什么改变呢
[root@localhost boot]# ls -li file 6030 -rw-r--r-- 1 root root 0 Mar 6 13:26 file [root@localhost boot]# cp file /boot/grub/ [root@localhost boot]# cd grub/ [root@localhost grub]# ls -li file 22091 -rw-r--r-- 1 root root 0 Mar 6 13:29 file
可以看到,刚才这个文件的节点号是6030,现在就变成了22091了。
在同一个分区里面复制文件,这个文件的节点号也是会发生改变的。因为在这个分区有两份相同的文件,只是文件的内容相同,但是文件的inode属性却是不一样的。
2. 剪切对文件inode的影响
a 同一分区的剪切
[root@localhost ~]# cd /boot/ [root@localhost boot]# ls -li file 6030 -rw-r--r-- 1 root root 0 Mar 6 13:26 file
可以看到,这个文件的节点号是6030,现在我们将这个文件在同个分区里剪切一份。
[root@localhost boot]# mv file /boot/test/ [root@localhost test]# ls -li file 6030 -rw-r--r-- 1 root root 0 Mar 6 13:26 file
可以看到,这个文件节点号是没有改变的。
当在同一个分区里面移到文件,文件的节点号没有发生改变。
b 不同的分区剪切
[root@localhost ~]# cd /boot/test/ [root@localhost test]# ls -li file 6030 -rw-r--r-- 1 root [root@localhost test]# mv /boot/test/file /var/ftp/pub/ [root@localhost test]# cd /var/ftp/pub/ [root@localhost pub]# ls -li file 325584 -rw-r--r-- 1 root root 0 Mar 6 13:26 file
可以看到,这个文件的节点号是肯定会变的。
3 删除对inode的影响
[root@localhost ~]# cd /boot/ [root@localhost boot]# ls -li file 6030 -rw-r--r-- 1 root root 0 Mar 6 13:44 file [root@localhost boot]# rm -rf file
现在我们把file这个文件给删除了,其实我们只是将file这个文件的节点表给删除了,其实我们的数据都还在。这也就是为什么当我们删除一个文件,这个文件还可以被找回来的原因。当然如果我们在到这个分区里面写入数据,那么原来的数据就会被覆盖。
[root@localhost boot]# touch file1 [root@localhost boot]# ls -li file1 6030 -rw-r--r-- 1 root root 0 Mar 6 13:49 file1
现在我们又新建了一个文件file1,这个文件的节点号也是6030,它就已经覆盖了以前的数据的节点号。那么以前的数据就找不回来了。
4 总结
复制:在同一个分区,节点号改变。在不同的分区,节点号改变。
剪切:在同一个分区,节点号不变。在不同的分区,节点号改变。
删除:只是删除了文件的节点表,数据没有被真正删除,只有当往这个分区在写入数据的时候,才会覆盖原来的数据。
二、 Linux的文件系统
$ ls -li 427333 drwx------ 2 abao abao 4096 2009-08-12 20:19 amsn_received 989840 -rwxrwxrwx 1 abao abao 144 2009-10-22 22:19 chroot-lfs.sh 1038353 drwxr-xr-x 13 abao abao 4096 2009-11-04 21:42 data
inode是理解linux文件系统的核心概念。iNode的意思就是index node,就是索引的意思。linux中目录也被被看成是广义的文件,而理解inode正是理解这个广义文件的最好的办法。每个文件和目录都对应着一个inode,inode在一个分区内是唯一的。
对于文件而言,它的信息可以人为的看成三个部分,文件名,文件属性和文件内容。文件名就是我们通常使用的名字,文件属性则包括文件大小,权限设置,修改时间等。文件内容就是我们用cat命令能看到的东西。文件属性是全部保存在文件对应的inode当中的,文件内容在物理上和inode并不是存放在一起,而是放在稍微靠后的磁盘区,也可以称为数据区。在inode里面有指向数据区的指针。
对于目录而言,目录的存储也分成三个部分,也是目录名称,目录属性和目录内容这里提到的目录内容其实就是目录中包含的所有文件/子目录的对应关系(文件名-inode-关系表)。目录属性也存储在inode中,而目录内容就存储在inode所对应的数据区当中。
你可能会问,那么名字呢?文件和目录的名字跑到哪里去了呢?其实,这个名字就存储在它的父目录的内容当中。 举个例子如下。
/tmp包含了两个文件file1和file2。
那么在系统中就会有三个inode,比如说他们的inode number分别是1000(/tmp), 10001(/tmp/file1), 10002(/tmp/file2)。
那么1000#号inode中,保存了/tmp中所有的下属文件的inode和名字,已经目录自身的属性。
10001#号inode中,保存了/tmp/file1自己的文件属性,以及指向数据区的指针。
10002#号inode中,保存了/tmp/file2自己的文件属性,以及指向数据区的指针。
而/tmp这个目录名字,则是由它的父目录(也就是/)来负责管理的。
从上面的例子可以看到,名字,属性和内容,后两者是联系在一起的,名字则是归父目录去管理。当有两个目录都指向同一个inode的时候,就会出现同样的属性+内容,出现在两个不同的目录中。甚至可以以不同的名字出现在相同的目录中。这就是连接的概念,有多少个目录指向当前这个文件(或当前这个目录),这个数字就是link count。在连接中,inode number是父目录识别子体的关键信息。
注意到,每个分区(partition)都会有自己的inode列表,也就是每个分区的inode系统是独立的。那么当我们把一个分区设备装载到当前使用的分区时,两个inode系统就会重叠在一起。比如我的linux是mount在/dev/sda1上作为root的,然后我把/dev/sda2装载到/home上。就会发现/home和/的inode number都是2。这是两个分区inode表重叠在一起的表现。
参考文章:
相关推荐
Linux 系统中磁盘空间不足是经常遇到的问题,可能是由于安装系统设计不合理、分区太小、网络通讯故障等原因造成的。以下是解决 Linux 磁盘空间不足的十招: 1. 定期对重要文件系统扫描,并作对比,分析那些文件...
Linux 磁盘分区空间不够解决办法 Linux 系统中的磁盘分区空间不足是很常见的问题,... Linux 磁盘分区空间不够的问题可以通过以上十招解决办法来解决,但关键还是安装时要规划好分区,以避免磁盘分区空间不够的问题。
Linux 系统管理员经常会面临磁盘空间不足的问题,导致无法读写磁盘,应用程序无法执行等问题。造成磁盘空间满的原因有很多,如安装系统设计不合理、日志文件速度增长、网络通讯故障等。解决这个问题需要对磁盘空间...
"linux 文件恢复" 本文将详细介绍 Linux 文件系统结构和恢复误删文件的方法。作为一个多用户、多任务的操作系统,Linux下的文件一旦被删除,是难以恢复的。然而,对于家庭单机使用的 Linux,或者误删文件后及时补救...
通过手动释放缓存的方式,可以在一定程度上缓解Linux系统因缓存占用过多内存而导致的“内存不足”问题。这种方法特别适用于那些需要即时释放内存资源以供其他任务使用的场景。需要注意的是,在日常运维中应谨慎使用...
总的来说,`dua`作为Linux下的磁盘使用分析工具,不仅提供了便利的命令行接口,还具有高效的性能和丰富的功能,对于日常的系统维护和问题排查非常有用。通过熟练掌握`dua`的使用,可以更好地管理和优化Linux系统的...
Linux服务器管理是IT领域中一个重要的主题,尤其对于运维人员来说,掌握Linux系统的管理技能是必不可少的。在本文中,我们将深入探讨如何有效地管理和优化Linux服务器,特别是关注内存的使用和清理缓存的方法。 ...
df.inodes.total、df.inodes.free、df.inodes.free.percent、df.inodes.used和df.inodes.used.percent分别表示inode的总数、可用数、占比和已使用数。 除了上述基本监控指标,还有其他关键的监控点,如网络性能。...
同时,需要注意的是,释放缓存并不能解决由于其他原因导致的物理内存不足的问题,比如过多的后台进程消耗内存。 最后,文章中提到的“procysysyvmxdrop_caches”和“procysysyvmy/drop_caches”应为“/proc/sys/vm/...
- **`invalidate_inodes`**:使一组 inodes 无效,通常是文件系统卸载前的操作。 - **`get_empty_inode`**:获取一个空闲的 inode 结构。 - **`iunique`**:确保一个 inode 在文件系统中的唯一性。 - **`insert_...
在Linux操作系统中,管理和监控内存及CPU的使用情况对于系统管理员来说至关重要,这有助于优化系统性能、排查问题以及确保服务的稳定运行。本篇将详细解释如何查看Linux系统的内存和CPU使用情况,以及如何理解相关...
Linux 文件系统的权限王国(二):inode 元信息详解 Linux 文件系统的权限王国(二)借鉴.pdf 中,作者池建强讲解了 Linux 文件系统的权限机制,重点介绍了 inode 的概念和结构。在这篇文章中,我们将深入探讨 ...
总之,Linux系统的缓存机制虽然提高了效率,但也可能导致内存资源的过度占用。通过理解`/proc/sys/vm/drop_caches`参数并适时执行释放缓存的命令,我们可以有效地管理和优化系统的运行速度,确保系统的稳定性和响应...
其中,Ext3作为一种日志文件系统,为Linux平台的数据存储带来了更为高效、稳定和安全的解决方案。本文主要对Linux 2.6内核下Ext3文件系统的数据结构进行深入研究,并通过基准测试分析了其性能。 一、Ext3文件系统...
### Linux-定期清内存缓存-shell脚本 #### 背景与意义 在Linux系统中,内存资源的管理非常重要。随着系统运行时间的增长,内存中的缓存数据可能会占用大量空间,导致可用内存减少,从而影响系统的性能。为了确保...
df 命令是 Linux 系统中一个非常有用的命令,它可以显示文件系统的磁盘空间占用情况,帮助用户了解硬盘的使用情况、剩余空间等信息。本文将详细介绍 df 命令的参数、使用方法和输出结果。 df 命令的基本语法 df ...
在Linux操作系统中,管理和监控磁盘空间是日常运维工作的重要组成部分。本文将详细介绍两个用于查看Linux磁盘空间的命令:`df` 和 `du`,并结合它们的语法、参数和示例进行深入解析。 首先,`df` 命令用于查看文件...