专栏首页北京马哥教育操作篇:Linux磁盘空间释放解决步骤

操作篇:Linux磁盘空间释放解决步骤

问题说明

IDC里的一台服务器的/分区使用率爆满了!已达到100%!经查看发现有个文件过大(80G),于是在跟有关同事确认后rm -f果断删除该文件。但是发现删除该文件后,/分区的磁盘空间压根没有释放出来,使用率还是100%!这是为什么呢??

[root@linux-node1 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                       58G  7.8G   47G  100% /
tmpfs                 1.9G     0  1.9G   0% /dev/shm
/dev/vda1             190M   72M  108M  40% /boot

原因分析:

在Linux系统中,通过rm或者文件管理器删除文件,只是将它会从文件系统的目录结构上解除链接(unlink),也就是说只是删除了文件和系统目录结构的链接;如果文件在删除时是被打开的(有一个进程正在使用该文件,文件被进程锁定或者有进程一直在向这个文件写数据等)状态,那么进程将仍然可以读取该文件,也就是说没有删除掉文件在读取的状态,所以磁盘空间也就会一直被占用。

一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,数据被删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中,数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除文件后,空间还没释放,就是因为有进程还在一直向这个文件写入内容,导致虽然删除了文件,但文件对应的指针部分由于进程锁定,并未从meta-data中清除,而由于指针并未被删除,那么系统内核就认为文件并未被删除,因此通过df命令查询空间并未释放也就不足为奇了。

解决措施有以下几种

1,通过lsof|grep deleted命令获取到已经被删除但是仍然被应用程序占用的文件列表,然后kill掉还在占用所删除文件的进程。需要注意的是:如果有很多进程都在使用所删除文件,那么采用第1种方式kill进程就有点麻烦了,而且风险也比较大。因为kill进程是通过截断proc文件系统中的文件可以强制要求系统回收分配给正在使用的的文件。必须要确定不会对运行中的进程造成影响时才能使用,应用程序对这种方式支持的并不好,当一个正在使用的文件被截断可能会引发不可预知的问题。

2,或停掉或重启使用这个所删除文件的应用,让OS自动回收磁盘空间。

3,也可以重启操作系统,不过这并不是最好的方法

4,对待这种进程不停对文件写日志的操作,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件。通过这种方法,磁盘空间不但可以马上释放,也可保障进程继续向文件写入日志。

在线清空文件(比如/home/wangshibo.log)的方式:

a)# echo " " > /home/wangshibo.log
b)# cat /dev/null > /home/wangshibo.log
c)# > /home/wangshibo.log

还有一种磁盘空间使用问题的现象:明明使用df -h命令查看磁盘空间使用率不算高,还有很多空余空间,但是创建文件或写入数据时一直报错磁盘写满:” no space left on device”!

一般这种问题都是由于分区目录下deleted删除后的资源空间没有真正释放出来导致的, 具体处理流程如下:

1.先df -lh查看一下磁盘使用状况, 发现/data分区下的Used已用空间很大, 但是实际查看并没有占用那么大的空间!

2.找到被删除文件所在的分区, 比如/data分区

3.查看被删除了的所有文件:lsof -n /data |grep deleted

4.杀死这些文件的delete进程, 释放空间: lsof -n /data |grep deleted|awk ‘{print $2}’|xargs kill -9

5.接着再运行lsof -n /data |grep delete,应该就没有结果了。

6.注意: 刚杀死deleted进程时, df -h查看/data 分区, Used已用空间可能时瞬间显示过大, 但随着deleted进程杀死, 资源逐渐释放, /data分区下的Used已用空间会逐渐变小, Avail可用空间会逐渐变大)

大多数文件系统都会保留一部分空间留作紧急情况时用(比如硬盘空间满了),这样能保证有些关键应用(比如数据库)在硬盘满的时候有点余地,不致于马上就 crash,给监控系统和管理员一点时间去察觉。不过有时候这部分预留的硬盘空间不用的话有点浪费。

在Linux系统中,ext2、ext3、ext4文件系统上通常会默认预留5%的磁盘空间,比如磁盘如果是2TB,这就意味着有100GB的空间会被预留下来,这样的话会不会显得有点浪费了。可以通过”tune2fs”命令来改变5%的默认设置,比如只预留2%的空间。但是不建议设成0%,现实环境中这样做不安全。

[root@ss-server ~]# df -T
Filesystem     Type     1K-blocks    Used Available Use% Mounted on
/dev/vda1      ext4      41151808 4962148  34076228  13% /
devtmpfs       devtmpfs   1931468       0   1931468   0% /dev
tmpfs          tmpfs      1941204       0   1941204   0% /dev/shm
tmpfs          tmpfs      1941204     652   1940552   1% /run
tmpfs          tmpfs      1941204       0   1941204   0% /sys/fs/cgroup
tmpfs          tmpfs       388244       0    388244   0% /run/user/0

[root@ss-server ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G  4.8G   33G  13% /
devtmpfs        1.9G     0  1.9G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G  620K  1.9G   1% /run
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
tmpfs           380M     0  380M   0% /run/user/0

比如上面”/”分区是ext4文件系统,默认系统预留了5%也就是2G的空间。现在可以通过”tune2fs”命令将系统预留空间改为2%。

[root@ss-server ~]# tune2fs -m 2 /dev/vda1
tune2fs 1.42.9 (28-Dec-2013)
Setting reserved blocks percentage to 2% (209704 blocks)

执行后,发现”/”分区腾出了1G的空间,这时系统预留空间也就是2%了。

[root@ss-server ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G  4.8G   34G  13% /
devtmpfs        1.9G     0  1.9G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G  620K  1.9G   1% /run
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
tmpfs           380M     0  380M   0% /run/user/0

注意:Linux下只有ext2、ext3、ext4文件系统时,系统才会默认预留5%的磁盘空间。如果文件系统是xfs、tmpfs、devtmpfs、overlay等,则系统默认不会预留磁盘空间。

原文链接:https://www.magedu.com/84516.html

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 跟大神一起十五分钟制作一个属于自己得Linux操作系统!

    一、前言 Linux操作系统至1991年10月5日诞生以来,就其开源性和自由性得到了很多技术大牛的青睐,每个Linux爱好者都为其贡献了自己的一份力,不管是在L...

    小小科
  • Linux下删除大量文件效率对比

    小小科
  • 用Python实现极大似然估计

    极大似然估计(Maximum likelihood estimation, 简称MLE)是很常用的参数估计方法,极大似然原理的直观想法是,一个随机试验如有若干个...

    小小科
  • 从零开始一起学习SLAM | 为什么要学SLAM?

    在《零基础小白,如何入门计算机视觉?》中我提到过,计算机视觉的研究目前主要分为两大方向:基于学习的方法和基于几何的方法。其中基于学习的方法最火的就是深度学习,而...

    用户1150922
  • 聊聊jdbc的batch操作

    statement的batch操作,可以批量进行insert或update操作,提升操作性能,特别是在大数据量的insert或update的时候。

    codecraft
  • Emacs Org mode 小技巧

    在 Org Mode 写一些笔记的时候,经常会用到下划线 -,而 a_b 总是会变成 ab 的形式,可以通过在文档的最上面,增加配置来关闭自动转义,对于在文章头...

    zucchiniy
  • 深入学习 Node.js Module

    Node.js 遵循 CommonJS规范,该规范的核心思想是允许模块通过 require 方法来同步加载所要依赖的其他模块,然后通过 exports 或 mo...

    阿宝哥
  • 前端模块系统

    这是最原始的 JavaScript 文件加载方式,如果把每一个文件看做是一个模块,那么他们的接口通常是暴露在全局作用域下,也就是定义在 window 对象中,不...

    奋飛
  • NodeJS学习二CommonJS规范

    Node程序由许多个模块组成,每个模块就是一个文件。Node模块采用了CommonJS规范。

    空空云
  • 从 IP 开始,学习数字逻辑:FIFO 篇(上)

    使用 ip 对于数字逻辑方面的工作来说,是非常正常的,基础的 ip 之于数字逻辑设计,与与非门相比大概只是设计层次上的差别。更何况对于 SoC 公司来说...

    碎碎思

扫码关注云+社区

领取腾讯云代金券