认识Linux文件系统

磁盘组成与分区的复习

  • 早期的磁盘分区以柱面为最小单位。现在的磁盘分区以扇面为最小单位。
  • 磁盘分区表主要有两种格式,一种是限制较多的MBR分区表,一种是较新且限制较少的GBT分区表。
  • MBR分区表中,第一个扇区最重要,里面有:主引导记录(MBR)及分区表,其中MBR占有446B,分区表占有64B。
  • /dev/sd/[a-p][1-128]:为物理磁盘的文件名。
  • /dev/vd[a-p][1-128]:为虚拟磁盘的文件名。

    文件系统的特性

  • 通常我们称一个可被挂载的数据为为一个文件系统,而不是一个分区。

  • 文件系统通常会将文件权限、属性与文件数据分别存放在不同的区块,权限与属性放置到inode中,至于实际数据则放置在数据区块中。
  • 超级区块:记录此文件系统的整体信息,包括inode与数据区块的总量、使用量、剩余量,以及文件系统的格式与相关信息等。
  • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的数据区块。
  • 数据区块:实际记录文件的内容,若文件太大时,会占用多个区块。

    Linux的ext2文件系统(inode)

    文件系统一开始就将数据区块和inode规划好,除非重新格式化,否则inode与数据区块就不再变动,但是当文件系统高达数百G的时候,将所有的inode和数据区块放在一块很不明智,因此ext2文件系统格式化的时候基本上时区分为多个区块群组,每个区块群组有自己的inode,数据区块,超级区块系统。在整体的规划中,所有区块群组的最前面有一个启动扇区。这个启动扇区可以安装启动引导程序,这样,我们就可以将不同的启动引导程序安装在别的文件系统的最前端,而不用覆盖整个磁盘唯一的MBR,这样就可以制作出多重引导环境。每个群组的六个主要内容如下:

  • 数据区块:用来放置文件数据,在ext2文件系统有1k,2k,4k区分,针对不同的用途,可以划分不同的区块大小。

  • inode table(inode表)
    • 记录了该文件的读写执行属性。
    • 该文件的拥有者和用户组。
    • 该文件的大小。
    • 该文件的建立时间或状态改变时间,atime,mtime,ctime,定义文件特性的标识例如SUID。
    • 该文件真正内容的指向。
    • 每个inode大小都为128B,每个文件只会占用一个inode。
    • 因此,文件系统能够建立的新文件的数量和inode的数量有关。
    • 系统读取文件的时候,需要先找到inode,并分析inode所记录的权限和用户是否符合,若符合才能够读取文件的内容。
  • Superblock(超级区块):
    • 数据区块和inode的总量。
    • 未使用和已使用的inode与数据区快的数量。
    • 数据区块与inode的大小。
    • 文件系统的挂载时间、最近一次写入数据的时间、最近一次校验磁盘的时间等文件系统相关的信息。
    • 一个有效数值位,若此文件系统已经被挂载则为0,若未被挂载则为1。
  • Filesystem Description(文件系统描述说明)
    这个区段可以描述每个区块群组的开始与结束的区块,以及说明每个区段(超级区块,对照表,inode对照表,数据区块)分别介于哪一个区块之间。这部分文件也可以使用dumpe2fs来查看。
  • 区块对照表(block bitmap)
    从 block bitmap 当中可以知道哪些 block 是空的,因此我们的系统就能够很快速的找到可使用的空间来处理文件,同样的,如果删除某些文件时,那么那些文件原本占用的 block 号码就得要释放出来, 此时在 block bitmap 当中相对应到该 block 号码的标志就得要修改成为‘未使用中’。
  • inode对照表(inode table)
    和区块对照表类似,只不过是用来记录inode的使用过和未使用的号码。
  • dumpe2fs:查询ext系列超级区块信息的命令。在xfs文件系统中无法使用,这意味着在Centos7中就无法使用。

    与目录树的关系

  • 目录:当我们在linux下建立一个目录的时候,文件系统会分配一个inode与至少一个区块给该目录。其中,inode记录该目录的相关属性与权限,并记录分配到的那个区块号码,而区快是用来记录这个目录下的文件名与该文件名占用的inode号码数据。可以使用ls -i来查看inode号码。

    ext2/ext3/ext4文件的存取与日志式文件系统的功能

    对新增文件时发生数据不一致的处理方式,早期的ext2文件系统依靠超级区块进行检测,日志式的文件系统有个日志文件进行操作记录,可以更方便的进行操作。

    Linux文件系统的运行

    将内存中的数据分为dirty和clean两种,系统将不定时的将内存中的dirty数据存入磁盘,也可以手工通过执行sync命令来执行。dirty是修改过的数据。

    挂载点的意义

    将文件系统与目录树的结合称为挂载,挂载点一定是目录,该目录为进入该文件系统的入口。文件系统必须挂载在目录树的某个目录后,才能够使用该目录。

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

    Linux支持的文件系统可以通过ls -l /lib/modules/$(uname -r)/kernel/fs来查看。
    VFS(Virtual FileSystem Switch)是Linux帮我们管理文件系统的程序,让用户可以忽略文件系统的差异。

    XFS文件系统的介绍

    xfs是日志式文件系统,主要规划为数据区,文件系统活动登陆区,实时运行区。使用xfs_info来观察该文件系统的类似超级区块的部分。

    文件系统的简单操作

    磁盘与目录的容量

    df:列出文件系统的整体磁盘使用量
    du:查看文件系统的磁盘使用量

    硬链接与符号链接

    硬链接:

    不能跨文件系统。
    不能链接目录。(会出现一个目录两个父目录的情况,也会出现目录回路的情况。)

    符号链接:

    类似于windows的快捷方式。

    总结

    给test文件建立硬链接testhard和软链接testsoft之后,删除了test,testhard仍然可以使用,testsoft无法使用。
    关于目录的链接数量,当一个文件夹建立的时候,他会有..和.两个文件链接出现。此时他的父目录就会多出一个硬链接数量(..),子目录天生就有两个硬链接(一个是目录本身,一个是.)。

    磁盘的分区,格式化,检验与挂载

  1. 对磁盘的划分,建立可用的磁盘分区。
  2. 对硬盘进行格式化,建立可用的文件系统。
  3. 对新建立的文件系统进行检验。
  4. 在Linux系统上,建立挂载点(目录),并将其挂载上来。

    观察磁盘分区

  • lsblk:列出系统上的所有磁盘列表。
    • -f:列出其中的文件系统名称。
  • blkid:列出设备的UUID等参数。
  • parted:列出磁盘的分区表类型与分区信息。

    磁盘分区

  • gdisk:适用于GPT分区表。

    • 应该先使用lsblk或者blkid找到磁盘,再用parted /dev/xxx print找到内部的分区表类型,再使用gdisk或者是fdisk来操作系统。
    • 使用gdisk新增分区的时候,有一个Hex Code or GUID这里选择的是未来这个分区预计使用的文件系统。默认的是Linux文件系统的8300。Last Sector选项需要注意一下,使用+1G这种格式较方便。
  • partprobe:使用gdisk创建硬盘之后并不能立刻看到硬盘分区,因为内核还没有更新,此时可以通过重启,或者这个命令来进行更新Linux内核的分区信息。
  • fdisk:适用于MBR分区表。

    磁盘格式化(创建文件系统)

  • mkfs(make filesystem):这个命令是个综合命令,可以调用正确的文件格式化工具。例如mkfs.xfs,mkfs.vfat等创建正确的文件系统。

  • -f:如果设备内已经有文件系统,就需要用这个-f来进行强制格式化。
  • mkfs.xfs创建xfs的文件系统。
  • mkfs.ext4创建ext4的文件系统。默认值文件在/etc/mke2fs.conf文件中。

    文件系统检验

    xfs_repair当有xfs文件系统错乱时使用该命令。
    fsck.ext4是个处理ext4文件系统。
    以上两个命令是文件系统出错的时候才使用的命令,一般不要使用,会影响到文件系统的正确性。且被检查的文件系统必须处于卸载的状态。但是根目录无法卸载,如果根目录出现问题,就需要进入单人维护或者恢复模式使用-d选项来强制检验该设备。

    文件系统的挂载与卸载

  • 单一文件系统不应该被重复挂载在不同的挂载点(目录)中;

  • 单一目录不应该重复挂载多个文件系统。
  • 要作为挂载点的目录,理论上要是空目录,如果不是空目录就会覆盖里面的文件,但是将文件系统卸载之后又会重新恢复。

使用mount命令来进行文件系统的挂载。

  • -a:依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来。
  • 建议使用UUID来进行文件系统的挂载。

    挂载xfs,ext4,vfat等文件系统

    mount UUID 挂载点

    挂载USB磁盘

    mount -o codepage=950,iocharset=utf8 UUID 挂载点
    如果是中文文件名的vfat,那么可以在挂载制定挂载文件系统所使用的语系。在man mount找到vfat文件格式当中可以使用codepage来处理。中文的语系为950,如果想要指定中文编码是Unicode还是Big5就需要iocharset来制定了。

    重新挂载新目录与挂载不特定目录

  • 根目录根本不能卸载,但是如果你的挂载参数要改变或是根目录出现只读的状态的时候,可以使用重新启动,或者使用mount -o remount,rw,auto /。重点是-o remount,xx的选项和参数。

  • 也可以利用mount来将某个目录挂载到另外一个目录,这并不是挂载文件系统,而是额外挂载某个目录的方法。这个也可以通过软链接来完成这个操作。

    磁盘/文件系统参数自定义

  • mknod

  • xfs_admin修改XFS文件系统的UUID与Label name。
  • 为什么使用UUID来作为挂载时写入的设备名称呢?因为当一个磁盘在所有的Linux系统上都是/dev/sda。例如在这个linux系统上时/dev/sda在另外一个linux系统上也有了/dev/sda就不能使用同一个命令了。
  • 使用uuidgen可以使用新的uuid。
  • 使用tune2fs修改ext4文件系统的lablename与UUID。

    设置启动挂载

    启动挂载/etc/fstab及/etc/matb

image.png

image.png
image.pngimage.pngimage.png
image.png
image.png

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

镜像文件的挂载

image.png

大文件制作Loop设备挂载

image.png
image.png

内存交换分区之创建

image.png

使用物理分区创建内存交换分区

image.png

使用文件创建内存交换文件

image.png
image.png
image.png
image.png
说明:
我们的 Linux 系统大概都用不到 swap这个玩意儿的。
不过, 如果是针对服务器或者是工作站这些常年上线的系统来说的话,那么,无论如何, swap 还是需要建立的。
另外,有某些程序在运作时,本来就会利用 swap 的特性来存放一些数据段, 所以, swap 来是需要建立的!只是不需要太大!

文件系统的特殊观察与操作

磁盘空间之浪费问题

一个区块只能存放一个文件,假设只有1k但是区块大小是4k。那么3k就被浪费了。

利用GNU的parted进行分区操作

image.png
image.png
image.png
image.png
image.png
image.png

重点回顾

  1. 一个可以被挂载的数据通常称为『文件系统, filesystem』而不是分区槽 (partition) 喔!
  2. 基本上 Linux 的传统文件系统为 Ext2 ,该文件系统内的信息主要有:
  • superblock:记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
  • inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码;
  • block:实际记录文件的内容,若文件太大时,会占用多个 block 。
  1. Ext2 文件系统的数据存取为索引式文件系统(indexed allocation)
  2. 需要碎片整理的原因就是文件写入的 block 太过于离散了,此时文件读取的效能将会变的很差所致。 这个时候可以透过碎片整理将同一个文件所属的 blocks 汇整在一起。
  3. Ext2 文件系统主要有:boot sector, superblock, inode bitmap, block bitmap, inode table, data block 等六大部分。
  4. data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已
  5. inode 记录文件的属性/权限等数据,其他重要项目为: 每个 inode 大小均为固定,有 128/256bytes 两种基本容量。每个文件都仅会占用一个 inode 而已; 因此文件系统能够建立的文件数量与 inode 的数量有关;
  6. 文件的 block 在记录文件的实际数据,目录的 block 则在记录该目录底下文件名与其 inode 号码的对照表;
  7. 日志式文件系统 (journal) 会多出一块记录区,随时记载文件系统的主要活动,可加快系统复原时间;
  8. Linux 文件系统为增加效能,会让主存储器作为大量的磁盘高速缓存;
  9. 实体链接只是多了一个文件名对该 inode 号码的链接而已;
  10. 符号链接就类似 Windows 的快捷方式功能。

13 . 磁盘的使用必需要经过: 分区、格式化与挂载,分别惯用的指令为: gdisk, mkfs, mount 三个指令

  1. 分区时,应使用 parted 检查分区表格式,再判断使用 fdisk/gdisk 来分区,或直接使用 parted 分区
  2. 为了考虑效能, XFS 文件系统格式化时,可以考虑加上 agcount/su/sw/extsize 等参数较佳

16 . 如果磁盘已无未分区的容量,可以考虑使用大型文件取代磁盘装置的处理方式,通过 dd 与格式化功能。

  1. 开机自动挂载可参考/etc/fstab 之设定,设定完毕务必使用 mount -a 测试语法正确否;