鸟哥的linux私房菜——第8章 Linux磁盘与文件管理系统
一、EXT2文件系统
1. 硬盘组成和分区复习
- 扇区是最小的物理存储单元
- 第一个扇区最重要,包含硬盘主引导记录MBR和分区表 //64 bytes的分区表仅能记录共四条主分区或扩展分区
- 柱面是分区的最小单元
- /dev/sd[a-p][1-15]:SCSI,SATA,USB,Flash等接口的的磁盘文件名
- /dev/hd[a-d][1-63]:IDE接口的磁盘文件名
- 磁盘分区:指定分区的起始与结束柱面
- 主分区和扩展分区最多只有四个,其中扩展分区最多只有一个
- 扩展分区可以进一步再分为逻辑分区,能被格式化的仅有主分区和逻辑分区 //扩展分区无法被格式化
2. 文件系统特性
(1)分区后需要被格式化,才能被操作系统使用 //不同操作系统的文件系统并不相同
(2)文件系统中的常用数据
- super block超级块:记录文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码
- block:实际记录文件的数据内容,若文件太大时,会占用多个block
(3)文件系统分类
- 索引式文件系统,如EXT2(一次性获取所有block索引)
- FAT文件系统,如U盘(依次逐个block索引) //当block过于分散时,需要进行“碎片整理”
3. Ext2文件系统 //文件系统一开始就将inode与block规划好了(除非重新格式化),Ext2一般划分多个块组(block group)
注:启动扇区可以安装引导装载程序,制作多重引导
(1)数据块(data block) //存放具体的文件内容
- block的大小和数量在格式化完就不能再改变了
- 每个block内最多只能够放置一个文件的数据 //当文件大于block的大小,一个文件会占用多个block;当文件小于block大小时,该block内剩余空间不能被其他文件使用(造成磁盘空间浪费)
(2)inode表格 //inode的内容主要记录文件的属性和文件实际数据的block位置,每个inode大小固定为128bytes
- 该文件的访问模式(rwx)
- 该文件的所有者与组(owner、group)
- 该文件的大小
- 该文件创建或状态改变的时间(ctime)
- 最近一次的读取时间(atime)
- 最近修改的时间(mtime)
- 定义文件特性的标志(flag),如SetUID等
- 该文件真正内容的指向(pointer) //block
(3)Superblock 超级块 //记录整个文件系统相关信息
- block与inode的总量
- 未使用与已使用的inode/block数量
- block与inode的大小
- 文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息
- 一个validbit数值,文件系统已挂载为0,否则为1
注:文件系统仅在第一个block group中有一个superblock,后续block group中的superblock作为备份救援用
(4)文件系统描述
- 描述每一个块组block group的开始与结束的block号码
- 描述每个区段(super block, bitmap, inodemape, data block)分别位于哪些block号码之间
(5)块对照表(bitmap):记录block的使用情况(使用和未使用),在使用过程中对“空/未使用”的block进行分配
(6)inode对照表(inodemap):记录inode的使用情况
(7)文件系统查询命令
- dumpe2fs:输出文件系统每个区段的信息 //用法:dumpe2fs [-bh] 设备文件名
- df:列出目前挂载的设备
(8)与目录树的关系
目录:对于每个目录,ext2会分配一个inode与至少一块block
- inode记录目录的相关权限与属性,并记录分配的block号码 //可使用 ls -i 查看文件占用的inode号码
- block记录目录下的文件名和inode对照表,当一个block无法容纳对照表时,会分配多个block
文件:对于每个文件,ext2会分配一个inode和相对于文件大小的block数量,注意inode的间接记录区也需要分配block
注:inode本身并不记录文件名,文件名与inode的对照表记录在目录的block中 //文件名只与目录有关,文件内容则与inode有关
目录树读取:由于文件名记录在目录的block中,所以访问文件需要先经过目录的inode和block,才能访问到文件
(9)数据区段分类
- inode table、data block:数据存放区域
- super block、block bitmap、inode bitmap:中间数据(metadata) //经常变动
(10)日志文件系统:当遇到突发停电等不明原因导致的系统中断,可能会产生meta data与实际数据不一致的情况,可以通过查找日志记录进行一致性检查,进行系统的快速修复
常用的日志记录步骤包括
- 预备
- 实际写入
- 结束
注:Linux使用异步处理的方式进行文件修改,即先写入内存,再写回磁盘,提高写入效率
(11)挂载点:挂载点一定是目录,该目录为进入相应文件系统的入口 //文件系统最顶层的目录的inode一般为2号
(12)查看文件系统
- Linux支持的文件系统:ls -l /lib/modules/$(uname -r)/kernel/fs
- 已加载的文件系统:cat /proc/filesystems
(13)虚拟文件系统VFS:管理所有的文件系统,避免用户自行设置如何读取不同的文件系统 // /proc为加载的系统数据,挂载在内存中
二、文件系统的简单操作
1. 磁盘与目录的容量
(1)df:列出文件系统的整体磁盘用量
(2)du:评估文件系统的磁盘用量(常用于目录)
2. 连接文件:ln命令
(1)hard link:硬连接或实际连接,在某个目录的block下新建一条“新文件名到已分配的某inode号码”的关联记录,仅产生新文件名,不产生新文件,无需分配新的文件inode
优势:删除任何一个文件名后,仍能访问到文件的inode和block内容,仅会改变文件连接数
缺点:不能连接到目录;不能跨文件系统
(2)symbolic link:符号连接,即快捷方式,创建一个独立的文件,该文件将数据的读取指向它连接的文件的文件名(指向作用),需要分配文件inode和block
缺点:源文件名删除后,该连接将无法打开
注:针对目录的连接数量,新建目录时,默认的连接数为2(如/tmp和/tmp/.),上层目录连接数增加1(如/tmp/..)
三、磁盘的分区、格式化、检验与挂载
1. 磁盘分区:fdisk [-l] 设备名称 //可以先用 df 查询挂载的磁盘文件名
注:当需要重启以读取新的分区表时,可以使用 partprobe 命令强制让内核重新读取新的分区表
2. 磁盘格式化:mkfs [-t 文件系统格式] 设备文件名 //make file system
3. 磁盘检验:fsck [-t 文件系统] [-ACayt] 设备名称 //file system check
注:执行fsck时,被检查的分区不可挂载到系统上,务必处于卸载的状态
4. 磁盘挂载与卸载
注意事项
- 单一文件系统不应该被重复挂载在不同的挂载点(目录)中
- 单一目录不应该重复挂载多个文件系统
- 作为挂载点的目录理论上应该为空目录 //若不是空目录,则挂载文件系统后,原目录下的东西会被暂时隐藏直至分区被卸载
磁盘挂载:mount 设备文件名 挂载点 //常用,更多参考man mount
- mount -o remount,rw,auto / 将根目录 / 重新挂载,并加入参数rw与auto
- umount [-fn] 设备文件名或挂载点 卸载设备文件
四、设置开机挂载
1. /etc/fstab:配置文件,包含开机自动挂载的所有的挂载参数,file system table
系统挂载的限制
- 根目录/必须第一个挂载
- 所有挂载点在同一时间之内,只能挂载一次
- 所有分区在同一时间之内,只能挂载一次 //利用 df 查看是否已挂载
- 卸载前,工作目录必须位于挂载点之外
注:实际文件系统的挂载时记录到/etc/mtab和/proc/mounts文件中的
2. 特殊设备loop挂载(镜像文件不刻录就挂载使用)
mount -o loop 镜像文件 挂载点目录
五、内存交换空间swap的构建 //swap:应付物理内存不足
1. 分区:fdisk + 修改system ID:82 —— Linux swap + partprobe
2. 格式化: mkswap 设备文件名
3. 使用:swapon 设备文件名
4. 查看:free命令查看内存使用情况