25.Linux系统中解决空间被占满问题——deleted,inode号

发布于:2023-01-23 ⋅ 阅读:(973) ⋅ 点赞:(0)

1.Linux中如何解决文件已删除但空间不释放的案例(lsof):

现象:运维的监控系统发来通知,报告一台服务器空间满了,登录服务器查看,根分区确实没有空间了:        df -h

解决思路:第一步:

(1)查找原因:(服务器的删除策略:由于Linux没有回收站功能,所以线上服务器上所有要删除的文件都会先移动到系统/tmp目录下,然后定期清除/tmp目录下的数据。)但是通过检查发现这台服务器的系统分区中并没有单独划分/tmp分区,这样/tmp下的数据其实占用了根分区的空间。那么删除/tmp目录下一些占空间较大的数据文件即可,检查/tmp下最大的三个数据文件。

du -sh /tmp/* |sort -nr |head -3

(2)解决方案:通过命令输出发现在 /tmp 目录下有很大的文件比如access_log,这个文件是Apache 产生的访问日志文件,所以是很久没有清理Apache日志文件了,在确认此文件可以删除之后,执行删除操作:

rm /tmp/access_log

接着查看根分区空间是否释放:df -h

第二步:如若从上述结果看到根分区空间依旧没有释放的话,再继续检查:

(1)查找原因:一般来说不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件被进程锁定,或者有进程一直在向这个文件写数据等。一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,在将数据删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中。在将数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以在出现删除access_log文件后,空间还没释放,就是因为httpd进程还在一直向这个文件写入内容,导致虽然删除了access_log文件,但是由于进程锁定,文件对应的指针部分并未从meta-data中清除,而由于指针并未删除,系统内核就认为文件并未删除。

查看进程是否一直在向access_log文件写入数据:lsof |grep delete

解决方案:从输出结果可以看到,/tmp/access_log文件被进程httpd锁定,而httpd进程还一直向这个文件写入日志数据。最后一列的“deleted”状态说明这个日志文件已经被删除,但由于进程还在一直向此文件写入数据,因此空间并未释放。

(1)关闭或者重启httpd进程,也可以重启系统。

(2)echo " " > /tmp/access.log

总结:通过这种方法,磁盘空间不但可以马上释放,也可保障进程继续向文件写入日志,这种方法经常用于在线清理Apache、Tomcat、Nginx等Web服务产生的日志文件。

2.Linux文件系统inode耗尽,剩余空间无法创建新文件:

现象:在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题。 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。

(1)查找原因:/data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode

(2)解决方案:

(1)删除/data/cache目录中的部分文件,释放出/data分区的一部分inode

(2)删除不需要的文件,卸载 /data.

切换到当前目录下        find ./ -name "file*" |xargs rm -f


网站公告

今日签到

点亮在社区的每一天
去签到