文件数据:
superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码;block:实际记录文件的内容,若文件太大时,会占用多个 block 。
索引式文件系统:
FAT 这种格式的文件系统并没有 inode 存在,每个 block 号码都记录在前一个 block 当中
ext2文件系统示意图:
Data Block (数据区块)
在 Ext2文件系统中所支持的 block大小有 1K, 2K及 4K。
Ext2 文件系统的 block 的基本限制如下:
- 原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
- 每个 block 内最多只能够放置一个文件的数据;
- 承上,如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
- 承上,若文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)。
Inode Table(inode表格)
inode 的数量与大小也是在格式化时就已经固定了, inode 特色:- 每个 inode 大小均固定为 128 bytes;
- 每个文件都仅会占用一个 inode 而已;
- 承上,因此文件系统能够创建的文件数量与 inode 的数量有关;
- 系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取 block 的内容。
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 。
每个 block group 都可能含有 superblock !但是我们也说一个文件系统应该仅有一个 superblock 而已,那是怎么回事啊? 事实上除了第一个 block group 内会含有 superblock 之外,后续的 block group 不一定含有 superblock , 而若含有 superblock 则该 superblock 主要是做为第一个 block group 内 superblock 的备份,这样可以进行 superblock 的救援!
block bitmap (区块对照表)
如果你想要新增文件时总会用到 block 吧!那你要使用哪个 block 来记录呢?当然是选择『空的 block 』来记录新文件的数据。 那你怎么知道哪个 block 是空的?这就得要透过 block bitmap 的辅助了。从 block bitmap 当中可以知道哪些 block 是空的,因此我们的系统就能够很快速的找到可使用的空间来处置文件。
同样的,如果你删除某些文件时,那么那些文件原本占用的 block 号码就得要释放出来, 此时在 block bitmap 当中相对应到该 block 号码的标志就得要修改成为『未使用中』啰!这就是 bitmap 的功能。
inode bitmap (inode 对照表)
这个其实与 block bitmap 是类似的功能,只是 block bitmap 记录的是使用与未使用的 block 号码, 至于 inode bitmap 则是记录使用与未使用的 inode 号码!
dumpe2fs[-bh] 装置文件名 e.g.dumpe2fs /dev/hdc2
df 查看目前挂载的设备
每个文件(不管是一般文件还是目录文件)都会占用一个 inode , 且可依据文件内容的大小来分配多个 block 给该文件使用。
当我们在 Linux 下的 ext2 文件系统创建一个目录时, ext2 会分配一个 inode 与至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 号码; 而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。
inode 本身并不记录文件名,文件名的记录是在目录的 block 当中。 因此在第六章文件与目录的权限说明中, 我们才会提到『新增/删除/更名文件名与目录的 w 权限有关』的特色!那么因为文件名是记录在目录的 block 当中, 因此当我们要读取某个文件时,就务必会经过目录的 inode 与 block ,然后才能够找到那个待读取文件的 inode 号码, 最终才会读到正确的文件的 block 内的数据。
由于目录树是由根目录开始读起,因此系统通过挂载的信息可以找到挂载点的 inode 号码(通常一个 filesystem 的最顶层 inode 号码会由 2 号开始!),此时就能够得到根目录的 inode 内容,并依据该 inode 读取根目录的 block 内的文件名数据,再一层一层的往下读到正确的文件名。
新建一个文件或目录时, Ext2 处理方法:
这个时候就得要 block bitmap 及 inode bitmap 的帮忙了!假设我们想要新增一个文件,此时文件系统的行为是:
- 先确定用户对于欲新增文件的目录是否具有 w 与 x 的权限,若有的话才能新增;
- 根据 inode bitmap 找到没有使用的 inode 号码,并将新文件的权限/属性写入;
- 根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且升级 inode 的 block 指向数据;
- 将刚刚写入的 inode 与 block 数据同步升级 inode bitmap 与 block bitmap,并升级 superblock 的内容。
同一个 filesystem 的某个 inode 只会对应到一个文件内容而已(因为一个文件占用一个 inode 之故), 因此我们可以透过判断 inode 号码来确认不同文件名是否为相同的文件
df:列出文件系统的整体磁盘使用量;
df [-ahikHTm] [目录或文件名]
-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-i :不用硬盘容量,而以 inode 的数量来显示
du:评估文件系统的磁盘使用量(常用在估计目录所占容量)
du [-ahskm] 文件或目录名称
-s :列出总量而已,而不列出每个各别的目录占用容量;
-k :以 KBytes 列出容量显示;
-m :以 MBytes 列出容量显示;
hard link 限制的:
- 不能跨 Filesystem;
- 不能 link 目录。
选项与参数:
-s :如果不加任何参数就进行连结,那就是hard link,至于 -s 就是symbolic link
fdisk [-l] 装置名称
选项与参数:
-l :输出后面接的装置所有的 partition 内容。若仅有 fdisk -l 时,则系统将会把整个系统内能够搜寻到的装置的 partition 均列出来。
fdisk 只有 root 才能运行,此外,请注意, 使用的『设备文件名』请不要加上数字,因为 partition 是针对『整个硬盘设备』而不是某个 partition 。
磁盘格式化
mkfs [-t 文件系统格式] 装置文件名
mke2fs [-b block大小] [-i block大小] [-L 标头] [-cj] 装置
选项与参数:
-b :可以配置每个 block 的大小,目前支持 1024, 2048, 4096 bytes 三种;
-i :多少容量给予一个 inode 呢?
-c :检查磁盘错误,仅下达一次 -c 时,会进行快速读取测试; 如果下达两次 -c -c 的话,会测试读写(read-write),会很慢~
-L :后面可以接标头名称 (Label),这个 label 是有用的喔!e2label命令介绍会谈到~
-j :本来 mke2fs 是 EXT2 ,加上 -j 后,会主动加入 journal 而成为 EXT3。
如果没有特殊需求的话,使用『 mkfs -t ext3....』不但容易记忆,而且就非常好用。
磁盘检验: fsck, badblocks
fsck [-t 文件系统] [-ACay] 装置名称
选项与参数:
-t :如同 mkfs 一样,fsck 也是个综合软件而已!因此我们同样需要指定文件系统。不过由于现今的 Linux 太聪明了,他会自动的透过 superblock 去分辨文件系统, 因此通常可以不需要这个选项!
-A :依据 /etc/fstab 的内容,将需要的装置扫瞄一次。。
-a :自动修复检查到的有问题的扇区,所以你不用一直按 y !
-y :与 -a 类似,但是某些 filesystem 仅支持 -y 这个参数!
-C :可以在检验的过程当中,使用一个直方图来显示目前的进度!
EXT2/EXT3 的额外选项功能:(e2fsck 这支命令所提供)
-f :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入细部检查的,如果您想要强制 fsck 进入细部检查,就得加上 -f 旗标!
-D :针对文件系统下的目录进行优化配置。
mount [-t 文件系统] [-L Label名] [-o 额外选项][-n] 装置文件名 挂载点
mount 设备文件名 挂载点
dd这个命令来新增一个大文件
e.g.添加一个128MB 的文件 dd if=/dev/zero of=/tmp/swap bs=1M count=128