ext4文件系统结构
- ext4文件系统将磁盘从逻辑上分割成多个块组,每个块组中的结构类似下面这样(并非都是这样)
查看文件对应的ext4_dir_entry_2对象
-
首先创建一个文件angs,并写入内容xxxtest
-
ext4文件系统是树形结构,文件的一些信息如inode number和文件名都是存在父目录中。此文件对应的ext4_dir_entry_2对象如下
-
解析后的结果如下(解析后的结果见注释):
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
};
- 为什么此结构体的长度是4060呢?因为ext4规定块中最后一个dir_entry的rec_len要记录自身的大小和块的剩余大小。即rec_len=结构体自身大小+块剩余大小。因为每个目录都有
.
(当前目录)和..
(上一级目录)这两个硬链接,各占12字节,每个块的最后12个字节会用来存放校验和,所以rec_len=4096-12*3=4060,和我们的结果相同。
查看文件本身
-
获取此文件的inode
-
查看此inode的元数据
-
查看此文件对应的data block(0x0a是换行符)
删除后的dir_entry对象数据
-
删除这个文件,可以看到此文件已经被成功删除了
-
但是删除文件后,文件对应的ext4_dir_entry_2对象被删除了吗?我们通过再查看下目录的data block。可以看到,此对象的数据没有发生变化。原二进制和现在的二进制都是
0x 8501 6000 dc0f 0401 616e 6773 8601 6000
-
根据正常的逻辑,删除这个文件后,肯定有地方发生了修改,我们通过文件比对工具可以看到,硬连接
..
对应的对象数据发生了变化,他的长度变成了0xfe8即4072,长度增加了12个字节。 -
所以我们得出了一个结论,删除文件时不会修改此文件对应的ext4_dir_entry_2对象数据,而是直接修改相邻的上一个dir_entry对象的长度,删除文件并不是将dir_entry的inode置0。
-
可以通过如下命令来查看目录中被删除的文件的inode。
删除后的inode和data block
-
删除文件后还能看到inode的数据吗?回答是肯定的,再次使用上面的命令来查看inode。可以看到,文件的大小变成了0、多了个删除时间dtime、文件对应的数据块也没了。
-
目前找不到指向data block的指针了,我们直接使用前面的指针,看看文件的data block。可以看到,文件的数据还存在的。
删除文件后释放bitmap对应的位置
-
删除文件其实会释放data block和inode在bitmap中对应的位置。我们首先创建一个文件,并获取当前剩余的inode和data block位置。
-
删除此文件后, 可以看到对应的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
}
总结
- 删除一个文件时文件只是将文件占用的位置释放掉了,而文件的数据还是存在的。后续如果写入数据,就会覆盖对应的位置。