ext4文件系统删除文件的流程

ext4文件系统结构

  • ext4文件系统将磁盘从逻辑上分割成多个块组,每个块组中的结构类似下面这样(并非都是这样)
    请添加图片描述

查看文件对应的ext4_dir_entry_2对象

  1. 首先创建一个文件angs,并写入内容xxxtest
    请添加图片描述

  2. ext4文件系统是树形结构,文件的一些信息如inode number和文件名都是存在父目录中。此文件对应的ext4_dir_entry_2对象如下

    请添加图片描述

  3. 解析后的结果如下(解析后的结果见注释):

struct ext4_dir_entry_2 {
	__le32	inode;			//inode number0x600185 即6291845
	__le16	rec_len;		//此结构体大小 0xfdc 即4060
	__u8	name_len;		//文件名长度 4 
	__u8	file_type;		//文件类型 1 即普通文件
	char	name[EXT4_NAME_LEN];	//文件名 0x616e 6773
};
  1. 为什么此结构体的长度是4060呢?因为ext4规定块中最后一个dir_entry的rec_len要记录自身的大小和块的剩余大小。即rec_len=结构体自身大小+块剩余大小。因为每个目录都有.(当前目录)和..(上一级目录)这两个硬链接,各占12字节,每个块的最后12个字节会用来存放校验和,所以rec_len=4096-12*3=4060,和我们的结果相同。

查看文件本身

  1. 获取此文件的inode
    请添加图片描述

  2. 查看此inode的元数据
    请添加图片描述

  3. 查看此文件对应的data block(0x0a是换行符)
    请添加图片描述

删除后的dir_entry对象数据

  1. 删除这个文件,可以看到此文件已经被成功删除了
    请添加图片描述

  2. 但是删除文件后,文件对应的ext4_dir_entry_2对象被删除了吗?我们通过再查看下目录的data block。可以看到,此对象的数据没有发生变化。原二进制和现在的二进制都是0x 8501 6000 dc0f 0401 616e 6773 8601 6000
    请添加图片描述

  3. 根据正常的逻辑,删除这个文件后,肯定有地方发生了修改,我们通过文件比对工具可以看到,硬连接..对应的对象数据发生了变化,他的长度变成了0xfe8即4072,长度增加了12个字节。
    请添加图片描述

  4. 所以我们得出了一个结论,删除文件时不会修改此文件对应的ext4_dir_entry_2对象数据,而是直接修改相邻的上一个dir_entry对象的长度,删除文件并不是将dir_entry的inode置0。

  5. 可以通过如下命令来查看目录中被删除的文件的inode。
    请添加图片描述

删除后的inode和data block

  1. 删除文件后还能看到inode的数据吗?回答是肯定的,再次使用上面的命令来查看inode。可以看到,文件的大小变成了0、多了个删除时间dtime、文件对应的数据块也没了。
    请添加图片描述

  2. 目前找不到指向data block的指针了,我们直接使用前面的指针,看看文件的data block。可以看到,文件的数据还存在的。
    请添加图片描述

删除文件后释放bitmap对应的位置

  1. 删除文件其实会释放data block和inode在bitmap中对应的位置。我们首先创建一个文件,并获取当前剩余的inode和data block位置。
    请添加图片描述

  2. 删除此文件后, 可以看到对应的inode和data block都释放了
    请添加图片描述

删除inode前后二进制数据比较

  • 以下为删除前和删除后的二进制数据对比
    请添加图片描述

  • 通过和inode结构体对比,发现修改后的数据如下:

struct ext4_inode {
    i_size_lo; //文件大小 从0x0000 0c00修改为0x0000 0000
    i_ctime;  //inode修改时间(change) 从0x89af 7d64修改为0xfaaf 7d64
    i_mtime;  //data block修改时间 从0x89af 7d64 修改为faaf 7d64
    i_dtime;  //删除时间 从0x0000 0000修改为0xfaaf 7d64
    i_links_count;  //硬连接数量 从0x0100变成了0x0000
    i_blocks_lo;  //块的数量,默认以块的大小为512来计算 从0x0800 0000 变成了0x0000 0000
    i_block[EXT4_N_BLOCKS=15];  //extent结构,包含一个extent头和一个extent,extent全部置0,extent头的eh_entries从1变成了0
    i_osd2;  //此结构包含多个字段,变化的是此结构中的inode校验和。
    i_checksum_hi;  //校验和的高位从0x9b40变为0x6411
    i_ctime_extra;  //额外的inode修改时间 由0x14db 368f变为0x245c 6d77
    i_mtime_extra;  //额外的data block修改时间 由0x14db 368f 变为245c 6d77


}

总结

  • 删除一个文件时文件只是将文件占用的位置释放掉了,而文件的数据还是存在的。后续如果写入数据,就会覆盖对应的位置。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值