rm 删除文件空间

软件工
• 阅读 645

在 Linux,你是不是曾经天真的以为,使用rm删除一个文件,占用的空间就释放了?事情可能不是常常如人意。
rm 删除文件空间

产生一个指定大小的随机内容文件

我们先看一下当前各个挂载目录的空间大小:

$ df -h/dev/sda11      454M  280M  147M  66% /boot

我这里挑选了其中一个结果展示(你可以选择任一挂载目录),接下来准备在/boot下生成一个文件。

首先我们产生一个50M大小的文件:

$ dd if=/dev/urandom of=/boot/test.txt bs=50M count=1

至此,我们产生了一个50M大小的文件,再看boot下:

$ df -h/dev/sda11      454M  312M  115M  74% /boot

这里你不用关心到底多了多少,你只需要关注,/boot下的文件增多了。

测试程序:

#include<stdio.h>#include<unistd.h>int main(void){    FILE *fp = NULL;    fp = fopen("/boot/test.txt", "rw+");    if(NULL == fp)    {       perror("open file failed");       return -1;    }    while(1)    {       //do nothing       sleep(1);    }    fclose(fp);    return 0;}

至于程序本身,也没干啥实际的事情,就是打开一个文件,然后一直循环。编译并运行:

$ gcc -o openFile openFile.c$ ./openFile

打开另外一个窗口,删掉test.txt:

$ rm /boot/test.txt

再看一下boot空间:

$ df -hdev/sda11      454M  312M  115M  74% /boot

咦?空间大小怎么一点都没变!!明明使用rm把它删除了啊?

我们把openFile程序停掉,再看看:

$$ df -h/dev/sda11      454M  280M  147M  66% /boot

乖乖,空间马上就释放掉了,也就是按照预期,我们的文件被删除了。

一个文件什么情况下才会被删除?

实际上,只有当一个文件的引用计数为0(包括硬链接数)的时候,才可能调用unlink删除,只要它不是0,那么就不会被删除。所谓的删除,也不过是文件名到 inode 的链接删除,只要不被重新写入新的数据,磁盘上的block数据块不会被删除,因此,你会看到,即便删库跑路了,某些数据还是可以恢复的。换句话说,当一个程序打开一个文件的时候(获取到文件描述符),它的引用计数会被+1,rm虽然看似删除了文件,实际上只是会将引用计数减1,但由于引用计数不为0,因此文件不会被删除。

struct inode {struct hlist_node   i_hash; /* hash链表的指针 */struct list_head    i_list; /* backing dev IO list */struct list_head    i_sb_list; /* 超级块的inode链表 */struct list_head    i_dentry; /* 引用inode的目录项对象链表头 */unsigned long    i_ino; /* 索引节点号 */atomic_t         i_count; /* 引用计数 */unsigned int     i_nlink; /* 硬链接数目 */

关于里面的细节,还有很多内容(如硬链接数量也会影响文件是否被删除),这里不一一展开。

如何释放已经被删除文件占用的空间?

关于释放,前面已经说了,重启打开该文件的进程即可。但是有没有方法找到哪些文件被删除了,但还是被某些进程打开了呢?

自然是有方法的:

$ lsof |grep deleted

其中被标记为deleted的文件,就是这样的一些文件。

其实在前面的例子中,我们也可以很容易观察到(openFile程序运行,test.txt文件被删除):

$ ls -al /proc/`pidof openFile`/fdtotal 0lrwx------ 1 root root 64 5月   4 09:27 0 -> /dev/pts/25lrwx------ 1 root root 64 5月   4 09:27 1 -> /dev/pts/25lrwx------ 1 root root 64 5月   4 09:27 2 -> /dev/pts/25lrwx------ 1 root root 64 5月   4 09:27 3 -> /boot/test.txt (deleted)

看见没有,test.txt后面还有deleted字样。

既然我们都说了,这样的情况下文件是没有被删除的,那么还能不能恢复呢?实际上还是可以读取的。

总结

实际上对于这种文件被删除了,常常出现于程序的日志文件中,可能你有一个定时任务去清理程序产生的日志文件,但是如果程序本身忘记关闭句柄,就会导致磁盘空间得不到释放,最终就是你认为文件都被删除了,但是磁盘却依然被占着。所以,养成好习惯,打开文件后,不用时,记得关闭文件描述符。

如果发现明明已经删除了大量文件,但是空间却并没有恢复正常,那么不妨看看是不是还有程序打开了这些文件。

以上就是良许教程网为各位朋友分享的rm 删除文件空间。

以上就是良许教程网为各位朋友分享的Linux相关知识。

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
维格云回收舱
在「回收舱」中,你可以:1.查看空间站中被删除的且当前成员拥有「可管理」权限的文件。2.找到已被删除的文件,恢复文件。维格云回收舱操作说明还原文件成员拥有文件的「可管理」权限时,文件被删除后可在回收舱中找回并恢复至工作目录顶部。空间站等级不同,文件保留时长不同。●青铜级:14天●白银级:3个月●企业级:12个月维格云回收舱注意事项文件权限保留
小尉迟 小尉迟
2年前
Mac大扫除!这些App帮你迅速清理不需要的内容,释放宝贵空间
又该整理硬盘、删除多余文件了!这些App能帮你迅速清理不需要的内容,释放宝贵的空间。这款App会用饼状图展示你硬盘中的所有内容,让你一眼发现视频和安装文件等占据空间的大块头在“饼”上占的面积越大,对应的文件或文件夹自然就越大。接下来,就层层剥开文件夹,把不
Stella981 Stella981
3年前
K8S 强制删除卡在Terminating状态的namespaces 记录
使用force强制删除,比如删除命名空间test,执行如下命令kubectldeletensmonitoringforcegraceperiod0调用API接口删除netstatntlp|grepku
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
Linux系统删除文件夹下所有文件
!(https://oscimg.oschina.net/oscnet/up7d5d4ae17890de6c42fae9460472f704b21.JPEG)这篇文章来为大家介绍一下如何在Linux系统下删除文件,当Linux系统使用时间过长以后,难免会产生一些垃圾文件,这些文件除了会占用磁盘空间之外还会降低系统的运行效率,所以长时间运行后
Stella981 Stella981
3年前
Linux基础学习笔记——压缩和解压(tar、zip)
压缩和解压缩Linux默认支持的压缩格式:gz、bz2、zip压缩目的:节省磁盘空间扩展:1.压缩文件尽量使用gz,因为占用空间较少,效率高;2.bz2压缩后的文件占用空间最小;3.zip压缩的文件占用空
Wesley13 Wesley13
3年前
oracle 删除表空间及数据文件方法
oracle11g版本,创建数据库表空间,默认单个数据文件最大为32G,如果数据文件大于32G,可以增加数据文件。\删除空的表空间,但是不包含物理文件droptablespacetablespace\_name;\删除非空表空间,但是不包含物理文件droptablespacetablespace\_namein
Stella981 Stella981
3年前
Linux文件路径、cd命令、mkdir、rmdir、rm命令
第二章文件、目录管理2.6相对路径和绝对路径相对路径相对路径就是相对当前目录来说的,比如我当前在/root下,那么要表示/root/213/可以直接ls213/绝对路径绝对路径是从/(也被称为根目录)开始的,比如/usr、/etc
Stella981 Stella981
3年前
Linux系统zip压缩命令
!(https://lxlinux.superbed.verylink.top/item/5fcee98b3ffa7d37b37c523b.jpg)不管是在Windows系统还是Linux系统中,我们常常会有一些大文件,特别占磁盘空间,对于这种占用空间大的文件我们很多时候就要用到ZIP(压缩文件格式),ZIP文件格式是一种数据压缩和文档储
linux系统 删除文件命令
Linux系统下删除文件是一个非常高频的需求,几乎每天都会遇到,所以rm命令是一个非常常用Linux命令。rm命令是英文单词remove的缩写,它主要作用是:1)删除文件;2)删除目录。如果删除对象是链接文件的话,则只会将链接文件删除,而原有文件保持不变。rm命令是一个非常危险的命令,要非常小心地使用,特别是对于新手。如果使用不当的话,轻则误删除重要