认识EXT2文件系统
硬盘组成与分区的复习
磁盘组成有:
- 盘片: 记录数据
- 机械手臂与机械手臂上的磁头: 用于读写盘片上的数据
- 主轴马达, 用于转动盘片
- 扇区(Sector)为最小的物理存储单位, 每个扇区为512bytes
- 将扇区组成一个圆, 那就是柱面(Cylinder), 柱面是分区(partition)的最小单位
- 第一个扇区最重要, 里面有硬盘主引导记录(MBR)及分区表, 其中MBR占446bytes, 分区表占64bytes
- 各种接口的磁盘在Linux中的文件名分别为:
- /dev/sd[a-p][1-15]: 为SCSI, SATA, USB, Flash等接口的磁盘文件名
- /dev/hd[a-d][1-63]: 为IDE接口的磁盘文件名
磁盘分区:
- 磁盘分区指告诉操作系统, 这块磁盘在此分区可以访问的区域是由A柱面到B柱面之间的块
- 在分区表中记录指定分区的柱面范围
- 主分区与扩展分区最多可以有4个
- 扩展分区最多只能一个
- 逻辑分区是由扩展分区持续分出来的分区
- 能够被格式化后作为数据访问的分区为主要分区与逻辑分区, 扩展分区无法格式化
- 逻辑分区的数量依操作系统而不同, 在Linux系统中, IDE硬盘最多有59个逻辑分区(5-63号), SATA硬盘则有11个逻辑分区(5-15号)
文件系统特性
- 通常我们称呼一个可被挂载的数据为一个文件系统
- 文件数据包含文件实际内容外, 还包含非常多的属性如文件权限以及文件属性(所有者, 群组, 时间等); 文件系统通常将权限和属性放置到inode中, 实际数据放到data block块中, 另外, 还有一个超级块会记录整个文件系统的整体信息, 包括inode与block的总量, 使用量, 剩余量等
Linux的Ext2文件系统(inode)
- Ext2文件系统在格式化时区分多个块组(block group), 每个块组都有独立的inode/block/superblock系统
- 文件系统最前面有个启动扇区, 可以安装引导装载程序
- data block(数据块): 用来放置文件内容
- 原则上, block大小与数量在格式化完就不能再改变了
- 每个block内最多只能够放置一个文件的数据, 若文件大于block大小, 则一个文件会占用多个block, 小于block大小, 则剩余空间也无法被使用
- inodetable(inode表格): 记录的内容至少有以下这些
- inode只有128k, 记录一个block至少要4K, 容量不够咋办?
- Superblock(超级块)
Superblock是记录整个文件系统相关信息的地方,
- File system Description(文件系统描述说明), 用于描述每个block group的开始与结束的block号码, 以及说明每个区段分别介于哪一个block号码之间
- block bitmap(块对照表), 记录block是空的还是占用的
- inode bitmap(inode对照表), 记录使用与未使用的inode
与目录树的关系
- 目录
- 当在ext2文件系统新建一个目录时, ext2会分配一个inode和至少一块block给该目录, 其中inode记录该目录的相关权限和属性, 并可记录分到的那块block号码, 而block则是记录在这个目录下的文件名与该文件名占用的inode号码数据
- 文件
- 当在ext2新建一个一般文件时, ext2会分配一个inode与相对于该文件大小的block数量给该文件, 例如: 假设一个block为4kb, 而要新建一个100KB的文件, 那么Linux将分配一个inode与25个block来存储该文件, 同时, 由于inode仅有12个直接指向, 因此还要多一个block来作为块号码的记录
- 目录树读取
- 文件名的记录是在目录的block当中, 因此新增/删除/重命名文件与目录的w权限有关
- 目录树是从根目录开始读起
- 文件系统大小与磁盘读取性能
- 硬盘上的数据经常变动会造成文件数据离散, 磁头需要在整个文件系统上来来去去频繁读取, 效率低, 可通过重新格式化文件系统, 再将数据复制回去解决
- 分区规划过大, 也会导致磁头搜寻block时移动幅度大, 耗费更多的时间
Ext2/Ext3文件的访问与日志文件系统的功能
- 新增文件的流程
- 一般我们将inode table与data block称为数据存放区域, 其他例如super block, block bitmap与inode bitmap等区段称为metadata(中间数据), 因为后者经常变动
- 假如在文件写入系统时, 因为不明原因而中断, 可能造成metedata与实际数据存放区不一致, 在早期的Ext2系统中, 在系统重新启动时, 通过Superblock记录的valid bit(是否有挂载)与文件系统的state(clean 与否)等状态来判断是否强制进行数据一致性的检查, 有需要时则以e2fsck程序来进行, 但耗时较长
- Ext3作为Ext2的升级版, 采用日志文件系统(Journaling file system)来解决不一致问题
Linux文件系统的操作
- 数据写入磁盘的速度比内存慢很多, 因此Linux采用异步处理的方式来加速
- 当系统加载一个文件到内存后, 若该文件没有被改动过, 则内存区段的文件数据会被设置为clean的, 但当内存中的文件数据被更改了, 此时该内存中的数据会被设置为dirty, 系统会不定时将内存中dirty的数据写回磁盘
- 系统会将常用的文件数据放置到主存储器的缓冲区, 以加速文件系统的读写
- 可以手动使用sync来强迫内存中dirty的文件回写磁盘
- 正常关机会主动调用sync来回写磁盘, 不正常关机在重新启动后, 可能花很多时间在进行磁盘校验, 甚至导致文件系统的损毁
挂载点的意义
- 每个文件系统都有独立的inode, block, super block等信息, 这个文件系统要能够链接到目录树才能被使用, 将文件系统与目录树结合的操作成为挂载
- 挂载点一定是目录, 该目录为进入该文件系统的入口
其他Linux支持的文件系统与VFS
文件系统的简单操作
磁盘与目录的容量: df, du
- df: 列出文件系统的整体磁盘使用量 ```shell df [-ahikHTm] [目录或文件名]
-a: 列出所有的文件系统 -k: 以KB显示, 默认 -m: 以MB显示 -h: 以较易阅读的GB, MB, KB自行显示 -H: 以M=1000K替代M=1024K的进位方式 -T: 连同该问去的文件系统名称也列出 -i: 不用硬盘容量, 而以inode的数量来显示
示例 root@DESKTOP-LMORNNS:/etc# df -h Filesystem Size Used Avail Use% Mounted on /dev/sdb 251G 2.4G 236G 1% / tmpfs 6.3G 0 6.3G 0% /mnt/wsl tools 237G 125G 112G 53% /init none 6.3G 0 6.3G 0% /dev none 6.3G 8.0K 6.3G 1% /run none 6.3G 0 6.3G 0% /run/lock none 6.3G 0 6.3G 0% /run/shm none 6.3G 0 6.3G 0% /run/user tmpfs 6.3G 0 6.3G 0% /sys/fs/cgroup drivers 237G 125G 112G 53% /usr/lib/wsl/drivers lib 237G 125G 112G 53% /usr/lib/wsl/lib C:\ 237G 125G 112G 53% /mnt/c D:\ 401G 225G 176G 57% /mnt/d E:\ 301G 81G 220G 27% /mnt/e F:\ 232G 23G 209G 10% /mnt/f root@DESKTOP-LMORNNS:/etc# df -h /etc Filesystem Size Used Avail Use% Mounted on /dev/sdb 251G 2.4G 236G 1% /
- du: 评估文件系统的磁盘使用量(常用于评估目录所占容量)
```shell
du [-ahskm] 文件或目录名称
-a: 列出所有文件与目录容量, 因为默认仅统计目录下面的文件量而已
-h: 以易阅读的形式显示
-s: 列出总量而已, 而不列出每个各别的目录占用容量
-S: 不包括子目录
-k: 以KB显示, 默认
-m: 以MB显示
示例
检查该目录下每个目录所占用的总量
du -sh *
连接文件: ln
hard link(硬连接或实际连接)
- 由前文内容可知, 目录block会记录目录下文件的文件名以及文件名对应的inode; 每个文件都会占用一个inode, 文件内容由inode的记录来指向
- 即文件名只与目录有关, 但是文件内容则与inode有关, 那么有没有可能多个文件名对应一个inode号码呢? 那就是hard link的由来, 简单来说, hard link只是在某个目录下新建一条文件名连接到某inode号码的关联记录而已, 也因此这两个文件名的所有相关信息都会一模一样
- 通常hard link设置连接文件时, 磁盘空间与inode数目都不会改变, 除非添加的这条数据刚好将目录的block填满, 就可能需要新增一个block
- hard link的限制: 由上图可见, 不能跨文件系统; 此外还不能连接到目录
symbolic link(符号连接, 即快捷方式)
- 创建一个独立的文件, 而这个文件会让数据的读取指向它连接的那个文件的文件名
- 当源文件被删除后, symbolic link的文件会开不了
制作连接文件 ```shell ln [-sf] 源文件 目标文件
-s: 创建symbolic link, 默认创建hard link -f: 如果目标文件存在, 就主动将目标文件直接删除后再创建
示例: ln -s /bin /root/bin 给/bin目录创建一个/root/bin的快捷方式 rm /root/bin 删除连接文件
- 新建目录时, 新的目录连接数为2, 上层目录的连接数会增加1
- 假设新建/tmp/test, 会有3个东西: temp/test, temp/test/., temp/test/.., 前两个是一样的
---
<a name="FRm0g"></a>
## 磁盘的分区, 格式化, 检验与挂载
在系统新增一块硬盘的操作步骤:
1. 对磁盘进行分区
1. 对该分区进行格式化, 以创建系统可用的文件系统
1. 对新建好的文件系统进行检验
1. 在linux系统上, 需要创建挂载点并进行挂载
<a name="DdMrz"></a>
### 磁盘分区: fdisk
```shell
fdisk [-l] 设备名称
-l: 输出后面接的设备所有的分区内容, 若仅有fdisk -l 时, 则系统将会把整个系统内能找到的设备的分区均列出来
示例:
1. 先用df / 找出磁盘文件名
root@DESKTOP-LMORNNS:/mnt/f# df /
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdb 263174212 2431028 247305028 1% /
2.使用fdisk, 注意设备名称不要接数字
root@DESKTOP-LMORNNS:/mnt/f# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
The old ext4 signature will be removed by a write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x07031e7c.
Command (m for help): m
Help:
DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag
....
磁盘格式化
磁盘检验: fsck, badblocks
磁盘挂载与卸载
挂载点是目录, 这个目录是进入磁盘分区(文件系统)的入口
- 单一文件系统不应该被重复挂载在不同的挂载点(目录)中
- 单一目录不应该重复挂载多个文件系统
- 作为挂载点的目录理论上应该都是空目录, 如果不是空的, 那么挂载了文件系统后, 原目录下的东西会暂时消失
mount命令
- 使用mount挂载
- mount -l, 查看已挂载的文件系统
- unmount卸载
磁盘参数修改
- mknode: linux下的设备通过文件的major(主设备代码), minor(次设备代码)来替代, 某些情况下, 如某些服务被放到特定目录下(chroot)时, 需要手动处理设备文件时, 可以通过这个命令, 更改major和minor
- e2label: 可以设置文件系统卷标(Label), label就相当于win上的C/D盘名称
- tune2fs: 功能很广泛, 可以读super block数据类似 dump2fs -h, 也可以将ext2转为ext3, 也可以修改文件系统的label
- hdparam: 可以设置IDE接口硬盘的一些高级参数
设置开机挂载
linux用命令行挂载重启后会失效
永久挂载:通过修改/etc/fstab实现挂载,添加完后执行mount -a则生效
开机挂载/etc/fstab及/etc/mtab
系统挂载限制:
- 根目录/是必须挂载的, 而且一定要先于其他mount point被挂载起来
- 其他挂载点必须为已新建的目录, 可任意指定, 但一定要遵守必须的系统目录架构原则
- 所有挂载点在同一时间之内, 只能挂载一次
- 所有分区在同一时间之内, 只能挂载一次
如果进行卸载, 需先将工作目录移至挂载点(及其子目录)之外
fstab(file system table) ```shell root@DESKTOP-LMORNNS:~# cat /etc/fstab LABEL=cloudimg-rootfs / ext4 defaults 0 1
该文件内容共6个字段:
- 磁盘设备文件名或该设备的Label
- 挂载点
- 磁盘分区的文件系统
- 文件系统参数, mount命令也有相关参数, 见下表
- 能否被dump备份命令作用, 可以通过fstab指定哪个文件必须要进行dump备份 0表示不备份, 1表示每天备份, 2表示其他不定日期的备份, 通常不是0就是1
- 是否以fsck检验扇区, 开机过程中系统会默认以fsck检验文件系统是否完整,
不过某些系统是不需要检验的, 例如swap或是特殊文件系统如/proc, /sys等
0表示不要检验, 1表示最早检验, 2表示比1晚检验, 一般根目录设置为1,
其余要检验的文件系统设置为2即可
```
特殊设备loop挂载(镜像文件不刻录就挂载使用)
内存交换空间(swap)的构建
swap的主要功能是当物理内存不够时, 将某些在内存当中所占的程序暂时移动到swap当中, 让物理内存可以被需要的程序来使用
使用物理分区构建swap
使用文件构建swap
swap使用上的限制
- 在内核2.4.10版本以后, 单一swap已经没有2GB的限制了
- 但是, 最多还是仅能创建32个swap
- 由于目前x84_64(64位)的最大内存寻址到64GB, 因此, swap总量最大也是仅能达62GB