linux文件与inode

缘起

周末接到告警,一个线上服务对机器磁盘占用率100%了。马不停蹄地登上线上机器df了一把,果然100%了。赶紧去服务对log目录下删了一批日志文件。然后又df一下确认…,怎么占用率还是100%?!明明刚刚删除了一些大文件,为什么df报告占用率还是满的?赶紧用du看了看各个目录占用情况,发现没有占用到100%啊。经过一番搜索,发现 那些大文件虽然被删除了,但是仍然被某进程打开,所以占用对磁盘空间并没有被释放
使用

lsof +L1
# 或者
lsof | grep deleted

找到删除但仍被进程打开的文件。命令输出的第二列是进程对pid,重启该pid就行了。
这时再df一下,一切正常了。

rm删除文件

通过上面对情景,我意识到,使用rm命令删除文件的时候并没有真正删除文件占用对空间。那么它干了些啥呢?
要回答这个问题,那就要解释一下Linux系统中文件名和文件链接了。
新建一个test.txt

echo "hello world" >> test.txt

ls查看一下

ls -l test.txt
-rw-rw-r-- 1 damon damon 13 Oct 23 14:35 test.txt

注意ls命令输出对第二列,数字1表示文件的链接个数。
下面,给文件新建一个链接,取名为test.txt1

ln test.txt test.txt1

这时再用ls命令查看一下

ls -l

-rw-rw-r-- 2 damon damon  13 Oct 23 14:35 test.txt
-rw-rw-r-- 2 damon damon  13 Oct 23 14:35 test.txt1

此时,文件已经有两个链接了,而文件名字test.txttest.txt1只是链接的名字而已。
顺便提一下软链接,软链接只是文件名的另外一个符号而已(alias)。用ln -s命令新建一个软链接。

ln -s test.txt1 test.txt2
ls -l 

-rw-rw-r-- 2 damon damon  13 Oct 23 14:35 test.txt
-rw-rw-r-- 2 damon damon  13 Oct 23 14:35 test.txt1
lrwxrwxrwx 1 damon damon   9 Oct 23 15:07 test.txt2 -> test.txt1

发现test.txt和test.txt1代表对文件对链接数还是2. 软链接不会增加文件的链接个数。而软链接test.txt2指向文件名test.txt1.
这里写图片描述

好了,做了这么多准备工作,终于可以rm一下做实验了。
先删除test.txt1

rm test.txt1

ls -al

-rw-rw-r-- 1 damon damon  13 Oct 23 14:35 test.txt
lrwxrwxrwx 1 damon damon   9 Oct 23 15:07 test.txt2 -> test.txt1

发现文件的链接个数只剩下1,既·test.txt.由于test.txt1这个链接被删除掉了,指向这个链接的软链接test.txt2也失效了。
总结,rm命令删除的只是文件的链接而已,没有删除磁盘上对应的文件。当一个文件的链接数为0,操作系统会认为该inode对应的磁盘空间被释放出来。

inode 和 文件描述符的关系

Linux里每个进程都有0,1,2三个标准文件描述符,分别对应着输入输出和错误输出。如果进程使用open系统调用打开一个文件tmp.txt,那么进程就会有一个新的文件描述符3,如果再打开其他文件,就会有4,5,6...这样的数字表示的文件描述符。
进程里的文件描述符和 inode 有什么关系呢?Linux内核是如何对应起来的呢?
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值