一、inode耗尽故障处理
- 之前我们学习过,每个文件与inode是相互对应的关系,也就是说每个文件都会有一个inode号码,但这样就会有可能会发生inode已经用光,但硬盘还未存满的情况
- 一旦发生这种情况后,我们就无法再在硬盘上创建新文件了,为了更直观的让大家理解,下面通过一个案例来模拟Linux文件系统中文件数量耗尽的故障
1.准备
- 新建一块硬盘,创建分区/dev/sdb1,分区大小+30M即可(不用太大,这里只是模拟实验,不然inode号会太多)
- 格式化,ext4格式(xfs也行)
[root@localhost ~]# mkfs.ext4 /dev/sdb1
- 可能会发生一种情况:创建好分区后格式化发现没有这个磁盘文件,怎么办呢,这时建议将系统重启或者执行“partprobe”命令使操作系统检测新的分区表情况,以防止格式化分区时损坏硬盘中已有数据
- 新建一个目录,挂载进去
- 使用带“-i”选项的df命令确认该文件系统中i节点的使用情况,可见inode有7680个
2.模拟i节点耗尽故障
- 编写一个脚本来模拟耗尽/dev/sdb1中的所有可用i节点(7680个)
- 关于脚本程序后续再进行详细学习,这里仅做了解即可
[root@localhost test]# for ((i=1;i<=7680;i++));do touch /test/file$i;done
touch: 无法创建"/test/file7670": 设备上没有空间
touch: 无法创建"/test/file7671": 设备上没有空间
touch: 无法创建"/test/file7672": 设备上没有空间
touch: 无法创建"/test/file7673": 设备上没有空间
touch: 无法创建"/test/file7674": 设备上没有空间
touch: 无法创建"/test/file7675": 设备上没有空间
touch: 无法创建"/test/file7676": 设备上没有空间
touch: 无法创建"/test/file7677": 设备上没有空间
touch: 无法创建"/test/file7678": 设备上没有空间
touch: 无法创建"/test/file7679": 设备上没有空间
touch: 无法创建"/test/file7680": 设备上没有空间 ##这里开始提示设备上没有空间了
- 这时再查看一下分区可用inode,发现满了,再创建新的文件也无法成功,但是通过df命令查看该分区,仅用“4%”,还有很多可用空间;由此可以得出:磁盘创建文件的数量受到磁盘容量大小以及inode号的数量限制
[root@localhost test]# df -i /dev/sdb1
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sdb1 7680 7680 0 100% /test
[root@localhost test]# touch xcf.txt
touch: 无法创建"xcf.txt": 设备上没有空间
[root@localhost test]# df -Th /test/
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sdb1 ext4 29M 916K 26M 4% /test
3.修复故障
- 我们理解了故障的由来,那么问题就比较好解决了,可以“ls -a”查看所有文件(包含隐藏文件)
- 然后找出该分区中占用大量i节点的细小文件,并进行转移或删除即可
- 对于许多用户公用的文件系统,建议为相关用户设置磁盘限额(包括文件数量、磁盘空间两方面)
二、恢复误删的文件
- 我们很多普通用户在删除一个文件的时候,实际上并不知晓inode节点和block数据,仅仅只是找到这个文件(名),然后删除
- 实际上Linux是通过Link(链接)的数量来控制文件删除的,只有当一个文件不存在任何Link的时候,这个文件才会被彻底删除
- 针对Linux系统下的EXT文件系统,可以用extundelete恢复工具来恢复文件,它是一个开源的Linux数据恢复工具,支持ext3、ext4文件系统(ext4只能在CentOS6版本中恢复)
1.准备(编译安装extundelete)
- 可以接着刚才新创建好的那个分区接着做,不过要先解挂载,然后重新格式化为“ext3”再来挂载
[root@localhost test]# cd
[root@localhost ~]# umount /test/
[root@localhost ~]# mkfs.ext3 /dev/sdb1
...略
[root@localhost ~]# mount /dev/sdb1 /test/
- 在编译安装extundelete之前需要先安装两个依赖包(首先注意自己有没有挂载镜像)
[root@localhost ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost ~]# yum -y install e2fsprogs-devel e2fsprogs-libs
...略