认识Linux文件系统
Linux最传统的磁盘文件系统(filesystem)使用的是EXT2
磁盘组成与分区的复习
一、整颗磁盘的组成主要有:
- 圆形的盘片(主要记录数据的部分);
- 机械手臂,与在机械手臂上的磁头(可读写盘片上的数据);
- 主轴马达,可以转动盘片,让机械手臂的磁头在盘片上读写数据。
三、盘片上的物理组成则为(假设此磁盘为单碟片):
- 扇区(Sector)为最小的物理储存单位,且依据磁盘设计的不同,目前主要有512Bytes与4K两种格式;
- 将扇区组成一个圆,那就是柱面(Cylinder);
- 早期的分区主要以柱面为最小分区单位,现在的分区通常使用扇区为最小分区单位(每个扇区都有其号码喔,就好像座位一样);
- 磁盘分区表主要有两种格式,一种是限制较多的MBR分区表,一种是较新且限制较少的GPT分区表。
- MBR分区表中,第一个扇区最重要,里面有主要开机区(Master boot record, MBR)及分区表(partition table),其中MBR占有446Bytes,而partition table则占有64Bytes。GPT分区表除了分区数量扩充较多之外,支持的磁盘容量也可以超过 2TB。
四、磁盘的文件名:
/dev/sd[a-p][1-128] :为实体磁盘的磁盘文件名;/dev/vd[a-d][1-128] :为虚拟磁盘的磁盘文件名
文件系统特性
一、磁盘分区完毕后还需要进行格式化(format),之后操作系统才能够使用这个文件系统。 为什么需要进行“格式化”呢?这是因为每种操作系统所设置的文件属性/权限并不相同, 为了存放这些文件所需的数据,因此就需要将分区进行格式化,以成为操作系统能够利用的“文件系统格式(filesystem)”。 二、传统的磁盘与文件系统之应用中,一个分区就是只能够被格式化成为一个文件系统,所以我们可以说一个 filesystem 就是一个 partition。但是由于新技术的利用,例如我们常听到的LVM与软件磁盘阵列(software raid), 这些技术可以将一个分区格式化为多个文件系统(例如LVM),也能够将多个分区合成一个文件系统(LVM, RAID)! 所以说,目前我们在格式化时已经不再说成针对 partition 来格式化了, 通常我们可以称呼一个可被挂载的数据为一个文件系统而不是一个分区喔! 三、那么文件系统是如何运行的呢?这与操作系统的文件数据有关。较新的操作系统的文件数据除了文件实际内容外, 通常含有非常多的属性,例如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。 文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。 四、每个 inode 与 block 都有编号,至于这三个数据的意义可以简略说明如下:
- superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;
- block:实际记录文件的内容,若文件太大时,会占用多个 block 。
五、由于每个 inode 与 block 都有编号,而每个文件都会占用一个 inode ,inode 内则有文件数据放置的 block 号码。 因此,我们可以知道的是,如果能够找到文件的 inode 的话,那么自然就会知道这个文件所放置数据的 block 号码, 当然也就能够读出该文件的实际数据了。 六、文件系统先格式化出 inode 与 block 的区块,假设某一个文件的属性与权限数据是放置到 inode 4 号(下图较小方格内),而这个 inode 记录了文件数据的实际放置点为 2, 7, 13, 15 这四个 block 号码,此时我们的操作系统就能够据此来排列磁盘的读取顺序,可以一口气将四个 block 内容读出来! 这种数据存取的方法我们称为索引式文件系统(indexed allocation)。 七、U盘使用的文件系统一般为 FAT 格式。FAT 这种格式的文件系统并没有 inode 存在,所以 FAT 没有办法将这个文件的所有 block 在一开始就读取出来。每个 block 号码都记录在前一个 block 当中, 他的读取方式有点像下面这样: 上图中我们假设文件的数据依序写入1->7->4->15号这四个 block 号码中, 但这个文件系统没有办法一口气就知道四个 block 的号码,他得要一个一个的将 block 读出后,才会知道下一个 block 在何处。 如果同一个文件数据写入的 block 分散的太过厉害时,则我们的磁头将无法在磁盘转一圈就读到所有的数据, 因此磁盘就会多转好几圈才能完整的读取到这个文件的内容! 八、常常会听到所谓的“磁盘重组”吧? 需要磁盘重组的原因就是文件写入的 block 太过于离散了,此时文件读取的性能将会变的很差所致。 这个时候可以通过磁盘重组将同一个文件所属的 blocks 汇整在一起,这样数据的读取会比较容易啊! 想当然尔,FAT 的文件系统需要三不五时的磁盘重组一下 九、由于 Ext2 是索引式文件系统,基本上不太需要常常进行磁盘重组的。但是如果文件系统使用太久, 常常删除/编辑/新增文件时,那么还是可能会造成文件数据太过于离散的问题,此时或许会需要进行重整一下的。
Linux 的 EXT2 文件系统(inode)
一、标准的 Linux 文件系统 Ext2 就是使用这种 inode 为基础的文件系统 二、文件系统一开始就将 inode 与 block 规划好了,除非重新格式化(或者利用 resize2fs 等指令变更文件系统大小),否则 inode 与 block 固定后就不再变动。 三、Ext2文件系统在格式化的时候,被分为多个区块群组(block group)的,每个区块群组都有独立的inode/block/superblock系统。 四、文件系统最前面有一个开机扇区(boot sector),这个开机扇区可以安装开机管理程序, 这是个非常重要的设计,因为如此一来我们就能够将不同的开机管理程序安装到个别的文件系统最前端,而不用覆盖整颗磁盘唯一的 MBR, 这样也才能够制作出多重开机的环境啊! 五、每一个区块群组(block group)的六个主要内容:
- data block(数据区块):用来放置文件内容数据地方,在Ext2文件系统中所支持的block大小有1K,2K及4K。在格式化时block的大小就固定了,且每个block都有编号,以方便inode记录。不过要注意的是,由于block大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件大小并不相同。因为block大小而产生的Ext2文件系统限制如下:
Ext2文件系统的block的其他限制: (1)原则上,block的大小与数量在格式化完就不能够再改变了(除非重新格式化); (2)每个block内最多只能够放置一个文件的数据; (3)承上,如果文件大于block的大小,则一个文件会占用多个block数量; (4)承上,若文件小于block,则该block的剩余容量就不能够再被使用了(磁盘空间会浪费)。 既然大的block可能会产生较严重的磁盘容量浪费,那么我们是否就将block大小订为1K即可? 这也不妥,因为如果block较小的话,那么大型文件将会占用数量更多的block,而inode也要记录更多的block号码,此时将可能导致文件系统不良的读写性能。 - inode table(inode表格):inode记录的文件数据至少有下面这些:
(1)该文件的存取模式(read/write/excute); (2)该文件的拥有者与群组(owner/group); (3)该文件的容量; (4)该文件创建或状态改变的时间(ctime); (5)最近一次的读取时间(atime); (6)最近修改的时间(mtime); (7)定义文件特性的旗标(flag),如 SetUID…; (8)该文件真正内容的指向 (pointer); inode的数量与大小也是在格式化时就已经固定了,除此之外inode的其他特色有: (1)每个inode大小均固定为128Bytes(新的ext4与xfs可设置到256Bytes); (2)每个文件都仅会占用一个inode而已; (3)承上,因此文件系统能够创建的文件数量与inode的数量有关; (4)系统读取文件时需要先找到inode,并分析inode所记录的权限与使用者是否符合,若符合才能够开始实际读取block的内容。
|