八、管理文件系统
-
Linux 支持多种文件系统。每种文件系统都在存储设备上实现了虚拟目录结构,只是特性略有不同。
-
Linux 操作系统最初引入的文件系统叫作扩展文件系统(extended filesystem,简称 ext),它为 Linux 提供了一个基本的类 Unix 文件系统,使用虚拟目录处理物理存储设备并在其中以固定大小的磁盘块(fixed-length block)形式保存数据。
-
ext 文件系统使用i 节点(inode)跟踪存储在虚拟目录中文件的相关信息。 i 节点系统在每个 物理存储设备中创建一个单独的表(称作 i 节点表)来保存文件信息。虚拟目录中的每个文件在 i 节点表中有对应的条目。ext 文件系统名称中的 extended 部分得名自其所跟踪的每个文件的额外 数据,包括以下内容:
- 文件名
- 文件大小
- 文件属主
- 文件属组
- 文件访问权限
- 指向存有文件数据的每个块的指针
- Linux 通过一个唯一的数值(称作 i 节点号) 来引用 i 节点表中的 i 节点,这个值是创建文件 时由文件系统分配的。文件系统是通过 i 节点号而非文件名和路径来标识文件的。
- 最早的 ext 文件系统限制颇多,比如文件大小不得超过 2 GB。在 Linux 出现后不久, ext 文 件系统就升级到了第二代扩展文件系统, 称作 ext2。在保持与 ext 相同的文件系统结构的同时, ext2 在功能上做了扩展。
- 在 i 节点表中加入了文件的创建时间、修改时间以及最后一次访问时间。
- 允许的最大文件大小增至 2 TB,后期又增加到 32 TB。
- 保存文件时按组分配磁盘块。
- ext2 文件系统也有限制。如果系统在存储文件和更新 i 节点表之间发生了什么事情, 则两者 内容可能无法同步, 潜在的结果是丢失文件在磁盘上的数据位置。
- 日志文件系统为 Linux 系统增加了一层安全性。它放弃了之前先将数据直接写入存储设备再 更新 i 节点表的做法,而是先将文件变更写入临时文件(称作日志)。在数据被成功写到存储设 备和 i 节点表之后,再删除对应的日志条目。如果系统在数据被写入存储设备之前崩溃或断电, 则日志文件系统会读取日志文件, 处理尚未提交的数据。
- Linux 中有 3种广泛使用的日志方法,每种的保护等级都不相同。
方法 描述 数据模式 i 节点和文件数据都会被写入日志;数据丢失风险低,但性能差 有序模式 只有 i 节点数据会被写入日志,直到文件数据被成功写入后才会将其删除;在性能和安全性之间取得了良好的折中 回写模式 只有 i 节点数据会被写入日志,但不控制文件数据何时写入;数据丢失风险高,但仍好于不用日志 - 数据模式日志方法是目前为止最安全的数据保护方法, 但速度也是最慢的。所有写入存储设 备的数据都必须写两次: 一次写入日志, 另一次写入实际的存储设备。
-
ext3 文件系统是 ext2 的后续版本, 支持最大 2 TB 的文件,能够管理 32 TB 大小的分区。在 默认情况下, ext3 采用有序模式的日志方法, 不过也可以通过命令行选项改用其他模式。 ext3 文 件系统无法恢复误删的文件,也没有提供数据压缩功能。
-
作为 ext3 的后续版本, ext4 文件系统最大支持 16 TiB 的文件,能够管理 1 EiB 大小的分区。 在默认情况下, ext4 采用有序模式的日志方法, 不过也可以通过命令行选项改用其他模式。另外 还支持加密、压缩以及单目录下不限数量的子目录。先前的 ext2 和 ext3 也可以作为 ext4 挂载, 以提高性能表现。
-
JFS 文件系统采用的是有序模式的日志方法,只在日志中保存 i 节点数据,直到文件数据被 写进存储设备后才将其删除。
-
XFS 文件系统采用回写模式的日志方法, 在提供了高性能的同时也引入了一定的风险, 因为 实际数据并未存进日志文件。
-
就文件系统而言, 日志技术的替代选择是一种称作写时复制(copy-on-write,COW)的技术。 COW 通过快照(snapshot)兼顾了安全性和性能。在修改数据时, 使用的是克隆或可写快照。修 改过的数据并不会直接覆盖当前数据,而是被放入文件系统中另一个位置。
- 真正的 COW 系统仅在数据修改完成之后才会改动旧数据。如果从不覆盖旧数据, 那么这种操作准确来说称作写时重定向(redirect-on-write,ROW )。不过,通常都将 ROW 简称为 COW。
- 从一个或多个磁盘(或磁盘分区) 创建的存储池提供了生成虚拟磁盘(称作卷)的能力。通过存储池, 可以根据需要增加卷,在提供灵活性的同时大大减少停机时间。
-
ZFS 是一个稳定的文件系统,与 Resier4 、Btrfs 和 ext4 势均力敌。它拥有数据完整性验证和自动修复功能,支持最大 16 EB 的文件,能够管理 256 万亿 ZB(256 quadrillion zettabyte)的存储空间。
-
Stratis 文件系统维护的存储池由一个或多个XFS 文件系统组成,同时还提供与传统的卷管理文件系统(比如 ZFS 和 Btrfs)相似的 COW 功能。
-
创建分区
- 需要在存储设备上创建可容纳文件系统的分区。分区范围可以是整个硬盘,也可以是部分硬盘以包含虚拟目录的一部分。
- 可用于组织和管理分区的工具不止一种。本节重点关注其中 3 种:
- fdisk
- gdisk
- GNU parted
- Linux 采用了一种标准格式来为硬盘分配设备名称, 在进行分区之前, 必须熟悉这种格式。
- SATA 驱动器和 SCSI 驱动器:设备命名格式为/dev/sdx ,其中字母 x 具体是什么要根据驱 动器的检测顺序决定(第一个检测到的驱动器是 a ,第二个是 b ,以此类推)。
- SSD NVMe 驱动器: 设备命名格式为/dev/nvmeNn#,其中数字 N 具体是什么要根据驱动 器的检测顺序决定(从 0 起始)。 #是分配给该驱动器的名称空间编号(从 1 起始)。
- IDE 驱动器: 设备命名格式为/dev/hdx,其中字母 x 具体是什么要根据驱动器的检测顺序 决定(第一个检测到的驱动器是 a ,第二个是 b ,以此类推)。
- fdisk
- fdisk 可以在任何存储设备上创建和管理分区。但是,fdisk 只能处理最大 2 TB 的硬盘。如果大于此容量,则只能使用 gdisk 或 GNUparted 代替。
- 如果存储设备是首次分区,则 fdisk 会警告你该设备没有分区表。
- fdisk 是一个交互式程序,允许你输入命令来逐步完成硬盘分区操作。要启动 fdisk,需要 指定待分区的存储设备的名称, 同时还必须有超级用户权限(以 root 用户登录或使用sudo 命令)。
# whoami root # fdisk /dev/sda Welcome to fdisk (util-linux 2.32.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help):
- fdisk 使用自己的命令行, 允许你提交命令, 对存储设备进行分区。常用的 fdisk 命令常用命令:
命令 描述 a 设置活动分区标志 b 编辑 BSD Unix 系统使用的标签 c 设置 DOS 兼容标志 d 删除分区 g 创建新的空 GTP 分区表 G 创建 IRIX( SGI )分区表 l 显示可用的分区类型 m 显示命令菜单 n 添加一个新分区 o 创建新的空 DOS 分区表 p 显示当前分区表 q 退出,不保存更改 s 为 Sun Unix 系统创建一个新标签 t 修改分区的系统 ID u 修改显示单元 v 验证分区表 w 将分区表写入磁盘并退出 x 附加功能(仅供专家使用) - fdisk 命令不允许调整现有分区的大小。只能删除现有分区,然后重新创建。
- 一些发行版和比较旧的发行版在创建好分区后不会自动通知 Linux 系统。在这种情况下,需要使用 partprobe 命令或 hdparm 命令(参见命令相关的手册页),或者重启系统,使其读取更新后的分区表。
- 如果对分区做了改动, 那么务必使用 w 命令将改动写入硬盘后再退出。如果不想保存修改内 容,则直接使用 q 命令退出。
- 注意,在使用 fdisk 创建新分区时, 无须输入任何信息。只需按 Enter 键,接受给出的默认值即可。
- gdisk
- 如果存储设备要采用 GUID 分区表( GUID partition table ,GPT),就要用到 gdisk。
- gdisk 会识别存储设备所采用的分区类型。如果当前未使用 GPT 方法, 则 gdisk 会提供相应的选项,将其转换为 GPT。
- 在转换存储设备分区类型的时候务必小心。所选择的类型必须与系统固件( BIOS 或 UEFI)兼容,否则,将无法引导设备。
- gdisk 也提供了自己的命令行提示符,允许输入命令进行分区操作。常用的 gdisk 命令:
命令 | 描述
b | 将 GTP 数据备份至文件
c | 修改分区名称
d | 删除分区
i | 显示分区的详细信息
l | 显示可用的分区类型
n | 添加一个新分区
o | 创建一个新的空 GUID 分区表( GPT )
p | 显示当前分区表
q | 退出,不保存更改
r | 恢复和转换选项(仅供专家使用)
s | 排序分区
t | 修改分区的类型代码
v | 验证磁盘
w | 将分区表写入磁盘并退出
x | 附加功能(仅供专家使用)
? | 显示命令菜单
- GNU parted
- GNU parted 提供了另一种命令行界面来处理分区。不同于 fdisk 和 gdisk,GNU parted 中的命令更像是单词。
- parted 允许调整现有的分区大小, 所以可以很容易地收缩或扩大磁盘分区。
- 创建文件系统
- 将数据存储到分区之前, 必须使用某种文件系统对其进行格式化, 以便 Linux 能够使用分区。 每种文件系统类型都有自己专门的格式化工具。创建文件系统的命令行工具:
工具 用途 mkefs 创建 ext 文件系统 mke2fs 创建 ext2 文件系统 mkfs.ext3 创建 ext3 文件系统 mkfs.ext4 创建 ext4 文件系统 mkreiserfs 创建 ReiserFS 文件系统 jfs_mkfs 创建 JFS 文件系统 mkfs.xfs 创建 XFS 文件系统 mkfs.zfs 创建 ZFS 文件系统 mkfs.btrfs 创建 Btrfs 文件系统 - 并非所有的文件系统工具都已经默认安装过。要想知道某个工具是否可用,可以使用 type 命令:
$ type mkfs.ext4 mkfs.ext4 is /usr/sbin/mkfs.ext4 $ type mkfs.btrfs -bash: type: mkfs.btrfs: not found
- 上面的例子显示了 mkfs.ext4 是可用的,而 mkfs.btrfs 则不可用。
- 另外,还需检查使用的 Linux 发行版是否支持要创建的文件系统。
- 并非所有的文件系统工具都已经默认安装过。要想知道某个工具是否可用,可以使用 type 命令:
- 所有的文件系统命令都允许通过不带选项的简单形式来创建默认的文件系统,但要求你拥有超级用户权限。
- 每个文件系统命令都有大量命令行选项, 允许你定制如何在分区上创建文件系统。要查看所有可用的命令行选项, 可以使用 man 命令显示相应命令的手册页。
- 为分区创建好文件系统之后,下一步是将其挂载到虚拟目录中的某个挂载点,以便在新分区中存储数据。挂载点可以是虚拟目录中的任何位置。
$ sudo mkfs.ext4 /dev/sdb1 [sudo] password for christine: mke2fs 1.44.6 (5-Mar-2019) Creating filesystem with 524032 4k blocks and 131072 inodes [...] Creating journal (8192 blocks): done Writing superblocks and filesystem accounting information: done $ mkdir /home/christine/part $ sudo mount -t ext4 /dev/sdb1 /home/christine/part [sudo] password for christine: $ lsblk -f /dev/sdb NAME FSTYPE LABEL UUID MOUNTPOINT sdb ⌙ sdb1 ext4 a8d1d[...] /home/christine/part
- 这个新文件系统采用了 ext4 文件系统类型, 这是 Linux 的日志文件系统。注意, 创建过程中 有一步是创建新的日志。
- mkdir 命令在虚拟目录中创建了挂载点,mount 命令会将新分区的文件系统添加到挂载点。mount 命令的-t 选项指明了要挂载的文件系统类型(ext4)。 lsblk -f 命令可以显示新近格式化过并挂载的分区。
- 这种挂载文件系统的方法只能实现临时挂载,重启系统后就失效了。要强制 Linux 在启动时自动挂载文件系统,可以将其添加到/etc/fstab 文件中。
- 文件系统的检查与修复
- 每种文件系统各自都有相应的恢复命令。
- fsck 命令可以检查和修复大部分 Linux 文件系统类型。该命令的格式如下:
fsck options filesystem
- 可以在命令行中列出多个要检查的文件系统。文件系统可以通过多种方法指定, 比如设备 名或其在虚拟目录中的挂载点。但在对其使用 fsck 之前,必须先卸载设备。
- fsck 命令会使用/etc/fstab 文件自动决定系统中已挂载的存储设备的文件系统。如果存储设 备尚未挂载(比如刚刚在新的存储设备上创建了文件系统), 则需要用-t 命令行选项指定文件系统类型。
- fsck 常用的命令行选项:
选项 描述 -a 检测到错误时自动修复文件系统 -A 检查/etc/fstab 文件中列出的所有文件系统 -N 不进行检查,只显示要检查的内容 -r 出现错误时进行提示 -R 使用-A 选项时跳过根文件系统 -t 指定要检查的文件系统类型 -V 在检查时产生详细输出 -y 检测到错误时自动修复文件系统 - 有些命令行选项是重复的。这是为多个命令实现通用前端带来的部分问题。 有些文件系统修复命令有额外的可用选项。
- 只能对未挂载的文件系统执行 fsck 命令。对大多数文件系统来说,只需先卸载文件系统,检查完成之后再重新挂载即可。但因为根文件系统含有 Linux 所有的核心命令和日志文件,所以无法在处于运行状态的系统中卸载它。这正是 Linux Live CD、DVD 或 USB 大展身手的时机。只需用 Linux Live 媒介启动系统即可,然后对根文件系统执行 fsck 命令。
- 逻辑卷管理
- Linux 逻辑卷管理器(logical volume manager,LVM)可以通过将另一块硬盘上的分区加入已有的文件系统来动态地添加存储空间。它可以让你在无须重建整个 文件系统的情况下, 轻松地管理磁盘空间。
- LVM 布局
- LVM 允许将多个分区组合在一起, 作为单个分区(逻辑卷)进行格式化、在 Linux 虚拟目 录结构上挂载、存储数据等。随着数据需求的增长,你还可以继续向逻辑卷添加分区。
- LVM 由 3 个主要部分组成:
- 物理卷
- 物理卷(physical volume,PV)通过 LVM 的 pvcreate 命令创建。该命令指定了一个未使 用的磁盘分区(或整个驱动器) 由 LVM 使用。在这个过程中, LVM 结构、卷标和元数据都会被 添加到该分区。
- 卷组
- 卷组(volume group,VG)通过 LVM 的 vgcreate 命令创建。该命令会将 PV 加入存储池, 后者随后用于构建各种逻辑卷(也就是说,多个物理卷( PV )集中在一起会形成卷组(VG), 由此形成了一个存储池, 从中为逻辑卷( LV )分 配存储空间)。
- 可以存在多个卷组。当你使用 vgcreate 将一个或多个 PV 加入 VG时, 也会同时添加卷组 的元数据。
- 被指定为 PV 的分区只能属于单个 VG。但是,被指定为 PV 的其他分区可以属于其他 VG。
- 逻辑卷
- 逻辑卷(logical volume,LV)通过 LVM 的 lvcreate 命令创建。这是逻辑卷创建过程的最 终产物。 LV 由 VG 的存储空间块(这些块叫作 PE(physical extents))组成。你可以使用文件系统格式化 LV ,然后将其挂载,像普 通的磁盘分区那样使用。
- 尽管可以有多个 VG,但 LV 只能从一个指定的 VG 中创建(也就是说, LV 不能跨 VG创建)。 不过, 多个 LV 可以共享单个 VG 。你可以使用相应的 LVM 命令调整(增加或减少) LV 的容量。该特性赋予了数据存储管理极大的灵活性。
- 物理卷
- Linux 中的 LVM
- lvm 是用于创建和管理 LV 的交互式实用工具。如果尚未安装, 可以通过 lvm2 软件包安装。各种 LVM 工具直接在 CLI 中就可以使用,无须进入 lvm。
- 首次设置逻辑卷的步骤如下。
(1) 创建物理卷。
(2) 创建卷组。
(3) 创建逻辑卷。
(4) 格式化逻辑卷。
(5) 挂载逻辑卷。 - 创建 PV
- 在指定作为 PV 的存储设备之前, 先确保已经分区且未使用。可以使用 pvcreate 命令指定 要作为 PV 的分区,执行该命令需要有超级用户权限:
- 最好多设置几个 PV。LVM 的关键在于将额外的存储空间动态添加到 LV。设置过 PV后,就该创建 VG 了。
- 创建 VG
- 只要是 PV,就可以加入 VG 。创建 VG 的命令是 vgcreate。
- 在创建 VG 的过程中可以指定多个 PV 。如果随后需要向 VG 中添加 PV,可以使用 vgextend 命令。
- 通常的做法是将第一个 VG 命名为 vg00,将下一个 VG 命名为 vg01,以此类推。
- 由于许多发行版在安装期间为虚拟目录结构的根(/)设置了 LVM, 因此最好使用 vgdisplay 命令检查一下系统当前的 VG。
- 创建 LV
- 可以使用 lvcreate 命令创建 LV。LV 的大小由-L 选项设置,使用的空间取自指定的 VG 存储池。
- 如果出于某种原因, VG 没有足够的存储空间来满足 LV 要求的大小,那么 lvcreate 命令将无法创建 LV 。你会看到错误消息 insufficient free space error。
- 创建好 LV 之后,可以使用 lvdisplay 命令显示相关信息。注意,命令中的完整路径名用于指定 LV。
- 除了 lvdisplay 命令,也可以使用 lvs 命令和 lvscan 命令显示系统的 LV 信息。
- 使用 Linux LVM
- 一旦创建好 LV ,就可以将其视作普通分区。可以根据需要扩大或收缩这个分区。但在此之前,必须将 LV 挂载到虚拟目录结构中。
- 格式化和挂载 LV
- 对于 LV ,无须执行任何特殊操作就可以在其上创建文件系统,然后再挂载到虚拟目录结构中。
- 扩大或收缩 VG 和 LV。扩大或收缩 LVM 的命令:
命令 功能 Vgextend 将 PV 加入 VG Vgreduce 从 VG 中删除 PV lvextend 扩大 LV 的容量 lvreduce 收缩 LV 的容量 - 要想了解所有的 LVM 命令,可以在命令行中输入 lvm help。