「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战」
我们知道,电脑中有一块重要的设备叫硬盘,它是用来存储信息数据的。无论是 HDD 还是 SSD,它内部的存储结构可以将信息数据转化为0或1的电信号,这个信号通过一定的编码方式由字节变成可被人类识别的信息,比如:视频、图片、文字等等。所以,这篇文章存储在服务器中时,它就是一串00011101110111...
如果我们的大脑足够聪明,我们是可以直接去读写硬盘中的原始数据的,对于程序员,我们只需要键盘的两个按键:0键和1键。
这太费脑力了,只会出现开科幻的影视中。当然,我们的大脑也是足够聪明的,我们会把费力不讨好的事情交给操作系统来做,它是一个管家,它提供一种名为文件系统的机制,当我想要看电影时,它会帮我把内容找出来。
文件系统
文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。也指用于存储文件的磁盘或分区,或文件系统种类。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:与文件管理有关软件、被管理文件以及实施文件管理所需数据结构。从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。
Linux 系统中,文件系统的结构大致包括:
- superblock 超级块,存储文件系统的总体信息,系统中会存在多个超级块,防止部分坏掉
- inode i节点,存储所有与文件有关的元数据,如:文件所有者、权限,以及指向的数据块
- data block 数据块 存放真实的文件数据,一个数据块默认是4KB
- directory block 目录块,存储文件名和文件目录位置,指向i节点信息
Linux支持多种不同的文件系统,包括ext2、ext3、ext4、zfs、iso9660、vfat、msdos、smbfs、nfs等。ext2 比较常用,我们重点了解下。
ext2 结构
全称是 secondextendedfilesystem,即第二代扩展文件系统。它是 Linux 早期最受欢迎的文件系统。
TIPS: Linux 最早引入的文件系统类型是 minix,由于其存在一定的局限性,比如说文件名最长仅支持14个字符,文件最大为64MB等因素,后来被 ext2 取代了。
从这张图里可以看出,硬盘中的磁盘以扇区形式划分(1扇区=512Bytes),ext2 文件系统将文件数据存储在数据块(Block)中,一般 1Block = 4KB = 8扇区。扇区的大小在硬盘出厂时就确定了,而 Block 的大小时在格式化时去确定的,如:以下命令指定
/dev/sda2的 Block 大小为 4KB
$ mke2fs -b 4096 /dev/sda2
现在由上至下对整个文件系统进行梳理:
-
MBR 是主引导记录,用来检查分区表的正确性,并确定引导分区(当 BOIS 自检结束后就把将其加入内存执行)。
-
Boot Sector 启动块,存储磁盘分区信息和启动信息,一般是1KB
-
Block Group ,ext2 会将分区划分为大小相等的组,每个组都包含
-
Super Block 超级块,存储文件系统的全局信息,如:Block Group 的大小,文件系统的版本等;还存储内部 inode 信息等
-
GDT(Group Descriptor Table)组描述符表,每个 Block Group 都会对应一个组描述符(Group Descriptior),存储了起始 inode 表在哪里,空闲的 inode 掘数据块剩余多少等信息。
Super Block 和 GDT 在每个组中都会拷贝一份,Linux 内核至会使用 Block Group0 中的超级块和组描述符表。其他组的是用来回复用的
- Block Bitmap 块位图,用来描述整个 Block Group 中哪些 Block 被使用,哪些 Block 是空闲的,其中的每个 bit 代表本块组中的一个块,这个 bit 为1表示该块已用,这个 bit 为0表示该块空闲可用。
Linux df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计,它的原理就是查看块位图。
-
inode Bitmap inode位图,和块位图相似,每个 bit 表示一个 inode 是否空闲
-
inode Table inode 表,存储文件数据之外的信息,如:文件类型(普通、目录、符号连接等)、权限、文件大小、创建|修改|访问时间等,每个文件都有一个 inode,占128B。
ls -l命令看到的内容都来自于 inode 中
➜ ~ ls -l go
total 12
drwxr-xr-x 2 zioyi zioyi 4096 Oct 4 15:45 bin
drwxr-xr-x 4 zioyi zioyi 4096 Oct 3 18:10 pkg
drwxr-xr-x 3 zioyi zioyi 4096 Oct 4 15:44 src
- Data Block 数据块
- 对于普通文件的内容存储在数据块中;
- 对于目录,通过
数据项的数据结构存储在数据块中,里面存储了文件、indoe 号、文件类型、记录长度等。
思考题
以上就是 ext2 文件系统的全部结构,我们现在来思考几个问题:
-
当我们去保存一个文件时,ext2 是如何执行的
- 从 Block Group0中的 GDT 里加载 inode bitmap, 从中找到空闲的 inode
- 申请占用这个 indoe,将文件内容和目录项信息写入这个 inode 指向的 Data Block,
- 更新对应的 inode Bitmap 和 Block Bitmap
-
当我们出打开一个文件时,ext2 是如何执行的
- 向查找根目录的目录向,Linux 中时指定存放在第二个 inode 中的
- 根目录的目录项中存着根目录下的子目录目录项和文件的数据块信息。通过根目录的目录项可以找到该文件的 inode
- 根据 inode 中的数据块指针找到存储有文件内容的数据块。
-
当我们去删除一个文件时,ext2 是如何执行的
- 知道该文件对应的 Block Group
- 将 Block Bitmap 中对应 bit 置为0
- 将 inode Bitmap 中对应 bit 置为0
也就是说系统只是更改了标志位,并没有将数据真正进行删除,如果 Block Data 没有被覆盖,可以通过一些工具进行恢复