详解Linux下文件删除原理

一、文件读取原理

首先我们要先知道,在linux系统中,是通过inode编号来唯一标识一个文件的。也就说是,删除一个文件的过程其实就是inode编号释放的过程。

我们访问一个文件内容是通过文件名,那操作系统访问一个文件内容的过程是怎么样的?

这里需要引入文件系统的一个概念,它叫“目录项”。目录项里面保存着一条条的记录,这些记录映射了文件名与inode编号的关系。所以操作系统可以在目录项中根据文件名找到对应的inode节点,进而找到inode结构体中保存的文件的块地址,然后读取文件块的数据。

二、文件删除原理

接下进入正题,linux中文件的inode编号什么时候会被释放?

那当然inode编号没有被用的时候释放啦!那什么时候inode会被引用呢?

1、文件硬连接

什么是硬连接?新增一个文件名指向原文件的inode,那么这俩个文件名互为硬连接,它们指向的是同一个文件,只是文件命名不一样。所以我们在指向rm操作的时候,其实只是删除的一个硬连接。

2、文件引用

当程序运行的时候,可能会需要读取文件的数据,那么它其实也是通过文件名来找到inode,进而找到数据块的位置来读取数据。

所以嘛,只要inode硬连接数为0且没有程序引用此文件的时候,inode就会被释放了。

实际上在inode结构体中,有定义俩个变量,来记录文件当前被引用的数量以及硬连接数。当他们都为0的时候inode编号就会被释放。

struct inode {
........
unsigned long    i_ino;   //inode编号
atomic_t         i_count; //程序引用文件数 
unsigned int     i_nlink; //硬链接数目
........
}

这个时候可以查到磁盘空间变大了,删除的文件占用的磁盘空间被释放了。那么此文件数据是不是从磁盘上清空了呢?

实际上并不是,Linux系统采用的是“无限覆盖”的原理。当inode节点释放以后,操作系统会将这些数据块标记为可用(也可以通过du命令查到磁盘释放了)在新的数据的写入到这些数据块以后,磁盘原来的数据就会被覆盖而消失。试想一下,如果不这样做,我们删除一个大文件,那么磁盘块就需要清空,这就需要耗费大量的时间。

三、rm误删文件怎么办

rm误删除文件,不要急,冷静处理。如果此文件正在程序引用,我们是可以自己恢复的;如果文件没有被程序引用,我们也要采取相应的措施让损失最小化。

通过lsof命令查看文件被删除但正在被程序引用的文件以及进程编号:

lsof | grep '(deleted)'

如果这里没有看到被删除的文件,说明inode已经被释放了,那只能立刻停止该磁盘的写入操作,利用专业的数据恢复工具或公司来恢复数据。

如果这里看到了被删除的文件,假如里的/root/a.sh被rm删除但是还在被程序引用,那就到/proc/32372/fd/目录下,通过ls命令查看那个fd文件指向的原文件

可以看到是255指向的原文件,我们只需要用cp命令将其拷贝出来即可

cp /proc/32372/fd/255 /root/a.sh

ok恢复完成!

这些都是一样个人的见解,不对的地方请大家指正!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值