第八章 linux磁盘与文件系统管理
(上)记录了文件系统中的superblock, inode, block,data block, inode table,filesystem description, block bitmap, inode bitmap,查询这些信息的命令,挂载点的概念,VFS的简单定义等。
扇区(sector)为最小的物理存储单位,每隔扇区为512bytes
将扇区组成一个圆,就是磁柱(cylinder),磁柱是分隔槽partition的最小单位
第一扇区最重要,里面有
主开机区
(
MBR,Master boot record,446bytes
)及分割表(partition table,64bytes)
磁盘分区意即指定分隔槽的起始与结束磁柱。
磁盘分区完毕后还要进行格式化(format),之后操作系统才能够使用这个分隔槽,这时因为每种操作系统所设定的文件属性/权限并不相同,为了存放这些档案所需的数据,因此就需要将分隔槽进行格式化,以成为操作系统能够利用的文件系统格式。
称一个可被挂载的数据为一个文件系统而不是传统的一个分隔槽(因为LVM,RAID的出现)
superblock:记录此filesystem的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等;
inode:记录档案的属性,一个档案占用一个inode,同时记录此档案的数据所在的block号码;
block:实际记录档案的内容,若档案太大,会占用多个block。
每个inode与block都有编号
ext2文件系统中,inode记录了所有block的号码,因此可以一口气将四个block的内容都读出来,这种数据存取的方法称为索引式文件系统(indexed allocation)。
闪存用的是FAT各式的文件系统,他没有inode存在,因此它没有办法将这个档案的所有block一次性读取出来。每个block号码都记录在前一个block中,因此需要一个一个的将block读出来后才会知道下一个block在何处。
如果档案的block太过于离散了,此时档案的读取效能将会变的很差,因此需要碎片整理。它将同一个档案所属的blocks汇整在一起。
由于ext2是索引式文件系统,基本不太需要常常进行碎片整理。
文件系统一开始就将inode与block规划好了,除非重新格式化或利用resize2fs等指令变更文件系统大小,否则inode与block固定后就不再变动。
ext2文件系统在格式化的时候基本上是区分多个区块群组(block group)的,每隔区块群组都有独立的inode/block/速配而block系统。
文件系统最前面有一个启动扇区(boot sector),可以安装开机管理程序,就不用覆盖整个硬盘唯一的MBR,多重引导的环境。
data block(资料区块)
ext2中所支持的block大小有1K,2K及4K。格式化的时候,block的大小和数量就已经固定了,想要改变大小就只能重新格式化,且每个block都有编号。
block的大小会影响该文件系统的最大磁盘容量与最大单一档案容量的改变。虽然ext2已经能够支持大于2GB以上的单一档案容量,不过某些应用程序依然使用旧的限制。
每个block内最多只能放置一个档案的数据
block定的太大,会造成磁盘容量浪费;定的太小,对大型档案将会占用很多歌block,则inode就要记录很多的block号码,导致文件系统不良的读写性能。
inode table(inode表格)
inode记录的档案数据至少有以下几点:
- 该档案的存取模式(read/write/excute)
- 该档案的拥有者与群组(owner/group)
- 该档案的容量
- 该档案建立或状态改变的时间(ctime,status time)
- 最近一次的读取时间(atime,access time)
- 最近修改的时间(mtime,modification time)
- 定义档案特性的旗标(flag),如SetUID...;
- 该档案真正内容的指向(pointer)
- 每个inode大小均固定为128bytes
- 每个档案都仅会占用一个inode而已,因此,文件系统能够建立的档案数量与inode的数量有关
- 系统读取档案时需先找到inode,并分析inode所记录的权限与用户是否相符,若相符才能够开始实际读取block内容
总额:将直接、间接、二级间接、三级间接想加,得16GB。即当block格式化为1K大小时,能够容纳的最大档案为16GB。但是这个方法不能用在2K及4K block大小的记录中,因为大于2K的block会受到ext2文件系统本身的限制,所以计算的结果会不太符合。
superblock(超级区块)
没有superblock就没有filesystem,它记录的信息主要有:
- block与inode的总量
- 未使用与已使用的inode/block数量
- block与inode的大小(block为1,2,4K,inode为128bytes)
- filesystem的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息;
- 一个valid bit数值,若此文件系统已被挂载,则valid bit值为0,否则为1.
superblock大小一般为1024bytes,每隔block group都可能含有superblock.
Filesystem Description(文件系统描述说明)(不在superblock里面,以下三个分别在block group中的superblock的后面,这三个之后是Inode表)
这个区段可以描述block group的开始于结束的block号码,以及说明每隔区段(superblock,bitmap,inodemap,data block)分别介于哪一个block号码之间
block bitmap(区块对照表)
新建文档时,它可以知道哪些block是空的;当删除档案时,会有block号码释放出来,此时在block bitmap中相对应的该block号码的标志就修改成未使用中。
inode bitmap(inode对照表)
与block bitmap相似,记录使用与未使用的inode号码
利用dumpe2fs命令可以查看以上这些信息(superblock,block等信息)
dumpe2fs [-bh] 装置文件名
-b:列出保留位坏轨的部分(一般用不到)
-h:仅列出superblock的数据,不会列出其他区段的内容
装置文件名怎么来呢?
利用命令df查看挂载的文件系统的信息,找到挂载的位置(filesystem项),即为装置文件名
dumpe2fs列出的信息主要包括:superblock内容(其中有可用的block和inode数量)和每个block group信息;如下图:
与目录的关系
ext2给目录分配一个inode和至少一块block,inode记录该目录的相关权限与属性,并可记录分配到的block号码,而
block则记录在这个目录下的文件名与该文件名占用的inode号码数据。
利用ls -i命令(或ls -il)可以观察目录内档案所占有的inode号码
inode本身并不记录文件名,文件名记录在目录的block中,所以新增/删除/更名文件名就与目录的w权限有关了
由于目录树是由根目录开始读起的,因此系统透过挂载的信息可以找到挂载点的inode号码。通常一个filesystem最顶层的inode号码会由2号开始。
当partition规划太大,那么随着文件系统的使用,一个档案的数据可能就会越来越分散,那么会造成硬盘的机械手臂移动幅度过大,存取的效率就很低了
ext2/ext3档案的存取与日志式文件系统的功能--利用block bitmap, inode bitmap
新增一个档案,文件系统的操作:
- 确定用户对新增档案的目录具有x,w权限,有才能新增;
- 根据inode bitmap找到未使用的inode号码,并将新档案的权限/属性写入;
- 根据block bitmap找到未使用中的block号码,并将实际数据写入block,更新inode中的block执行数据;
- 更新inode bitmap和block bitmap及superblock的内容
inode table,data block称为数据存放区域;其他的比如superblock,block bitmap, inodebitmap等经常变动的为metadata(中介资料)
在filesystem中规划出一个区块,专门记录写入或修订档案时的步骤,即日志(ext3)。
基本功能是在发生故障时,可以快速恢复filesystem。
在上面的dumpe2fs输出的信息也含有日志的信息(inode 8)
从ext2变到ext3不需要重新格式化
linux的物理内容最后都会被用光,这时正常情况,可加速系统效能
挂载点
每个filesystem都有独立的inode/block/superblock等信息,要能够链接到目录树才能被使用。将文件系统与目录树结合的动作称为挂载
前面说根目录的.和..都是/,这是因为它们对应的inode号是一样的
ls -l /lib/modules/$(uname -r)/kernel/fs 查看该linux支持的文件系统,在这个目录里面
cat /proc/filesystems 查看系统目前已加载到内存中支持的文件系统,记录在这个文件里面
Linux VFS (Virtual Filesystem Switch)
整个linux的系统都是透过一个名为Virtual Filesystem Switch的核心功能去读取filesystem的。也就是说,整个linux认识的filesystem其实都是VFS在进行管理。省去我们需要自行设定读取文件系统的定义(在读取某个文档时,不需要指定用的是什么文件系统的模块)