目录

Linux 磁盘与文件系统

要点摘抄,全文摘抄自《鸟叔的 Linux 私房菜》,对小部分词语进行转换,对部分内容进行批注,方便以后查阅

Linux 磁盘与文件系统

  • 一个可以被挂载的数据通常称为 “ 文件系统 , filesystem” 而不是分区 ( partition )
  • 基本上 Linux 的传统文件系统为 Ext2 ,该文件系统内的信息主要有:
    • superblock :记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
    • inode :记录文件的属性,一个文件占用一个 inode ,同时记录此文件的数据所在的 block 号码;
    • block :实际记录文件的内容,若文件太大时,会占用多个 block 。
  • Ext2 文件系统的数据存取为索引式文件系统indexed allocation )每个文件由一个 inode 和多个 block 组成,与之对应的是 FAT,FAT 这种格式的文件系统并没有 inode 存在,所以 FAT 没有办法将这个文件的所有 block 在一开始就读取出来。每个 block 号码都记录在前一个 block 当中,是一种链表的结构,磁盘重组也主要是针对的这种文件系统
  • 需要磁盘重组的原因就是文件写入的 block 太过于离散了,我们的磁头将无法在磁盘转一圈就读到所有的数据,因此磁盘就会多转好几圈才能完整的读取到这个文件的内容此时文件读取的性能将会变的很差所致。 这个时候可以通过磁盘重组将同一个文件所属的 blocks 汇整在一起。
  • Ext2 文件系统主要有: boot sector, superblock, inode bitmap, block bitmap, inode table,data block 等六大部分。
  • data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已
  • inode 记录文件的属性 / 权限等数据,其他重要项目为: 每个 inode 大小均为固定,有 128/256Bytes 两种基本容量。每个文件都仅会占用 一个 inode 而已; 因此文件系统能够创建的文件数量与 inode 的数量有关; https://s1.ax1x.com/2020/06/20/NMhIY9.png

    inode 要记录的数据非常多,但偏偏又只有 128Bytes 而已, 而 inode 记录一个 block 号码要花掉 4Byte ,假设我一个文件有 400MB 且每个 block 为 4K 时, 那么至少也要十万笔 block 号码的记录 inode 哪有这么多可记录的信息?为此我们的系统很聪明的将 inode 记录 block 号码的区域定义为 12 个直接,一个间接 , 一个双间接与一个三间接记录区。(双间接,三间接其实就是多级指针,inode 指向 block,block 又指向另一个 block)

  • 文件的 block 在记录文件的实际数据,目录的 block 则在记录该目录下面文件名与其 inode 号码的对照表;
  • 日志式文件系统 ( journal ) 会多出一块记录区,随时记载文件系统的主要活动,可加快系统复原时间;(ext2 之后的 ext3,4 支持)
    1. 预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息;
    2. 实际写入:开始写入文件的权限与数据;开始更新 metadata 的数据;
    3. 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该文件的纪录。

    这种方式在很多的应用软件中也有类似的体现,比如mysqlredo logredisaof

  • Linux 文件系统为增加性能,会让内存作为大量的磁盘高速缓存;(这里看了原文也不是很懂,这里意思应该是让内存作为磁盘的缓存,也就是数据不直接写入磁盘,先写入内存,再同步到磁盘)
    • 系统会将常用的文件数据放置到内存的缓冲区,以加速文件系统的读 / 写;
    • 承上,因此 Linux 的实体内存最后都会被用光!这是正常的情况!可加速系统性能;
    • 你可以手动使用 sync 来强迫内存中设置为 Dirty 的文件回写到磁盘中;
    • 若正常关机时,关机指令会主动调用 sync 来将内存的数据回写入磁盘内;
    • 但若不正常关机(如跳电、死机或其他不明原因),由于数据尚未回写到磁盘内, 因此重新开机后可能会花很多时间在进行磁盘检验,甚至可能导致文件系统的损毁(非磁盘损毁)。
  • 实体链接只是多了一个文件名对该 inode 号码的链接而已 (ln) https://upload.cc/i1/2020/06/21/xuFwlq.png
  • 符号链接就类似 Windows 的捷径功能。(ln -s) https://upload.cc/i1/2020/06/21/qmB46s.png
  • 磁盘的使用必需要经过:分区、格式化与挂载,分别惯用的指令为: gdisk, mkfs, mount 三个指令
  • 分区时,应使用 parted 检查分区表格式,再判断使用 fdisk/gdisk 来分区,或直接使用 parted 分区
  • 为了考虑性能, XFS 文件系统格式化时,可以考虑加上 agcount/su/sw/extsize 等参数较佳
  • 如果磁盘已无未分区的容量,可以考虑使用大型文件取代磁盘设备的处理方式,通过 dd 与格式化功能。
  • 挂载点的意义:每个 filesystem 都有独立的 inode / block / superblock 等信息,这个文件系统要能够链接到目录树才能被我们使用。 将文件系统与目录树结合的动作我们称为 “ 挂载 ” 。 重点是:挂载点一定是目录,该目录为进入该文件系统的入口。因此并不是你有任何文件系统都能使用,必须要 “ 挂载 ” 到目录树的某个目录后,才能够使用该文件系统的。
    • 单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
    • 单一目录不应该重复挂载多个文件系统;
    • 要作为挂载点的目录,理论上应该都是空目录才是。
    • 挂载了文件系统之后,原目录下的东西就会暂时的消失
  • 开机自动挂载可参考 /etc/fstab 之设置,设置完毕务必使用 mount -a 测试语法正确否;