Linux 磁盘与文件系统
1.硬盘的基础知识
1.1 分区的概念:
分区从实质上说就是对硬盘的一种格式化。当我们创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即 MasterBootRecord,一般简称为 MBR)和引导记录备份的存放位置。而对于文件系统以及其他操作系统管理硬盘所需要的信息则是通过以后的高级格式化,即 Format 命令来实现。面、磁道和扇区硬盘分区后,将会被划分为面(Side)、磁道(Track)和扇区(Sector)。需要注意的是,这些只是个虚拟的概念,并不是真正在硬盘上划轨道。
1.2 MBR简介:
MBR(Main Boot Record 主引记录)位于整个硬盘的 0 磁道 0 柱面 1 扇区。不过,在总共 512 字节的主引导扇区中, MBR 只占用了其中的 446 个字节,另外的 64 个字节交给了DPT(Disk Partition Table 硬盘分区表),最后两个字节“55, AA”是分区的结束标志。这个整体构成了硬盘的主引导扇区。
1.3 分区的原理:
主引导记录由三部分组成:一部分是 446byte 的操作系统引导代码(MBR),还有一部分是 64byte 的主分区表(DPT)。主分区表最多记录四个主分区的分区信息.每个分区占用 16byte。分区就是修改分区表,它不影响硬盘上的存储的数据。最后的 2 字节是结束标志。
扩展技术:需要将一块硬盘分成更多的分区,超过 5 个以上的分区,可以将最多四个主分区中的一个分区类型改为扩展分区,然后在扩展分区中再建逻辑分区。逻辑分区的分区信息保存在扩展分区之中,叫做扩展分区表。理论上逻辑分区没有个数的限制。扩展分区不能被直接使用,必须将其划分为若干个逻辑分区。逻辑分区的起始位置的信息都写在扩展分区表里面。逻辑分区的分区编号从 5 开始,如: /dev/hda5 是第一块硬盘的第一个逻辑分区。
1.4 格式化原理:
分好区的硬盘分区上面什么数据也没有,操作系统也不能读写,为了让操作系统能够识别必须向分区中预写入一定格式的数据。这个过程就称之为格式化。在 Linux 中称为创建文件系统。没有分区的硬盘是不能格式化的,没有格式化的分区是不能直接被使用的。所以分区和格式化往往都是同时进行的。
现在我们已经大概知道了一个硬盘的结构,当我们新买来一块硬盘时,必须经过分区和格式化才能进行使用,下面用简图表示一下一个硬盘的结构:
- superblock:记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等。
- inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码。
- block:实际记录文件的内容,若文件太大时,会占用多个 block。
注意:
1.inode 与 block 都有编号,而每个文件都会占用一个 inode ,inode 内则有文件数据放置的block 号码,如果能找到文件的inode 就可以找到文件。
2.在inode记录一个文件需要128字节大小的内存。
2.Linux的EXT2文件系统(inode)
为什么需要使用EXT2文件系统?
如果我的文件系统高达数百 GB 时, 那么将所有的 inode 与 block 通通放置在一起将是不理智的决定,因为 inode 与 block 的数量太庞大,不容易管理。因此 Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每个区块群组都有独立的 inode/block/superblock 系统。
在整体的划划当中,文件系统前面有一个启动扇区(boot sector),这个启动扇区可以安装开机管理程序, 这是个非常重要的设计,因为如此一来我们就能够将不同的开机管理程序安装到个别的文件系统最前端,而不用覆盖整块硬盘唯一的MBR, 这样也能够制作出多重引导的环境。至于每一个区块群组(block group)的六个主要内容说明如下:
Data Block:用来放置档案内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K三种而已。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode的记录。
Inode Table:主要记录文件的属性以及该文件实际数据放置的block号。
Superblock (超级区块):Superblock(大小为1024byte)是记录整个 filesystem 相关信息的地方,它记录的信息有如下:
- block与inode的总量
- 未使用和已经使用的inode/block的数量
- block 和 inode 的大小(inode 固定为128byte,block可选,1k,2k,4k)
- 记录最近文件系统创建时间,操作时间的详细信息
- 记录此文件系统书否被挂载,vaild bit数值为1表示未挂载,0表示挂载。
Filesystem Description (档案系统描述说明)
- 记录每个block group从开始到结束的block的号码
- 说明每个区段 (superblock,bitmap, inodemap, data block) 分别位于哪一个 block 号码之间
Block Bitmap (区块对照表):
- 就像是一张表记录的是,使用和未使用的block,以便系统调用,如果一个档案删除,它所占的block的区对照表也会被清除,这样block就会空出来。
Inode Bitmap (inode 对照表):
- 记录使用和未使用的inode号码。
3.与目录树的关系
每一个文件(不管是一般文件还是目录文件)都会占用一个inode,目录的内容记录文件名,一般文件记录实际数据内容。目录与文件在文件系统中如何记录数据呢?
- 目录:Linux 下的文件系统建立一个目录时,文件系统会分配一个 inode 与至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的 block 号码; 而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。
使用 ls -li 命令查看文件的inode 号码
- 文件:在 Linux 下的 ext2 建立一个一般文件时, ext2 会分配一个 inode 与相对于该文件大小的 block 数量给该文件。
- 目录树读取:inode 本身并不记录文件名,文件名的记录是在目录的 block 当中,所以 新增/删除/更名文件名与目录的 w 权限有关。 当我们要读取某个文件时,就务必会经过目录的 inode 和 block,然后才能够找到那个待读取文件的 inode 号码,最终才会读到正确的文件的 block 内的数据。由于目录树是由根目录开始读起,因此系统透过挂载的信息可以找到挂载点的 inode 号码,此时就能够得到根目录的 inode 内容,并依据该 inode 读取根目录的 block 内的文件名数据,再一层一层的往下读到正确的文件名。
读取 /etc/passed 文件的流程:
- / 的 inode 号码:通过挂载点信息找到根目录 inode号码(64),且 inode 具有的权限让我们可以读取该block的内容(r与x);
- / 的 block 号码:经过上述步骤取得 block 号码,并找到该内容中 etc/ 目录的 inode 号码(6777281);
- etc/ 的 inode 号码:读取 6777281 号 inode 得知具有 r 与 x 的权限,因此可以读取 etc/ 的 block 内容;
- etc/ 的 block 号码:经过上个步骤取得 block 号码,并找到该内容有 passwd 文件的 inode 号码(7931015);
- passwd 的 inode 号码:读取 7931015 号 inode 得知具有 r 的权限,因此可以读取 passed 的block 内容;
- passwd 的 block 号码: 最后将该 block 内容的数据读出来。
4. EXT2/EXT3/EXT4 文件的存取与日志式文件系统的功能
新建一个文件时,文件系统的行为是:
- 先确定用户对于欲增文件的目录是否具有 w 和 x 权限,若有才能新增
- 根据 inode bitmap 找到没有使用的idode 号码,并将新文件的权限、属性写入
- 根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且更新 inode 的 block 指向数据
- 将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新 superblock 的内容
inode table 与 data block 称为数据存放区域,superblock、 block bitmap 与 inode bitmap 等区段就被称为 metadata (中间数据) ,因为 superblock, inode bitmap 及 block bitmap 的数据是经常变动的,每次新增、移除、编辑时都可能会影响到这三个部分的数据,因此才被称为中间数据。
数据的不一致 (Inconsistent) 状态
文件在写入文件系统时,因为不知名原因导致系统中断(例如突然的停电、 系统核心发生错误发生时),所以写入的数据仅有 inode table 及 data block,最后一个同步更新中间数据的步骤并没有做完,此时就会发生 metadata 的内容与实际数据存放区产生不一致 (Inconsistent) 的情况。
在早期的 Ext2 文件系统中,如果发生这个问题, 那么系统在重新启动的时候,就会由 Superblock 当中记录的 valid bit (是否有挂载) 与 filesystem state (clean 与否) 等状态来判断是否强制进行数据一致性的检查,检查整个磁盘,耗时长,于是出现了日志式文件系统。
日志式文件系统 (Journaling filesystem)
在filesystem 当中规划出一个区块,该区块专门在记录写入或修订文件时的步骤:
- 预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息
- 实际写入:开始写入文件的权限与数据;开始更新 metadata 的数据
- 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该文件的纪录
5. Linux 文件系统的运作
由于磁盘写入的速度要比内存慢很多,在编辑保存文件时效率较低,为了解决这个问题Linux使用异步处理 (asynchronously) :当系统加载一个文件到内存后,如果该文件没有被动过,则在内存区段的文件数据会被设定为干净 (clean)的。 但如果内存中的文件数据被更改过了(例如你用 nano 去编辑过这个文件),此时该内存中 的数据会被设定为脏的 (Dirty)此时所有的动作都还在内存中执行,并没有写入到磁盘中! 系统会不定时的将内存中设定为『Dirty』的数据写回磁盘,以保持磁盘与内存数据的一致性。 也可以使用sync 指令来动写入磁盘。
- 系统会将常用的文件数据放置到主存储器的缓冲区,以加速文件系统的读/写,因此 Linux 的物理内存最后都会被用光!这是正常的情况!可加速系统效能
- 可以手动使用 sync 来强迫内存中设定为 Dirty 的文件回写到磁盘中
- 若正常关机时,关机指令会主动呼叫 sync 来将内存的数据回写入磁盘,若不正常关机(如跳电、当机或其他不明原因),由于数据尚未回写到磁盘内, 因此重新启动后可能会花 很多时间在进行磁盘检验,甚至可能导致文件系统的损毁(非磁盘损毁)
6. 挂载点的意义 (mount point)
每个 filesystem 都有独立的 inode / block / superblock 等信息,这个文件系统要能够链接到目录树才能被我们使用。 将文件系统与目录树结合的动作我们称为挂载。挂载点一定是目录,该目录为进入该文件系统的入口。
原文地址:
https://blog.csdn.net/qq_36243942/article/details/82820056