由于 inode 号码与文件名分离,这种机制导致了一些 Unix/Linux 系统特有的现象。
有时,文件名包含特殊字符,无法正常删除。这时,直接删除 inode 节点,就能起到删除文件的作用。
移动文件或重命名文件,只是改变文件名,不影响 inode 号码。
打开一个文件以后,系统就以 inode 号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从 inode 号码得知文件名。
第 3 点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过 inode 号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的 inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的 inode 则被回收。
说了这么多,大家应该对 inode 有所了解了吧,那么解决问题也就容易多了,本次问题是由于 adump 文件过多造成 inode 满了的问题,只需要删除 adump 下的文件即可。直接删除 rm -rf *,有可能因为文件数量太多而出现 Argument list too long 错误.在 Linux 下,试图传太多参数给一个系统命令(ls *; cp *; rm *; cat *; etc…)时,就会出现 Argument list too long 错误。Linux 工程师给出了如下遍历的方法慢慢的删除了文件。-n 选项表示将 xargs 生成的命令行参数,每次传递几个参数给其后面的命令执行,这里表示每九个遍历删除文件。
cd /u01/app/oracle/**/$SID/adump
ls | xargs -n 9 rm -f
当然,每九个删除可以慢慢悠悠的完成删除操作,不过最快速的办法就是直接删除 adump 然后新建 adump。下面我们来模拟一下其他目录 inode 满的情况及处理办法
# dd if=/dev/zero of=mo.img bs=5120k count=1
1+0 records in
1+0 records out
5242880 bytes (5.2 MB) copied, 0.0128262 s, 409 MB/s
# ls -lh mo.img
-rw-r--r-- 1 root root 5242880 Dec 27 22:47 mo.img
# mkfs -t ext4 -F ./mo.img
mke2fs 1.42.9 (28-Dec-2013)
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
1280 inodes, 5120 blocks
256 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=5242880
1 block group
8192 blocks per group, 8192 fragments per group
1280 inodes per group
Allocating group tables: done
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
# mount -o loop ./mo.img /mnt
# vi /mnt/inode_test.sh
# cat /mnt/inode_test.sh
#!/bin/bash
for ((i = 1; ; i++))
do
if [ $? -eq 0 ]; then
echo "This is file_$i" > file_$i
else
exit 0
fi
done
第一次由于执行目录为 /root ,脚本 inode_test.sh 一直没有执行完毕,所生成的文件全部在 /root 下,导致 / 文件系统 inode 使用过多,这里使用 find + xargs 遍历删除了。
find ./ -name "file_*" | xargs rm -f
第二次执行,需要进入到 /mnt 执行,很快 /mnt 文件系统 inode 就会满,报错“ No space left on device”。下面看看如何删除这些文件:
[root@openGauss ~]# cd /mnt
[root@openGauss mnt]# ll
total 13
-rw-r--r-- 1 root root 146 Dec 27 21:07 inode_test.sh
drwx------ 2 root root 12288 Dec 27 21:06 lost+found
[root@openGauss mnt]# sh inode_test.sh
inode_test.sh: line 6: file_1269: No space left on device
[root@openGauss mnt]# ll|wc -l
1271
[root@openGauss mnt]# ls | xargs -n 9
file_1 file_10 file_100 file_1000 file_1001 file_1002 file_1003 file_1004 file_1005
file_1006 file_1007 file_1008 file_1009 file_101 file_1010 file_1011 file_1012 file_1013
file_1014 file_1015 file_1016 file_1017 file_1018 file_1019 file_102 file_1020 file_1021
file_1022 file_1023 file_1024 file_1025 file_1026 file_1027 file_1028 file_1029 file_103
file_1030 file_1031 file_1032 file_1033 file_1034 file_1035 file_1036 file_1037 file_1038
file_1039 file_104 file_1040 file_1041 file_1042 file_1043 file_1044 file_1045 file_1046
1、如果确认这些文件不再需要则可以直接删除上层目录,这里即 /mnt ,亦或是使用上面提到的根据文件名遍历删除“find ./ -name “file_*” | xargs rm -f ” ;
2、表示用 lsattr 列出 ./ 下面的文件名的属性,用 awk 取出名字,然后 rm -rf
# lsattr ./|awk -F"/" '{print $3}'|xargs -i rm -rf {}
3、find /mnt -type f -exec rm {} ; 或者直接在 /mnt 下 find ./ -exec rm {} ;
查找某个目录下一个月或两个月之前的文件,然后删除
# find . -type f -mtime +30 |wc -l
# find . -type f -mtime +60 |wc -l
# find . -type f -mtime +30 -exec rm -f {} \;
# find . -type f -mtime +60 -exec rm -f {} \;
inode 爆满,也可能是某些目录下存在大量的小文件导致。
大量小文件分布有两种可能:
a)一是只有一个或少量目录下存在大量小文件,这种情况可以使用如下命令来找出这个异常目录:
# find / -type