认识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的总量, 使用量, 剩余量等

image.png

Linux的Ext2文件系统(inode)

  • Ext2文件系统在格式化时区分多个块组(block group), 每个块组都有独立的inode/block/superblock系统
  • 文件系统最前面有个启动扇区, 可以安装引导装载程序

image.png

  • data block(数据块): 用来放置文件内容
    • image.png
    • 原则上, block大小与数量在格式化完就不能再改变了
    • 每个block内最多只能够放置一个文件的数据, 若文件大于block大小, 则一个文件会占用多个block, 小于block大小, 则剩余空间也无法被使用
  • inodetable(inode表格): 记录的内容至少有以下这些

image.png

  • inode只有128k, 记录一个block至少要4K, 容量不够咋办?
  • image.png
  • image.png
    • Superblock(超级块)

Superblock是记录整个文件系统相关信息的地方,
image.png

  • File system Description(文件系统描述说明), 用于描述每个block group的开始与结束的block号码, 以及说明每个区段分别介于哪一个block号码之间
  • block bitmap(块对照表), 记录block是空的还是占用的
  • inode bitmap(inode对照表), 记录使用与未使用的inode

image.png
image.png

与目录树的关系

  • 目录
    • 当在ext2文件系统新建一个目录时, ext2会分配一个inode和至少一块block给该目录, 其中inode记录该目录的相关权限和属性, 并可记录分到的那块block号码, 而block则是记录在这个目录下的文件名与该文件名占用的inode号码数据
    • image.png
  • 文件
    • 当在ext2新建一个一般文件时, ext2会分配一个inode与相对于该文件大小的block数量给该文件, 例如: 假设一个block为4kb, 而要新建一个100KB的文件, 那么Linux将分配一个inode与25个block来存储该文件, 同时, 由于inode仅有12个直接指向, 因此还要多一个block来作为块号码的记录
  • 目录树读取
    • 文件名的记录是在目录的block当中, 因此新增/删除/重命名文件与目录的w权限有关
    • 目录树是从根目录开始读起
    • image.png
  • 文件系统大小与磁盘读取性能
    • 硬盘上的数据经常变动会造成文件数据离散, 磁头需要在整个文件系统上来来去去频繁读取, 效率低, 可通过重新格式化文件系统, 再将数据复制回去解决
    • 分区规划过大, 也会导致磁头搜寻block时移动幅度大, 耗费更多的时间

Ext2/Ext3文件的访问与日志文件系统的功能

  • 新增文件的流程

image.png

  • 一般我们将inode table与data block称为数据存放区域, 其他例如super block, block bitmap与inode bitmap等区段称为metadata(中间数据), 因为后者经常变动
  • 假如在文件写入系统时, 因为不明原因而中断, 可能造成metedata与实际数据存放区不一致, 在早期的Ext2系统中, 在系统重新启动时, 通过Superblock记录的valid bit(是否有挂载)与文件系统的state(clean 与否)等状态来判断是否强制进行数据一致性的检查, 有需要时则以e2fsck程序来进行, 但耗时较长
  • Ext3作为Ext2的升级版, 采用日志文件系统(Journaling file system)来解决不一致问题
  • image.png

Linux文件系统的操作

  • 数据写入磁盘的速度比内存慢很多, 因此Linux采用异步处理的方式来加速
  • 当系统加载一个文件到内存后, 若该文件没有被改动过, 则内存区段的文件数据会被设置为clean的, 但当内存中的文件数据被更改了, 此时该内存中的数据会被设置为dirty, 系统会不定时将内存中dirty的数据写回磁盘
  • 系统会将常用的文件数据放置到主存储器的缓冲区, 以加速文件系统的读写
  • 可以手动使用sync来强迫内存中dirty的文件回写磁盘
  • 正常关机会主动调用sync来回写磁盘, 不正常关机在重新启动后, 可能花很多时间在进行磁盘校验, 甚至导致文件系统的损毁

挂载点的意义

  • 每个文件系统都有独立的inode, block, super block等信息, 这个文件系统要能够链接到目录树才能被使用, 将文件系统与目录树结合的操作成为挂载
  • 挂载点一定是目录, 该目录为进入该文件系统的入口

其他Linux支持的文件系统与VFS

image.png


文件系统的简单操作

磁盘与目录的容量: 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% /

  1. - du: 评估文件系统的磁盘使用量(常用于评估目录所占容量)
  2. ```shell
  3. du [-ahskm] 文件或目录名称
  4. -a: 列出所有文件与目录容量, 因为默认仅统计目录下面的文件量而已
  5. -h: 以易阅读的形式显示
  6. -s: 列出总量而已, 而不列出每个各别的目录占用容量
  7. -S: 不包括子目录
  8. -k: 以KB显示, 默认
  9. -m: 以MB显示
  10. 示例
  11. 检查该目录下每个目录所占用的总量
  12. du -sh *

连接文件: ln

  • hard link(硬连接或实际连接)

    • 由前文内容可知, 目录block会记录目录下文件的文件名以及文件名对应的inode; 每个文件都会占用一个inode, 文件内容由inode的记录来指向
    • 即文件名只与目录有关, 但是文件内容则与inode有关, 那么有没有可能多个文件名对应一个inode号码呢? 那就是hard link的由来, 简单来说, hard link只是在某个目录下新建一条文件名连接到某inode号码的关联记录而已, 也因此这两个文件名的所有相关信息都会一模一样
    • image.png
    • 通常hard link设置连接文件时, 磁盘空间与inode数目都不会改变, 除非添加的这条数据刚好将目录的block填满, 就可能需要新增一个block
    • hard link的限制: 由上图可见, 不能跨文件系统; 此外还不能连接到目录
  • symbolic link(符号连接, 即快捷方式)

    • 创建一个独立的文件, 而这个文件会让数据的读取指向它连接的那个文件的文件名
    • 当源文件被删除后, symbolic link的文件会开不了
    • image.png
  • 制作连接文件 ```shell ln [-sf] 源文件 目标文件

-s: 创建symbolic link, 默认创建hard link -f: 如果目标文件存在, 就主动将目标文件直接删除后再创建

示例: ln -s /bin /root/bin 给/bin目录创建一个/root/bin的快捷方式 rm /root/bin 删除连接文件

  1. - 新建目录时, 新的目录连接数为2, 上层目录的连接数会增加1
  2. - 假设新建/tmp/test, 会有3个东西: temp/test, temp/test/., temp/test/.., 前两个是一样的
  3. ---
  4. <a name="FRm0g"></a>
  5. ## 磁盘的分区, 格式化, 检验与挂载
  6. 在系统新增一块硬盘的操作步骤:
  7. 1. 对磁盘进行分区
  8. 1. 对该分区进行格式化, 以创建系统可用的文件系统
  9. 1. 对新建好的文件系统进行检验
  10. 1. linux系统上, 需要创建挂载点并进行挂载
  11. <a name="DdMrz"></a>
  12. ### 磁盘分区: fdisk
  13. ```shell
  14. fdisk [-l] 设备名称
  15. -l: 输出后面接的设备所有的分区内容, 若仅有fdisk -l 时, 则系统将会把整个系统内能找到的设备的分区均列出来
  16. 示例:
  17. 1. 先用df / 找出磁盘文件名
  18. root@DESKTOP-LMORNNS:/mnt/f# df /
  19. Filesystem 1K-blocks Used Available Use% Mounted on
  20. /dev/sdb 263174212 2431028 247305028 1% /
  21. 2.使用fdisk, 注意设备名称不要接数字
  22. root@DESKTOP-LMORNNS:/mnt/f# fdisk /dev/sdb
  23. Welcome to fdisk (util-linux 2.34).
  24. Changes will remain in memory only, until you decide to write them.
  25. Be careful before using the write command.
  26. The old ext4 signature will be removed by a write command.
  27. Device does not contain a recognized partition table.
  28. Created a new DOS disklabel with disk identifier 0x07031e7c.
  29. Command (m for help): m
  30. Help:
  31. DOS (MBR)
  32. a toggle a bootable flag
  33. b edit nested BSD disklabel
  34. c toggle the dos compatibility flag
  35. ....

image.png

磁盘格式化

image.png

磁盘检验: fsck, badblocks

image.png

磁盘挂载与卸载

  • 挂载点是目录, 这个目录是进入磁盘分区(文件系统)的入口

    • 单一文件系统不应该被重复挂载在不同的挂载点(目录)中
    • 单一目录不应该重复挂载多个文件系统
    • 作为挂载点的目录理论上应该都是空目录, 如果不是空的, 那么挂载了文件系统后, 原目录下的东西会暂时消失
  • mount命令

image.png

  • 使用mount挂载

image.png

  • mount -l, 查看已挂载的文件系统

image.png

  • unmount卸载

image.png

磁盘参数修改

  • 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个字段:

  1. 磁盘设备文件名或该设备的Label
  2. 挂载点
  3. 磁盘分区的文件系统
  4. 文件系统参数, mount命令也有相关参数, 见下表
  5. 能否被dump备份命令作用, 可以通过fstab指定哪个文件必须要进行dump备份 0表示不备份, 1表示每天备份, 2表示其他不定日期的备份, 通常不是0就是1
  6. 是否以fsck检验扇区, 开机过程中系统会默认以fsck检验文件系统是否完整, 不过某些系统是不需要检验的, 例如swap或是特殊文件系统如/proc, /sys等 0表示不要检验, 1表示最早检验, 2表示比1晚检验, 一般根目录设置为1, 其余要检验的文件系统设置为2即可 ``` image.png
    image.png

特殊设备loop挂载(镜像文件不刻录就挂载使用)

image.png


内存交换空间(swap)的构建

swap的主要功能是当物理内存不够时, 将某些在内存当中所占的程序暂时移动到swap当中, 让物理内存可以被需要的程序来使用

使用物理分区构建swap

image.png

使用文件构建swap

image.png

swap使用上的限制

  • 在内核2.4.10版本以后, 单一swap已经没有2GB的限制了
  • 但是, 最多还是仅能创建32个swap
  • 由于目前x84_64(64位)的最大内存寻址到64GB, 因此, swap总量最大也是仅能达62GB

重点回顾

image.png