这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战
当在磁盘、分区或者卷上创建文件系统(格式化)之后,就会被划分为两个部分:
- 元数据
metadata:也叫inode,用来存储block数据的信息,包括:inode编号- 文件的
owner、owner group - 访问许可
read、write、execute - 类型
type - 创建时间
ctime、最近一次的读取时间atime、最近修改的时间mtime - 文件大小
- 定义文件特性的标记位
flag,如SetUID - 文件真正内容的指针
pointer
- 数据块
data block:用来存储数据
inode 有两个功能:记录档案属性和指针。操作系统通过 inode 值可以快速地找到文件所对应的数据块。
inode里面没有文件对象的名称。
inode 表包括:
- 文件对象的
inode编号 - 除了文件名以外的所有文件信息
- 指向数据块区域的指针
一个文件系统中,inode 表中可以保存的记录总数是固定的。如果表用完了,即使数据区域中还有空闲空间,也不能创建文件。
inode 位图:
- 以二进制的方式记录
inode表中哪条记录是空闲的
block 位图:
- 以二进制的方式记录
block区域哪块是空闲的
在 block 区域中:
- 如果是文件,将占用一个或多个块
- 对于目录来说,其实是一种特殊的文件,它在块中保存该目录中文件的名称,以及子目录的名称,还有它们对应的
inode编号。
所以一个文件对象的名称不是保存在 inode 区域中,而是保存在该文件对象的父文件夹的个 block 块中。
目录是一种特殊的文件,虽然在图形界面中它像一个文件夹,但是在文件系统中,它不是一个容器,可以把它理解成路径的映射表。
创建文件的流程:
- 查找
inode位图,寻找一个空闲的编号,比如16777349,将其标记为占用 - 查找
/etc/目录,在数据块中创建新文件名,以及刚才分配的inode编号16777349 - 下面开始写数据,查看
block位图,分配空闲的块给文件 - 在
block区域写入文件的实际数据 - 在
inode区域创建新文件对象的inode信息
虽然文件的创建流程是分好几步的,但是它是一个具备原子性的事务,要么全部成功,要么全部失败。
删除文件的流程:
- 找到文件所处文件夹的块区域,删除文件名以及
inode号 - 删除
inode区域中待删除文件的inode号 - 将
inode位图和block位图标记为空闲
rm 这种删除操作,实际上不会操作文件 block 区域的数据,以后在创建其他文件时,才会覆盖标记为空闲的块。所以可以通过 block 区域中的数据实现文件回复。文件粉碎也是使用随机 01 数据,或者全 0 全 1 的数据,来覆盖原始文件数据块,使文件难以恢复。