1. 认识 EXT2 文件系统
1) 硬盘组成与分割的复习
所谓的磁盘分区指的是告诉操作系统『我这颗磁盘在此分割槽可以存取的区域是由 A 磁柱到 B 磁柱之间的区块』
那么指定分割槽的磁柱范围是记录在哪里?就是第一个扇区的分割表中啦!但是因为分割表仅有64bytes而已, 因此最多只能记录四笔分割槽的记录,这四笔记录我们称为主要(primary) 或延伸 (extended) 分割槽,其中扩展分配槽还可以再分割出逻辑分割槽 (logical) , 而能被格式化的则仅有主要分割与逻辑分割而已。
2)文件系统特性: 索引式文件系统
Linux 的正统文件系统则为Ext2。通常我们可以称呼一个可被挂载的数据为一个文件系统而不是一个分割槽喔!
较新的操作系统的文件数据除了文件实际内容外, 通常含有非常多的属性,例如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。 文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。
每个 inode 与 block 都有编号,至于这三个数据的意义可以简略说明如下:
superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码;
block:实际记录文件的内容,若文件太大时,会占用多个 block
这种数据存取的方法我们称为索引式文件系统(indexed allocation)。
FAT 这种格式的文件系统并没有 inode 存在,所以 FAT 没有办法将这个文件的所有 block 在一开始就读取出来。每个 block 号码都记录在前一个 block 当中。
常常会听到所谓的『碎片整理』吧? 需要碎片整理的原因就是文件写入的 block 太过于离散了,此时文件读取的效能将会变的很差所致。 这个时候可以透过碎片整理将同一个文件所属的 blocks 汇整在一起,这样数据的读取会比较容易啊!
3)Linux 的 EXT2 文件系统(inode): data block, inode table,superblock, dumpe2fs
而且文件系统一开始就将 inode 与 block 规划好了,除非重新格式化(或者利用 resize2fs 等命令变更文件系统大小),否则 inode 与 block 固定后就不再变动。但是如果仔细考虑一下,如果我的文件系统高达数百GB时, 那么将所有的 inode 与block 通通放置在一起将是很不智的决定,因为 inode 与 block 的数量太庞大,不容易管理。
文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装启动管理程序。
data block (数据区块)
用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已。要注意的是,由于 block 大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。
inode table(inode 表格)
inode 要记录的数据非常多,但偏偏又只有 128bytes 而已, 而 inode 记录一个 block 号码要花掉 4byte ,假设我一个文件有 400MB 且每个 block 为4K 时, 那么至少也要十万笔 block 号码的记录呢!inode哪有这么多可记录的信息?为此我们的系统很聪明的将 inode 记录 block 号码的区域定义为12个直接,一个间接, 一个双间接与一个三间接记录区。
Superblock (超级区块)
Superblock 是记录整个filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了。他记录的信息主要有:
block 与 inode 的总量;
未使用与已使用的 inode / block 数量;
block 与 inode 的大小 (block 为 1, 2, 4K,inode 为128 bytes);
filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck) 的时间等文件系统的相关信息;
一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 。
FilesystemDescription (文件系统描述说明)
这个区段可以描述每个block group 的开始与结束的 block 号码,以及说明每个区段 (superblock, bitmap, inodemap, data block) 分别介于哪一个 block 号码之间。
block bitmap (区块对照表)
从 blockbitmap 当中可以知道哪些 block 是空的,因此我们的系统就能够很快速的找到可使用的空间来处置文件啰。
inode bitmap(inode 对照表)
inodebitmap 则是记录使用与未使用的 inode 号码啰!
4)与目录树的关系
目录
如果想要实际观察root 家目录内的文件所占用的 inode 号码时,可以使用ls -i 这个选项来处理:最左边即为编号。
文件
我们在 Linux 下的 ext2 创建一个一般文件时, ext2 会分配一个 inode 与相对于该文件大小的 block 数量给该文件。
目录树读取
inode 本身并不记录文件名,文件名的记录是在目录的 block 当中。因此当我们要读取某个文件时,就务必会经过目录的 inode 与 block ,然后才能够找到那个待读取文件的 inode 号码, 最终才会读到正确的文件的 block 内的数据。
由于目录树是由根目录开始读起,因此系统透过挂载的信息可以找到挂载点的 inode 号码(通常一个filesystem 的最顶层 inode 号码会由 2 号开始喔!),此时就能够得到根目录的 inode 内容,并依据该 inode 读取根目录的 block 内的文件名数据,再一层一层的往下读到正确的档名。
filesystem 大小与磁盘读取效能
文件数据离散的问题。果真如此,那么可以将整个 filesystme 内的数据全部复制出来,将该 filesystem 重新格式化,再将数据给他复制回去即可解决这个问题。因此, partition 的规划并不是越大越好。
5)EXT2/EXT3文件的存取与日志式文件系统的功能
数据的不一致(Inconsistent) 状态
例如你的文件在写入文件系统时,因为不知名原因导致系统中断(例如突然的停电啊、 系统核心发生错误啊~等等的怪事发生时),所以写入的数据仅有 inode table 及 data block 而已, 最后一个同步升级中介数据的步骤并没有做完,此时就会发生 metadata 的内容与实际数据存放区产生不一致 (Inconsistent) 的情况了。
在早期的 Ext2 文件系统中,如果发生这个问题,那么系统在重新启动的时候,就会藉由 Superblock 当中记录的valid bit (是否有挂载) 与 filesystemstate (clean 与否) 等状态来判断是否强制进行数据一致性的检查!若有需要检查时则以 e2fsck 这支程序来进行的。
日志式文件系统(Journaling filesystem)
在我们的filesystem 当中规划出一个区块,该区块专门在记录写入或修订文件时的步骤, 那不就可以简化一致性检查的步骤了?也就是说:
预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息;
实际写入:开始写入文件的权限与数据;开始升级 metadata 的数据;
结束:完成数据与 metadata 的升级后,在日志记录区块当中完成该文件的纪录。
6)Linux 文件系统的运行
Linux 使用的方式是透过一个称为异步处理 (asynchronously) 的方式。所谓的异步处理是这样的:
当系统加载一个文件到内存后,如果该文件没有被更动过,则在内存区段的文件数据会被配置为干净(clean)的。 但如果内存中的文件数据被更改过了(例如你用 nano 去编辑过这个文件),此时该内存中的数据会被配置为脏的 (Dirty)。此时所有的动作都还在内存中运行,并没有写入到磁盘中! 系统会不定时的将内存中配置为『Dirty』的数据写回磁盘,以保持磁盘与内存数据的一致性。
7)挂载点的意义(mount point)
每个filesystem 都有独立的 inode / block / superblock 等信息,这个文件系统要能够链接到目录树才能被我们使用。将文件系统与目录树结合的动作我们称为『挂载』。挂载点一定是目录,该目录为进入该文件系统的入口。
8)其他 Linux 支持的文件系统与 VFS
虽然 Linux 的标准文件系统是 ext2 ,且还有添加了日志功能的 ext3 ,事实上,Linux 还有支持很多文件系统格式的, 尤其是最近这几年推出了好几种速度很快的日志式文件系统,包括 SGI 的 XFS 文件系统, 可以适用更小型文件的 Reiserfs 文件系统,以及 Windows 的 FAT 文件系统等等, 都能够被 Linux 所支持喔!常见的支持文件系统有:
传统文件系统:ext2 / minix / MS-DOS / FAT (用 vfat 模块) / iso9660 (光盘)等等;
日志式文件系统: ext3 / ReiserFS / Windows' NTFS / IBM's JFS / SGI's XFS
网络文件系统: NFS / SMBFS
想要知道你的 Linux 支持的文件系统有哪些,可以察看底下这个目录:
系统目前已加载到内存中支持的文件系统则有:
Linux 的核心又是如何管理这些认识的文件系统呢? 其实,整个 Linux 的系统都是透过一个名为 Virtual Filesystem Switch的核心功能去读取 filesystem 的。
假设你的 / 使用的是 /dev/hda1 ,用 ext3 ,而 /home 使用/dev/hda2 ,用 reiserfs , 那么你取用/home/dmtsai/.bashrc 时,有特别指定要用的什么文件系统的模块来读取吗? 应该是没有吧!这个就是 VFS 的功能啦!透过这个 VFS 的功能来管理所有的 filesystem, 省去我们需要自行配置读取文件系统的定义啊~方便很多!
2. 文件系统的简单操作
1) 磁盘与目录的容量: df, du
df:列出文件系统的整体磁盘使用量
du:评估文件系统的磁盘使用量(常用在推估目录所占容量)
2)实体链接与符号链接: ln
Hard Link (实体链接, 硬式连结或实际连结)
ln <链接文件名><被链接文件名>
想要读取该文件,必须要经过目录记录的文件名来指向到正确的 inode 号码才能读取。有没有可能有多个档名对应到同一个 inode 号码呢?有的!那就是 hard link 的由来。
如果你将任何一个『档名』删除,其实 inode 与 block 都还是存在的!
hard link 应该仅能在单一文件系统中进行的,应该是不能够跨文件系统才对!hard link同时还不能 link 目录。
Symbolic Link (符号链接,亦即是快捷方式)
ln –s <链接文件名><被链接文件名>
Symbolic link 就是在创建一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的档名!当来源档被删除之后,symbolic link 的文件会『开不了』。
而且连结档的重要内容就是他会写上目标文件的『文件名』。
这个 Symbolic Link 与Windows 的快捷方式可以给他划上等号,由 Symbolic link 所创建的文件为一个独立的新的文件,所以会占用掉 inode 与 block 喔!
关于目录的 link 数量
如果创建目录时,他默认的 link 数量会是多少? 让我们来想一想,一个『空目录』里面至少会存在些什么?呵呵!就是存在 . 与 .. 这两个目录啊! 那么,当我们创建一个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是:
/tmp/testing
/tmp/testing/.
/tmp/testing/..
而其中 /tmp/testing 与/tmp/testing/. 其实是一样的!都代表该目录啊~而 /tmp/testing/.. 则代表 /tmp 这个目录,所以说,当我们创建一个新的目录时, 『新的目录的 link 数为 2 ,而上一级目录的 link 数则会添加 1 』。
3. 磁盘的分割、格式化、检验与挂载
1)磁盘分区:fdisk, partprobe
磁盘分区: fdisk
由于每个人的环境都不一样,因此每部主机的磁盘数量也不相同。所以你可以先使用 df 这个命令找出可用磁盘文件名, 然后再用 fdisk 来查阅。在你进入 fdisk 这支程序的工作画面后,如果您的硬盘太大的话(通常指磁柱数量多于 1024 以上),就会出现如上信息。这个信息仅是在告知你,因为某些旧版的软件与操作系统并无法支持大于 1024 磁柱 (cylinter) 后的扇区使用,不过我们新版的 Linux 是没问题啦!底下继续来看看 fdisk 内如何操作相关动作吧!
注:fdisk–l使用的『装置文件名』请不要加上数字,因为 partition 是针对『整个硬盘装置』而不是某个 partition 呢!直接fdisk –l 就好。
删除,新建磁盘分区槽
2)磁盘格式化:mkfs, mke2fs
mkfs
mke2fs
3)磁盘检验:fsck, badblocks
件系统运行时会有硬盘与内存数据异步的状况发生,因此莫名其妙的死机非常可能导致文件系统的错乱。
fsck
使用这个命令的场合都是在系统出现极大的问题,导致你在 Linux 启动的时候得进入单人单机模式下进行维护的行为时,才必须使用此一命令!
此外,由于 fsck 在扫瞄硬盘的时候,可能会造成部分 filesystem 的损坏,所以『运行 fsck 时, 被检查的 partition 务必不可挂载到系统上!亦即是需要在卸除的状态喔!』
Badblocks
badblocks 则是用来检查硬盘或软盘扇区有没有坏轨的命令!
4)磁盘挂载与卸除:mount, umount
挂载点是目录, 而这个目录是进入磁盘分区槽(其实是文件系统啦!)的入口。
单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
单一目录不应该重复挂载多个文件系统;
要作为挂载点的目录,理论上应该都是空目录才是。
mount
umount (将装置文件卸除)
5)磁盘参数修订:mknod, e2label, tune2fs, hdparm
5. 内存置换空间(swap)之建置
Linux安装时一定需要的两个 partition ,一个是根目录,另外一个就是 swap(内存置换空间)。swap 的功能就是在应付物理内存不足的情况下所造成的内存延伸记录的功能。
1)使用实体分割槽建置swap
2)使用文件建置swap
3)swap使用上的限制
目前的主机所含的内存都很大了,所以Linux 系统大概都用不到 swap的。不过, 如果是针对服务器或者是工作站这些常年上线的系统来说的话,swap 还是需要创建的。
由于目前 x86_64(64位) 最大内存寻址到 64GB, 因此, swap 总量最大也是仅能达 64GB 就是了!
6. 文件系统的特殊观察与操作
1)boot sector 与superblock 的关系
将可安装启动信息的 boot sector (启动扇区) 独立出来,并非放置到 superblock 当中的!
其中:
superblock 的大小为1024 bytes;
superblock 前面需要保留 1024 bytes 下来,以让启动管理程序可以安装。
block 为 1024 bytes (1K) 时:
0号block是Boot sector,1号block是SuperBlock。
block 大于 1024 bytes (2K, 4K) 时:
superblock 将会在 0 号block。其中Boot sector占用0-1023,Superblock占用1024-2047。
2)磁盘空间之浪费问题
一个 block 只能放置一个文件, 因此太多小文件将会浪费非常多的磁盘容量。
使用命令ll –s可查看当前目录下的数据,第一行total是该目录下数据消耗的block数。
使用命令du –sb <目录名>和du –sm <目录名> 查询某个目录所耗用的所有容量(bytes、Mbytes) 发现两者数据不同,前者是实际数据容量,后者是block数下的容量。
3)利用 GNU 的 parted 进行分割行为
fdisk 无法支持到高于 2TB 以上的分割槽! 此时就得需要 parted 来处理了。