rm -rf之后磁盘空间没有释放的解决方法

目录
  • rm -rf之后就高枕无忧了?
  • du和ls的区别
  • 总结

rm -rf之后就高枕无忧了?

现在运营的平台采用的是微服务架构,部署的服务较多,开发环境一台服务器上部署几十个服务是很正常的,之前用CI构建部署的时候,发现磁盘满了。我的处理方式是:先删了 /tmp/ 目录, 空闲出部分空间,然后检查下几个常用的用户目录,发现几个日志文件占用了好几个大G,由于是开发环境,所以就直接删除, 于是 rm之后就天真地认为万事大吉了...

然而过几天后,又有同事发现该机器磁盘又满了,惊呼奇怪咋这么快又满了。最终发现是上次 rm后,占用好几个大G的日志文件被删除之后,磁盘空间并没有释放。Linux系统中是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count 和 i_nlink,也就是说:Linux系统中只有i_nlink及i_count都为0的时候,这个文件才会真正被删除。 

  • i_count表示当前文件使用者(或被调用)的数量
  • i_nlink表示介质连接的数量(硬链接的数量);

可以理解为i_count是内存引用计数器,i_nlink是磁盘的引用计数器。 当一个文件被某一个进程引用时,对应i_count数就会增加;当创建文件的硬链接的时候,对应i_nlink数就会增加。在Linux或者Unix系统中,通过rm或者文件管理器删除文件,只是将它会从文件系统的目录结构上解除链接(unlink),实际上就是减少磁盘引用计数i_nlink,但是并不会减少i_count数。如果一个文件正在被某个进程调用,用户使用rm命令把文件"删除"了,这时候通过ls等文件管理命令就无法找到这个文件了,但是并不意味着这个文件真正的从磁盘上删除了。因为还有一个进程在正常的执行,在向文件中读取或写入,也就是说文件其实并没有被真正的"删除",所以磁盘空间也就会一直被占用。当服务进程停止(文件句柄的引用计数会变为0)或者重启后,占用的存储空间才被释放。如果不知道具体进程或文件名的话:lsof | grep deleted,这样会查找所有被删除的但是文件句柄没有释放的文件和相应的进程,然后再kill掉进程或者重启进程即可。

其实可以简单用修改文件内容的方式(例如echo "test">test.log)在不用重启进程的情况下释放空间。

du和ls的区别

对于某个日志文件,直接用echo "test" > yyzx_tradingcenterservice.log.2020-06-03.log,然后 df 确认磁盘空间确实已经释放,分别执行下面的命令:

[dev@tjptdebug-no yyzx_tradingcenterservice_logs]$ du -h  yyzx_tradingcenterservice.log.2020-06-03.log
4.0K	yyzx_tradingcenterservice.log.2020-06-03.log
[dev@tjptdebug-no yyzx_tradingcenterservice_logs]$ ll -h  yyzx_tradingcenterservice.log.2020-06-03.log
-rw-rw-r-- 1 dev dev 7 Jul  8 19:49 yyzx_tradingcenterservice.log.2020-06-03.log

ls 的结果是 apparent sizes,我的理解是文件长度,就类似文件系统中 file 这个数据结构中的定义文件长度的这个字段,du 的结果 disk usage,即真正占用存储空间的大小,且默认度量单位是 block。block 为磁盘存储的基本的单位,方便磁盘寻址等,而此处的block可以理解为一个逻辑单位,且一个文件除了包括数据外,还需要存储描述此文件的其他信息,因此包含1个字节的文件实际在磁盘中占用的存储空间不止1个字节。

总结

du == disk usage (磁盘使用量,占用的磁盘空间)
ls == apparent sizes(文件长度,file数据结构中定义的文件长度字段)
一个文件占用的磁盘空间和一个文件的大小是两码事情。占用空间取决于文件系统的块(block)的大小,Linux一般默认是4k(4096) ,因此,一个大小为1个字节的文件,最小也要占用4k,如果你创建文件系统的时候制定块大小是16K,那么即便一个文件只有1个字节,占用空间也是16K。通常情况下,ls 显示的文件大小比du显示的磁盘占用空间小,比如文件系统的block是4K,一个13K的文件占用的空间是 13k/4k = 3.25 个block,一个block只能被一个文件占用,因此实际占用空间就是4个block,就是16K。

到此这篇关于rm -rf之后磁盘空间没有释放的解决方法的文章就介绍到这了,更多相关rm -rf磁盘释放内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 慎用rm -rf /与 rm -rf /* 推荐使用mv代替rm

    目录 测试结果(命令总结) rm 命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉 命令 作用 -f 强制删除文件或目录 -i 删除已有文件或目录之前先询问用户 -r 递归处理, 将指定目录下的所有文件与子目录一并处理 / 在Linux中表示根目录 * 所有文件 /* 根目录下的所有文件 注意:一旦你执行了上述"rm -rf /" 或者"rm -rf /*"命令,会删除Linux根目录下的所有文件,直接导致服务器瘫痪

  • 记录服务器rm -rf误删文件的恢复过程

    安排一个工程师在一台生产服务器上安装Oracle,工程师边研究边安装,感觉装的不对,准备卸载重新安装.从网上找到卸载方法,其中要执行一行命令删除Oracle的安装目录,命令如下: rm -rf $ORACLE_BASE/* 如果ORACLE_BASE这个变量没有赋值,那命令就变成了 rm -rf /* ==||,妹子使用的可是root账户啊.就这样,把整个盘的文件全部删除了,包括应用Tomcat.MySQL数据库 and so on.... (mysql数据库不是在运行吗?linux能删除正在执

  • rm -rf之后磁盘空间没有释放的解决方法

    目录 rm -rf之后就高枕无忧了? du和ls的区别 总结 rm -rf之后就高枕无忧了? 现在运营的平台采用的是微服务架构,部署的服务较多,开发环境一台服务器上部署几十个服务是很正常的,之前用CI构建部署的时候,发现磁盘满了.我的处理方式是:先删了 /tmp/ 目录, 空闲出部分空间,然后检查下几个常用的用户目录,发现几个日志文件占用了好几个大G,由于是开发环境,所以就直接删除, 于是 rm之后就天真地认为万事大吉了... 然而过几天后,又有同事发现该机器磁盘又满了,惊呼奇怪咋这么快又满了.

  • MySQL Delete 删数据后磁盘空间未释放的原因

    问题描述 在 MySQL 中使用 delete 语句删除数据之后,监控视图中可用的磁盘空间没有增加,磁盘使用率没有下降等等. 解决方案 delete 不释放空间是 MySQL 自身机制的原因,需要重建表才可以释放磁盘空间,可以参考的操作: 执行 optimize table ${table_name}. 如果是 InnoDB 的表,执行 alter table ${table_name} engine = innodb. 需要注意以下两个问题: 这两个命令都会重建表,尽量不要在磁盘空间紧张(>9

  • CI框架出现mysql数据库连接资源无法释放的解决方法

    本文实例分析了CI框架出现mysql数据库连接资源无法释放的解决方法.分享给大家供大家参考,具体如下: 使用ci框架提供的类查询数据: $this->load->database(); $query = $this->db->query($sql); 程序运行一段时间之后,报错,告知数据库too many connections 很明显MySQL数据库连接资源超过了 max_connections 设定值.立马在每个查询之后,添加资源释放脚本: $this->db->c

  • Mysql InnoDB删除数据后释放磁盘空间的方法

    Innodb数据库对于已经删除的数据只是标记为删除,并不真正释放所占用的磁盘空间,这就导致InnoDB数据库文件不断增长. 如果在创建数据库的时候设置innodb_file_per_table=1,这样InnoDB会对每个表创建一个数据文件,然后只需要运行OPTIMIZE TABLE 命令就可以释放所有已经删除的磁盘空间. 运行OPTIMIZE TABLE 表名后,虽然最后会报Table does not support optimize, doing recreate + analyze in

  • Linux磁盘空间释放问题整理

    IDC里的一台服务器的/分区使用率爆满了!已达到100%!经查看发现有个文件过大(80G),于是在跟有关同事确认后rm -f果断删除该文件.但是发现删除该文件后,/分区的磁盘空间压根没有释放出来,使用率还是100%!这是为什么呢?? [root@linux-node1 ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/VolGroup00-LogVol00 58G 7.8G 47G 100% /tmpfs 1.9G 0

  • mongodb 集群重构和释放磁盘空间实例详解

    MongoDB集群重构,释放磁盘空间 由于mongodb删除了一部分数据后,不会回收相应的磁盘空间,所以这里通过重建数据目录的方式释放磁盘空间. 一 实验环境 配置了一个副本集,该副本集由以下三个节点组成: 10.192.203.201:27017 PRIMARY 10.192.203.202:27017 SECONDARY 10.192.203.202:10001  ARBITER 二 实验步骤 2.1 模拟环境 use dba; for(var i=0;i<1000000;i++)db.c.

  • MySQL delete删除数据后释放磁盘空间的操作方法

    目录 一.删除表|清空数据表 二.删除表数据 三.优化表空间 当 MySQL 数据库服务删除部分数据后:有些情况下这些数据占用的存储空间会释放掉,有些情况这些存储空间则不会释放.以下是对这种情况的简单说明: 一.删除表|清空数据表 当执行删除数据表或者清空数据表的全部数据操作时,都会释放掉相应的磁盘存储空间. drop table table_name; truncate table table_name; 在MyISAM和InnoDB(innodb_file_per_table)存储引擎中,数

  • 关于Linux服务器磁盘空间占满问题的解决方法

    下面我们一起来看一篇关于Linux服务器磁盘占满问题解决(/dev/sda3 满了),希望碰到此类问题的人能带来帮助. 今天下班某电商技术部leader发现个问题,说他们服务器硬盘满了.把日志文件都删掉了,可硬盘空间依旧满.于是df -h查看了下各个挂载点的状况(如下图). /dev/sda3占用了100%,那么我们du -s -h ./*看下目录的占用情况(如下图). 在工作中,我们也许会遇到这样的问题,发现某个磁盘空间快满了,于是,找到一些无用的大文件将其删除后,发现磁盘空间还是没有释放掉,

  • 清除CentOS 6或CentOS 7上的磁盘空间的方法

    以下是清除CentOS 6或CentOS 7服务器上的磁盘空间的快速命令. 首先需要安装yum-utils包: yum -y install yum-utils 1.修剪日志文件 find /var -name "*.log" ( ( -size +50M -mtime +7 ) -o -mtime +30 ) -exec truncate {} --size 0 ; 这将截断*.log卷/var上超过7天且超过50M或超过30天的所有文件. 2.清理YUM缓存 清理yum缓存很简单:

  • Ubuntu上释放空间的5种简单方法

    前言 大多数人可能在系统磁盘存储不足的情况下执行释放空间这个操作,也可能在 Linux 系统磁盘存储满了的情况下执行这个操作. 它应该被经常执行,来为安装一个新的应用程序和处理其它文件弥补磁盘存储空间.保持可用空间是 Linux 管理员的一个日常任务,以允许磁盘利用率维持在阈值之下. 这里有一些我们可以清理我们系统空间的方法. 当你有 TB 级存储容量时,可能不需要清理你的系统.但是,如果你空间有限,那么释放磁盘空间就变的不可避免. 在这篇文章中,我将向你展示一些最容易的或简单的方法来清理你的

随机推荐