一、索引式文件系统
文件系统通常会将这两部分的数据分别存放在不同的区块,权限和属性放置到 inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 和block 的总量、使用量、剩余量等。
- superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式不相关信息等;
- inode:记录档案的属性,一个档案占用一个inode,同时记录此档案的数据所在的 block 号码;
- block:实际记彔档案的内容,若档案太大时,会占用多个 block 。
由于每个 inode 和 block 都有编号,而每个档案都会占用一个 inode ,inode 内则有档案数据放置的 block 号码。 因此,我们可以知道的是,如果能够找到档案的inode 的话,那举自然就会知道这个档案所放置数据的block 号码, 当然也就能够读出该档案的实际数据了。这是个比较有效率的作法,因为如此一来我们的磁盘就能够在短时间内读取出全部的数据, 读写的效能比较好。Ext2 是索引式文件系统
EXT2文件系统示意图
在整体的规划当中,文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装开机管理程序, 这是个非常重要的设计,因为如此一来我们就能够将不同的开机管理程序安装到个别的文件系统最前端,而不用覆盖整颗硬盘唯一的 MBR, 这样也才能够制作出多重引导的环境!
- data block (资料区块)
data block 是用来放置档案内容数据地方,在 Ext2 文件系统中所支持的block 大小有 1K, 2K 及 4K 三种而已。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode 的记录。 不过要注意的是,由于 block 大小的差异,会寻致该文件系统能够支持的最大磁盘容量于最大单一档案容量并不相同。 因为 block 大小而产生的Ext2 文件系统限制如下:
Block大小 | 1K | 2K | 4K |
最大单一档案限制 | 16G | 256G | 2TB |
最大单一文件限制 | 2TB | 8TB | 16TB |
- inode table (inode 表格)
inode 的内容在记录档案的属性以及该档案实际数据是放置在哪几号 block 内! 基本上,inode 记录的档案数据至少有底下这些:
该档案的存取模式(read/write/excute);
该档案的拥有者和群组(owner/group);
该档案的容量;
该档案建立或状态改变的时间(ctime);
最近一次的读取时间(atime);
最近修改的时间(mtime);
定义档案特性的旗标(flag),如 SetUID...;
该档案真正内容的指向 (pointer);
inode 的数量不大小也是在格式化时就已经固定了
每个 inode 大小均固定为 128 bytes;
每个档案都仅会占用一个 inode 而已;
因此文件系统能够建立的档案数量和 inode 的数量有关;
系统读取档案时需要先找到 inode,并分析 inode 所记录的权限和用户是否符合,若符合才能够开始实际读取block 的内容。
- 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 。
一般来说, superblock 的大小为 1024bytes
- Filesystem Description (文件系统描述说明)
这个区段可以描述每个 block group 的开始和结束的block 号码,以及说明每个区段 (superblock, bitmap, inodemap, data block) 分别介于哪一个 block 号码之间。这部分也能够用 dumpe2fs 来观察的。
- block bitmap (区块对照表)
这就得要透过 block bitmap 的辅助,从 block bitmap 当中可以知道哪些 block 是空的,因此我们的系统就能够很快速的找到可使用的空间来处置档案。
- inode bitmap (inode 对照表)
这个其实和block bitmap 是类似的功能,只是 block bitmap 记录的是使用和未使用的 block 号码, 至于inode bitmap 则是记录使用和未使用的 inode 号码!
二、磁盘和目录的容量
1. df:列出文件系统的整体磁盘使用量;
-h :以人们较易阅读的GBytes, MBytes, KBytes 等格式自行显示;
-i :不用硬盘容量,而以 inode 的数量来显示
2. du:评估文件系统的磁盘使用量(常用在推算目录所占容量)
选项与参数:
-a :列出所有的档案和目录容量,因为默认仅统计目录底下的档案量而已。
-h :以人们较易读的容量格式 (G/M) 显示;
-s :列出总量而已,而不列出每个各别的目彔占用容量;
-S :不包括子目录下的总计,和-s 有点差别。
-k :以 KBytes 列出容量显示;
-m :以 MBytes 列出容量显示;
三、实体链接和符号链接: ln
Hard Link (实体链接, 硬式连结或实际连结)
- 每个档案都会占用一个 inode ,档案内容由 inode 的纪录来指向;
- 想要读取该档案,必项要经过目录记录的文件名来指向到正确的 inode 号码才能读取。
其实文件名只和目录有关,但是档案内容则和 inode 有关。hard link 叧是在某个目录下新增一笔档名链接到某 inode 号码的关连记录而已。hard link 只是在某个目录下的 block 多写入一个关连数据而已,既不会增加 inode 也不会耗用 block 数量。
所以hard link 应该仅能在单一文件系统中进行的,不能 link 目录。
Symbolic Link (符号链接,亦即是快捷方式)
由 1 号 inode 读取到连结档的内容仅有档名,根据档名链接到正确的目录去取得目标档案的 inode , 最终就能够读取到正确的数据了。你可以发现的是,如果目标档案(/etc/crontab)被删除了,那么整个环节就会无法继续进行下去, 所以就会发生无法透过连结档读取的问题了!
ln的使用
ln [-sf] 来源文件 目标文件
选项和参数:
-s :如果不加任何参数就进行连结,那就是hard link,至于 -s 就是symbolic link
-f :如果目标文件存在时,就主动的将目标文件直接移除后再建立!
四、磁盘的管理
fdisk [-l] 装置名称
选项与参数:
-l :输出后面接的装置所有的 partition 内容。若仅有 fdisk -l 时, 则系统将会把整个系统内能够搜索到的装置的 partition 均列出来。
fsck 是用来检验文件系统是否出错。
五、磁盘挂载与卸除
单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
单一目录不应该重复挂载多个文件系统;
要作为挂载点的目彔,理论上应该都是空目目录。如果你要用来挂载的目彔里面并不是空的,那么挂载了文件系统之后,原目录下的东西就会暂时的消失
mount [-t 文件系统] [-L Label名] [-o 额外选顷] \ [-n] 装置文件名 挂载点
选项与参数:
-a :依照配置文件 /etc/fstab 的数据将所有未挂载的磁盘都挂载上来
-l :单纯的输入 mount 会显示目前挂载的信息。加上 -l 可增列 Label 名称!
-t :和mkfs 癿选项非常类似的,可以加上文件系统种类来指定欲挂载的类型。 常见癿 Linux 支持类型有:ext2, ext3, vfat, reiserfs, iso9660(光盘格式), nfs, cifs, smbfs(此三种为网络文件系统类型)
-n :在默认的情况下,系统会将实际挂载的情况实时写入 /etc/mtab 中,以利其他程序的运作。但在某些情况下(例如单人维护模式)为了避开问题,会刻意不写入。 此时就得要使用这个 -n 的选项了。
-L :系统除了利用装置文件名 (例如 /dev/hdc6) 之外,还可以利用文件系统癿标头名称 (Label)来进行挂载。最好为你的文件系统取一个独一无二的名称
-o :后面可以接一些挂载时额外加上的参数!比方说账号、密码、读写权限等:
ro, rw: 挂载文件系统成为叧读(ro) 或可擦写(rw)
async, sync: 此文件系统是否使用同步写入 (sync) 或异步 (async) 的 内存机制,请参考文件系统运作方式。预设为 async。
auto, noauto: 允许此 partition 被以 mount -a 自动挂载(auto)
dev, nodev: 是否允许此 partition 上,可建立装置档案? dev 为可允许
suid, nosuid: 是否允许此 partition 只有 suid/sgid 的文件格式?
exec, noexec: 是否允许此 partition 上拥有可执行 binary 档案?
user, nouser: 是否允许此 partition 让任何使用者执行 mount ?一般来说, mount 仅有 root 可以执行,但下达 user 参数,则可让 一般 user 也能够对此 partition 进行 mount 。
defaults: 默认值为:rw, suid, dev, exec, auto, nouser, and async
remount: 重新挂载,这在系统出错,或重新更新参数时,很有用!
挂载时以下文件会作为系统的参考,自动与文件匹配看是否能够挂载
- /etc/filesystems:系统指定的测试挂载文件系统类型;
- /proc/filesystems:Linux系统已经加载的文件系统类型。
- /lib/modules/$(uname -r)/kernel/fs/ :Linux 支持的文件系统驱动程序
umount [-fn] 装置文件名卸挂载点
选项和参数:
-f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
-n :不更新 /etc/mtab 情况下卸除。
六、开机挂载 /etc/fstab 及 /etc/mtab
系统挂载的一些限制:
根目彔录/ 是必项挂载的﹐而且一定要先于其它 mount point 被挂载进来。
其它 mount point 必须为已建立的目彔﹐可任意指定﹐但一定要遵守必项的系统目彔架构原则
所有 mount point 在同一时间之内﹐叧能挂载一次。
所有 partition 在同一时间之内﹐叧能挂载一次。
如若进行卸除﹐您必项先将工作目录移到 mount point(及其子目录) 之外。
/etc/fstab中每个字段的意义
- 第一栏:磁盘装置文件名或该装置的 Label
- 第二栏:挂载点 (mount point)
- 第三栏:磁盘分区槽的文件系统
- 第四栏:文件系统参数
参数 | 内容意义 |
async/sync 异步/同步 |
设定磁盘是否以异步方式运作!预设为 async(效果较佳) |
auto/noauto自动/非自动 | 当下达 mount -a 时,此文件系统是否会被主动测试挂载。预设为auto |
rw/ro 可擦写/只读 | 让该分割槽以可擦写或者是只读的型态挂载上来,如果你想要分享的数据是不给用户随意变更的, 这里也能够设定为只读。则不论在此文件系统的档案是否设定 w 权限,都无法写入! |
exec/noexec 可执行/不可执行 | 限制在此文件系统内是否可以进行『执行』的工作?如果是纯粹用来储存资料的, 那么可以设定为 noexec 会比较安全,相对的,会比较麻烦! |
user/nouser 允许/不允许使用者挂载 | 是否允讲用户使用 mount 指令来挂载呢?一般而言,我们当然不希望一般身份的 user 能使用 mount 啰,因为太不安全了,因此这里应该要设定为 nouser 啰! |
suid/nosuid 具有/不具有 suid 权限 | 该文件系统是否允讲 SUID 的存在?如果不是执行文件放置目彔,也可以设定为 nosuid 来取消这个功能! |
usrquota | 注意名称是『 usrquota 』不要拼错了!这个是在启动 filesystem 支持磁盘配额模式。 |
grpquota | 注意名称是『grpquota』,启动 filesystem 对群组磁盘配额模式的支持。 |
defaults | 同时具有 rw, suid, dev, exec, auto, nouser, async 等参数。 基本上,预设情况使用 defaults 设定即可! |
- 第五栏:能否被 dump 备份指令作用
dump 是一个用来做为备份的指令,我们可以透过 fstab 指定哪个文件系统必项要进行dump 备份! 0 代表不要做 dump 备份, 1 代表要每天进行 dump 的动作。 2 也代表其他不定日期的 dump 备份动作, 通常这个数值不是 0 就是 1。
- 是否以 fsck 检验扇区:
开机的过程中,系统默认会以 fsck 检验我们的 filesystem 是否完整 (clean)。 不过,某些 filesystem 是不需要检验的,例如内存置换空间 (swap) ,或者是特殊文件系统例如 /proc 和/sys 等等。0 是不要检验, 1 表示最早检验(一般只有根目录会设定为 1), 2 也是要检验,不过 1 会比较早被检验! 一般来说,根目录设定为 1 ,其他的要检验的 filesystem 都设定为 2 就好了。
/etc/fstab 是开机时的配置文件,不过,实际 filesystem 的挂载是记彔录到 /etc/mtab 和 /proc/mounts 这两个档案当中的。每次我们在更新filesystem 的挂载时,也会同时更新这两个档案!但是,万一发生在 /etc/fstab 输入的数据错误,寻致无法顺利开机成功,而进入单人维护模式当中,那时候的 / 可是 read only 癿状态,当然您就无法修改 /etc/fstab ,也无法更新 /etc/mtab 那怎么办? 没关系,可以利用底下这一招:
[root@www ~]# mount -n -o remount,rw /
七、特殊装置 loop 挂载
- 挂载光盘/DVD映象文件
root@www ~]# mount -o loop /root/centos5.2_x86_64.iso /mnt/centos_dvd
- 建立大档案以制作 loop 装置档案!
用dd指令进行大型档案的制作,制作完成之后需格式化。
root@www ~]# dd if=/dev/zero of=/home/loopdev bs=1M count=512
512+0 records in <==读入 512 笔资料
512+0 records out <==输出
512 笔数据 536870912 bytes (537 MB) copied, 12.3484 seconds, 43.5 MB/s
# 这个指令的简单意义如下:
# if 是 input file ,输入档案。那个 /dev/zero 是会一直输出 0 的装置!
# of 是 output file ,将一堆零写入到后面接的档案中。
# bs 是每个 block 大小,就像文件系统那样的block 意意义;
# count 则是总共几个 bs 的意思。
dd 就好像在叠砖块一样,将 512 块,每块 1MB 的砖块堆栈成为一个大档案 (/home/loopdev) ! 最终就会出现一个 512MB 的档案。
八、内存置换空间(swap)
使用实体分割槽建置swap
1. 分割:先使用 fdisk 在你的磁盘中分割中一个分割槽给系统作为 swap 。由于Linux 的 fdisk 预设会将分割槽的 ID 设定为 Linux 的文件系统,所以你可能还得要设定一下 system ID 就是了。
2. 格式化:利用建立 swap 格式的『mkswap 装置文件名』就能够格式化该分割槽成为 swap 格式
3. 使用:最后将该 swap 装置启动,方法为:『swapon 装置文件名』。
4. 观察:最终透过 free 这个指令来观察一下内存的用量吧!
- 可以用多余的磁盘槽来增加swap,方法和下面一样
- 使用文件做成swap
1. 使用 dd 这个指令来新增一个512MB 的档案在 /tmp 底下:
2. 使用 mkswap 将 /tmp/swap 这个文件格式化为 swap 的文件格式:
3. 使用 swapon 来将 /tmp/swap 启动
4. 使用 swapoff 关掉 swap file
九、压缩(gzip,bzip2,tar)
- gzip
[root@www ~]# gzip [-cdtv#] 档名
[root@www ~]# zcat 档名.gz
选项与参数:
-c :将压缩的数据输出到屏幕上,可透过数据流重导向来处理;
-d :解压缩的参数;
-t :可以用来检验一个压缩文件的一致性~看看档案有无错误;
-v :可以显示出原档案/压缩文件案的压缩比等信息;
-# :压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!预设是 -6
- bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的
[root@www ~]# bzip2 [-cdkzv#] 档名
[root@www ~]# bzcat 檔名.bz2
选项与参数:
-c :将压缩的过程产生的数据输出到屏幕上!
-d :解压缩的参数
-k :保留源文件,而不会删除原始的档案!
-z :压缩的参数
-v :可以显示出原档案/压缩文件案的压缩比等信息;
-# :与gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最差!
- tar打包指令,并没有压缩的功能,需加上参数才能实现打包压缩
[root@www ~]# tar [-j|-z] [cv] [-f 建立癿檔名] filename... <==打包不压缩
[root@www ~]# tar [-j|-z] [tv] [-f 建立癿檔名] <==察看檔名
[root@www ~]# tar [-j|-z] [xv] [-f 建立癿檔名] [-C 目录] <==解压缩
选项与参数:
-c :建立打包档案,可搭配 -v 来察看过程中被打包的档名(filename)
-t :察看打包档案的内容含有哪些档名,重点在察看『档名』;
-x :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开 特别留意的是, -c, -t, -x 不可同时出现在一串指令列中。
-j :透过 bzip2 的支持进行压缩/解压缩:此时档名最好为 *.tar.bz2
-z :透过 gzip 的支持迚行压缩/解压缩:此时档名最好为 *.tar.gz
-v :在压缩/解压缩的过程中,将正在处理的文件名显示出来!
-f filename:-f 后面要立刻接要被处理的档名!建议 -f 单独写一个选项!
-C 目录 :这个选顷用在解压缩,若要在特定目录解压缩,可以使用这个选顷。 其他后续练习会使用到的
选项介绍:
-p :保留备份数据的原本权限和属性,常用于备份(-c)重要的配置文件
-P :保留绝对路径,亦即先讲备份数据中含有根目录存在之意;
--exclude=FILE:在压缩的过程中,不要将 FILE 打包!
压 缩:tar -jcv -f filename.tar.bz2 要被压缩的档案或目录名称
查 询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
1. 将 /etc 整个目录一边打包一边在 /tmp 解开
[root@www ~]# cd /tmp
[root@www ~]# tar -cvf - /etc | tar -xvf -
- dump压缩备份,restore复原dump
root@www ~]# dump -W
选项和参数:
-S :仅列出后面的待备份数据需要多少磁盘空间才能够备份完毕;
-u :将这次 dump 的时间记录到 /etc/dumpdates 档案中;
-v :将 dump 的档案过程显示出来;
-j :加入 bzip2 的支持!将数据进行压缩,默认 bzip2 压缩等级为 2
-level:就是我们谈到的等级,从 -0 ~ -9 共十个等级;
-f :有点类似 tar !后面接产生的档案,亦可接例如 /dev/st0 装置文件名等
-W :列出在 /etc/fstab 里面的具有 dump 设定的 partition 是否有备份过
# 让我们将 /etc 整个目录透过 dump 迚行备份,且含压缩功能
[root@www ~]# dump -0j -f /root/etc.dump.bz2 /etc
root@www ~]# restore -t [-f dumpfile] [-h] <==用来察看 dump 档
[root@www ~]# restore -C [-f dumpfile] [-D 挂载点] <==比较dump和实际档案
[root@www ~]# restore -i [-f dumpfile] <==进入互动模式
[root@www ~]# restore -r [-f dumpfile] <==还原整个文件系统
选项与参数:
相关的各种模式,各种模式无法混用喔!例如不可以写 -tC !
-t :此模式用在察看 dump 起来的备份文件中含有什么重要数据!类似 tar -t 功能;
-C :此模式可以将 dump 内的数据拿出来跟实际的文件系统做比较, 最终会列出『在 dump 档案内有记录的,且目前文件系统不 一样』的档案;
-i :进入互动模式,可以仅还原部分档案,用在 dump 目录时的还原!
-r :将整个 filesystem 还原的一种模式,用在还原针对文件系统的dump 备份;
其他较常用到的选项功能:
-h :察看完整备份数据中的inode 和文件系统 label 等信息
-f :后面就接你要处理的那个 dump 档案!
-D :和 -C 进行搭配,可以查出后面接的挂载点和 dump 内有不同的档案!