1. 磁盘的基础知识
磁盘盘上的物理组成
扇区(Sector)为最小的物理储存单位,每个扇区为 512 bytes;
将扇区组成一个圆,那就是磁柱(Cylinder),磁柱是分割槽(partition)的最小单位;
第一个扇区最重要,里面有:(1)主要开机区(Master boot record, MBR)及分割表(partition table), 其中 MBR 占有 446 bytes,而 partition table 则占有 64 bytes。
各种接口的磁盘在Linux中的文件名分别为:
/dev/sd[a-p][1-15]:为SCSI, SATA, USB, Flash随身碟等接口的磁盘文件名;
/dev/hd[a-d][1-63]:为 IDE 接口的磁盘文件名;
2. 文件系统基础知识
传统的磁盘与文件系统的应用中,一个分割槽就是只能够被格式化成为一个文件系统,所以我们可以说一个 filesystem 就是一个 partition。有些新技术可以将一个分割槽格式化为多个文件系统(例如LVM),也能够将多个分割槽合成一个文件系统(LVM, RAID)! 所以说,目前我们在格式化时已经不再说成针对 partition 来格式化了, 通常我们可以称呼一个可被挂载的数据为一个文件系统而不是一个分割槽。
档案数据除了档案实际内容外, 通常还有非常多的属性,文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 不 block 的总量、使用量、剩余量等。
ext2文件系统示意图
inode 结构示意图
-b :列出保留为坏轨的部分(一般用不到)
-h :仅列出 superblock 的数据,不会列出其他的区段内容
3. 目录树
Linux 下的 ext2 文件系统建立一个目录时, ext2 会分配一个 inode 与至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 号码; 而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。ls -i可以看到目录中文件的inode号码。
在 Linux 下的 ext2 建立一个一般档案时, ext2 会分配一个 inode 与相对于该档案大小的 block 数量给该档案。inode 本身并不记彔文件名,文件名的记录是在目录的 block 当中。因此当我们要读取某个档案时,就务必会经过目录的 inode 与 block ,然后才能够找到那个待读取档案的 inode 号码, 最终才会读到正确的档案的 block 内的数据。
目录树是由根目录开始读起,因此系统透过挂载的信息可以找到挂载点的 inode 号码(通常一个 filesystem 的最顶层 inode 号码会由 2 号开始),此时就能够得到根目录的 inode 内容,并依据该 inode 读取根目录的 block 内的文件名数据,再一层一层的往下读到正确的档名。
ext3日志式文件系统 (Journaling filesystem):为了避免文件系统不一致的情况发生
1. 预备:当系统要写入一个档案时,会先在日志记录区块中记录某个档案准备要写入的信息;
2. 实际写入:开始写入档案的权限与数据;开始更新 metadata 的数据;
3. 结束:完成数据与 metadata的更新后,在日志记录区块当中完成该档案的记录。
4. 挂载点
每个 filesystem 都有独立的 inode / block / superblock 等信息,这个文件系统要能够链接到目录树才能被我们使用。 将文件系统与目录树结合的动作我们称为『挂载』。重点是:挂载点一定是目录,该目录为进入该文件系统的入口。 因此并不是你有任何文件系统都能使用,必项要『挂载』到目录树的某个目录后,才能够使用该文件系统。
VFS 文件系统的示意图
5. 磁盘与目录的容量
df:列出文件系统的整体磁盘使用量
df [-ahikHTm] [目录或文件名]
-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-k :以 KBytes 的容量显示各文件系统;
-m :以 MBytes 的容量显示各文件系统;
-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-H :以 M=1000K 取代 M=1024K 的进位方式;
-T :连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
-i :不用硬盘容量,而以 inode 的数量来显示
du [-ahskm] 档案或目录名称
-a :列出所有的档案与目录容量,因为默认仅统计目录底下的档案量而已。
-h :以人们较易读的容量格式 (G/M) 显示;
-s :列出总量而已,而不列出每个各别的目录占用容量;
-S :不包括子目录下的总计,与 -s 有点差别。
-k :以 KBytes 列出容量显示;
-m :以 MBytes 列出容量显示;
6. 实体链接与符号链接
hard link 只是在某个目录下新增一笔档名链接到某 inode 号码的关连记录,两个档名对应同一个inode号码,如果你将任何一个『档名』删除,其实 inode 不 block 都还是存在的! 此时你可以透过另一个『档名』来读取到正确的档案数据。使用 hard link 设定链接文件时,磁盘的空间与 inode 的数目都不会改变。hard link不能跨文件系统,不能连接目录。
Symbolic Link就是在建立一个独立的档案,而这个档案会让数据的读取指向他 link 的那个档案的档名!由于只是利用档案来做为指向的动作, 所以,当来源档被删除之后,symbolic link 档案会打不开。由 Symbolic link 所建立的档案为一个独立的新档案,所以会占用掉 inode 与 block。
ln [-sf] 来源文件 目标文件
-s :如果不加任何参数就进行连结,那就是hard link,至于 -s 就是symbolic link
-f :如果 目标文件 存在时,就主动的将目标文件直接移除后再建立
7. 磁盘的分割、格式化、检验与挂载
a. 磁盘分区: fdisk
fdisk [-l] 装置名称
-l :输出后面接的装置所有的 partition 内容。若仅有 fdisk -l 时, 则系统将会把整个系统内能够搜寻到的装置的 partition 均列出来。
在实作过程中请特别注意,因为 SATA 硬盘最多能够支持到 15 号的分割槽, IDE 则可以支持到 63 号。
b. 磁盘格式化:make filesystem, mkfs
mkfs [-t 文件系统格式] 装置文件名
-t :可以接文件系统格式,例如 ext3, ext2, vfat 等(系统有支持才会生效)
mke2fs [-b block大小] [-i block大小] [-L 标头] [-cj] 装置
-b :可以设定每个 block 的大小,目前支持 1024, 2048, 4096 bytes 三种;
-i :多少容量给予一个 inode 呢
-c :检查磁盘错误,仅下达一次 -c 时,会进行快速读取测试; 如果下达两次 -c -c 的话,会测试读写(read-write),会很慢
-L :后面可以接标头名称 (Label),这个 label 是有用的
-j :本来 mke2fs 是 EXT2 ,加上 -j 后,会主动加入 journal 而成为 EXT3。
c. 磁盘检验: fsck, badblocks
fsck [-t 文件系统] [-ACay] 装置名称
-t :指定文件系统, 不过由于现今的 Linux 会自动的透过 superblock 去分辨文件系统, 因此通常可以不需要这个选顷
-A :依据 /etc/fstab 的内容,将需要的装置扫描一次。
-a :自动修复检查到的有问题的扇区,所以你不用一直按 y
-y :与 -a 类似,但是某些 filesystem 仅支持 -y 这个参数!
-C :可以在检验的过程当中,使用一个直方图来显示目前的进度
badblocks -[svw] 装置名称
-s :在屏幕上列出进度
-v :可以在屏幕上看到进度
-w :使用写入的方式来测试,建议不要使用此参数,尤其是待检查的装置已有档案时
d. 磁盘挂载与卸除
mount -a :依照配置文件 /etc/fstab 的数据将所有未挂载的磁盘都挂载上来
mount [-l] :单纯的输入 mount 会显示目前挂载的信息。加上 -l 可增列 Label 名称
mount [-t 文件系统] [-L Label名] [-o 额外选项] [-n] 装置文件名 挂载点
-t :与mkfs 的选项非常类似的,可以加上文件系统种类来指定欲挂载的类型。
-n :在默认的情况下,系统会将实际挂载的情况实时写入 /etc/mtab 中,以利其他程序的运作。但在某些情况下(例如单人维护模式)为了避免问题,会刻意不写入
-L :系统除了利用装置文件名 (例如 /dev/hdc6)之外,还可以利用文件系统的标头名称 (Label)来进行挂载。
-o :后面可以接一些挂载时额外加上的参数!
ro, rw: 挂载文件系统成为只读(ro) 或可擦写(rw)
async, sync: 此文件系统是否使用同步写入 (sync) 或异步 (async) 的 内存机制。
auto, noauto: 允许此 partition 被以 mount -a 自劢挂载(auto)
dev, nodev: 是否允许此 partition 上,可建立装置档案?
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: 重新挂载,这在系统出错,或重新更新参数时,很有用!
umount [-fn] 装置文件名或挂载点
-f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
-n :不更新 /etc/mtab 情况下卸除。
e. 磁盘参数修订
修改label
e2label 装置名称 新的Label名称
工具
tune2fs [-jlL] 装置代号
-l :将 superblock 内的数据读出来
-j :将 ext2 的 filesystem 转换为 ext3 的文件系统;
-L :类似 e2label 的功能,可以修改 filesystem 的 Label
f. 设定开机挂载
直接到 /etc/fstab 里面去修修就行啰
根目录 / 是必项挂载的﹐而且一定要先于其它 mount point 被挂载进来。
其它 mount point 必项为已建立的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则
所有 mount point 在同一时间内﹐只能挂载一次。
所有 partition 在同一时间内﹐只能挂载一次。
如若进行卸除﹐您必项先将工作目录移到 mount point(及其子目彔) 之外。
g. 特殊装置 loop 挂载 (映象档不刻录就挂载使用)
mount -o loop 映像文件名
h. 内存置换空间(swap)之建置
1. 分割:先使用 fdisk 在你的磁盘中分割中一个分割槽给系统作为 swap 。由于 Linux 的 fdisk 预设会将分割槽的 ID 设定为 Linux 的文件系统,所以你可能还得要设定一下 system ID 就是了。
2. 格式化:利用建立 swap 格式的『mkswap 装置文件名』就能够格式化该分割槽成为 swap 格式啰
3. 使用:最后将该 swap 装置启动,方法为:『swapon 装置文件名』。
4. 观察:最终透过 free 这个指令来观察一下内存的用量吧!