管理文件系统

使用 Linux 系统时,需要作出的决策之一就是为存储设备选用什么文件系统。大多数 Linux 发行版在安装时会非常贴心地提供默认的文件系统,大多数入门级用户想都不想就用了默认的那个。

使用默认文件系统未必就不好,但了解一下可用的选择有时也会有所帮助。本章将探讨 Linux 世界里可选用的不同文件系统,并向你演示如何在命令行上进行创建和管理。

探索 Linux 文件系统

之前讨论了 Linux 如何通过文件系统来在存储设备上存储文件和目录。Linux 的文件系统为我们在硬盘中存储的 0 和 1 和应用中使用的文件与目录之间搭建起了一座桥梁。Linux 支持多种类型的文件系统管理文件和目录。每种文件系统都在存储设备上实现了虚拟目录结构,仅特性有所不同。本章将带你逐步了解 Linux 环境中较常用的文件系统的优点和缺陷。

基本的 Linux 文件系统

Linux 最初采用的是一种简单的文件系统,它模仿了 Unix 文件系统的功能。本节将讨论这种文件系统的演进过程。

  1. ext 文件系统

Linux 操作系统中引入的最早的文件系统叫作扩展文件系统(extended filesystem,简记为 ext)。它为 Linux 提供了一个基本的类 Unix 文件系统:使用虚拟目录来操作硬件设备,在物理设备上按定长的块来存储数据。

ext 文件系统采用名为索引节点的系统来存放虚拟目录中所存储文件的信息。索引节点系统在每个物理设备中创建一个单独的表(称为索引节点表)来存储这些文件的信息。存储在虚拟目录中的每一个文件在索引节点表中都有一个条目。ext 文件系统名称中的 extended 部分来自其跟踪的每个文件的额外数据,包括:

  • 文件名
  • 文件大小
  • 文件的属主
  • 文件的属组
  • 文件的访问权限

Linux 通过唯一的数值(称作索引节点号)来引用索引节点表中的每个索引节点,这个值是创建文件时由文件系统分配的。文件系统通过索引节点号而不是文件全名及路径来标识文件。

  1. ext2 文件系统

最早的 ext 文件系统有不少限制,比如文件大小不得超过 2 GB。在 Linux 出现后不久,ext 文件系统就升级到了第二代扩展文件系统,叫作 ext2。

如你所猜测的,ext2 文件系统是 ext 文件系统基本功能的一个扩展,但保持了同样的结构。ext2 文件系统扩展了索引节点表的格式来保存系统上每个文件的更多信息。

ext2 的索引节点表为文件添加了创建时间值、修改时间值和最后访问时间值来帮助系统管理员追踪文件的访问情况。ext2 文件系统还将允许的最大文件大小增加到了 2 TB(在 ext2 的后期版本中增加到了 32 TB),以容纳数据库服务器中常见的大文件。

除了扩展索引节点表外,ext2 文件系统还改变了文件在数据块中存储的方式。ext 文件系统常见的问题是在文件写入到物理设备时,存储数据用的块很容易分散在整个设备中(称作碎片化,fragmentation)。数据块的碎片化会降低文件系统的性能,因为需要更长的时间在存储设备中查找特定文件的所有块。

保存文件时,ext2 文件系统通过按组分配磁盘块来减轻碎片化。通过将数据块分组,文件系统在读取文件时不需要为了数据块查找整个物理设备。
多年来,ext 文件系统一直都是 Linux 发行版采用的默认文件系统。但它也有一些限制。索引节点表虽然支持文件系统保存有关文件的更多信息,但会对系统造成致命的问题。文件系统每次存储或更新文件,它都要用新信息来更新索引节点表。问题在于这种操作并非总是一气呵成的。

如果计算机系统在存储文件和更新索引节点表之间发生了什么,这二者的内容就不同步了。ext2 文件系统由于容易在系统崩溃或断电时损坏而臭名昭著。即使文件数据正常保存到了物理设备上,如果索引节点表记录没完成更新的话,ext2 文件系统甚至都不知道那个文件存在!很快开发人员就开始尝试开发不同的 Linux 文件系统了。

日志文件系统

日志文件系统为 Linux 系统增加了一层安全性。它不再使用之前先将数据直接写入存储设备再更新索引节点表的做法,而是先将文件的更改写入到临时文件(称作日志,journal)中。在数据成功写到存储设备和索引节点表之后,再删除对应的日志条目。

如果系统在数据被写入存储设备之前崩溃或断电了,日志文件系统下次会读取日志文件并处理上次留下的未写入的数据。

Linux 中有 3 种广泛使用的日志方法,每种的保护等级都不相同

  • 数据模式: 索引节点和文件都会被写入日志;丢失数据风险低,但性能差
  • 有序模式: 只有索引节点数据会被写入日志,在对应的元数据标记为提交前,强制写入文件内容。只有数据成功写入后才删除;在性能和安全性之间取得了良好的折中
  • 回写模式: 只有索引节点数据会被写入日志,但不控制文件数据何时写入;丢失数据风险高,但仍比不用日志好

数据模式日志方法是目前为止最安全的数据保护方法,但同时也是最慢的。所有写到存储设备上的数据都必须写两次:第一次写入日志,第二次写入真正的存储设备。这样会导致性能很差,尤其是对要做大量数据写入的系统而言。

这些年来,在 Linux 上还出现了一些其他日志文件系统。下面将会讲述常见的 Linux 日志文件系统。

  1. ext3 文件系统

2001 年,ext3 文件系统被引入 Linux 内核中。它采用和 ext2 文件系统相同的索引节点表结构,但给每个存储设备增加了一个日志文件,以将准备写入存储设备的数据先记入日志。

默认情况下,ext3 文件系统用有序模式的日志功能——只将索引节点信息写入日志文件,直到数据块都被成功写入存储设备才删除。你可以在创建文件系统时用简单的一个命令行选项将 ext3 文件系统的日志方法改成数据模式或回写模式。

虽然 ext3 文件系统为 Linux 文件系统添加了基本的日志功能,但它仍然缺少一些功能。例如 ext3 文件系统无法恢复误删的文件,它没有任何内建的数据压缩功能(虽然有个需单独安装的补丁支持这个功能),ext3 文件系统也不支持加密文件。鉴于这些原因,Linux 项目的开发人员选择再接再厉,继续改进 ext3 文件系统。

  1. ext4 文件系统

扩展 ext3 文件系统功能的结果是 ext4 文件系统(你可能也猜出来了)。ext4 文件系统在 2008 年受到 Linux 内核官方支持,现在已是大多数流行的 Linux 发行版采用的默认文件系统。

除了支持数据压缩和加密,ext4 文件系统还支持一个称作区段(extent)的特性。区段在存储设备上按块分配空间,但在索引节点表中只保存起始块的位置。由于无需列出所有用来存储文件中数据的数据块,它可以在索引节点表中节省一些空间。

ext4 还引入了块预分配技术(block preallocation)。如果你想在存储设备上给一个你知道要变大的文件预留空间,ext4 文件系统可以为文件分配所有需要用到的块,而不仅仅是那些现在已经用到的块。ext4 文件系统用 0 填满预留的数据块,不会将它们分配给其他文件。

  1. Reiser 文件系统

2001 年,Hans Reiser 为 Linux 创建了第一个称为 ReiserFS 的日志文件系统。ReiserFS 文件系统只支持回写日志模式——只把索引节点表数据写到日志文件。ReiserFS 文件系统也因此成为 Linux 上最快的日志文件系统之一。

有两个有意思的特性被引入了 ReiserFS 文件系统:一个是你可以在线调整已有文件系统的大小;另一个是被称作尾部压缩(tailpacking)的技术,该技术能将一个文件的数据填进另一个文件的数据块中的空白空间。如果你必须为已有文件系统扩容来容纳更多的数据,在线调整文件系统大小功能非常好用。

  1. JFS 文件系统

作为可能依然在用的最老的日志文件系统之一,JFS(Journaled File System)是 IBM 在 1990 年为其 Unix 衍生版 AIX 开发的。然而直到第 2 版,它才被移植到 Linux 环境中。

IBM 官方称 JFS 文件系统的第 2 版为 JFS2,但大多数 Linux 系统提到它时都只用 JFS。

JFS 文件系统采用的是有序日志方法,即只在日志中保存索引节点表数据,直到真正的文件数据被写进存储设备时才删除它。这个方法在 ReiserFS 的速度和数据模式日志方法的完整性之间的采取的一种折中。

JFS 文件系统采用基于区段的文件分配,即为每个写入存储设备的文件分配一组块。这样可以减少存储设备上的碎片。

除了用在 IBM Linux 上外,JFS 文件系统并没有流行起来,但你有可能在同 Linux 打交道的日子中碰到它。

  1. XFS 文件系统

XFS 日志文件系统是另一种最初用于商业 Unix 系统而如今走进 Linux 世界的文件系统。美国硅图公司(SGI)最初在 1994 年为其商业化的 IRIX Unix 系统开发了 XFS。2002 年,它被发布到了适用于 Linux 环境的版本。

XFS 文件系统采用回写模式的日志,在提供了高性能的同时也引入了一定的风险,因为实际数据并未存进日志文件。XFS 文件系统还允许在线调整文件系统的大小,这点类似于 ReiserFS 文件系统,除了 XFS 文件系统只能扩大不能缩小。

写时复制文件系统

采用了日志式技术,你就必须在安全性和性能之间做出选择。尽管数据模式日志提供了最高的安全性,但是会对性能带来影响,因为索引节点和数据都需要被日志化。如果是回写模式日志,性能倒是可以接受,但安全性就会受到损害。

就文件系统而言,日志式的另一种选择是一种叫作写时复制(copy-on-write,COW)的技术。COW 利用快照兼顾了安全性和性能。如果要修改数据,会使用克隆或可写快照。修改过的数据并不会直接覆盖当前数据,而是被放入文件系统中的另一个位置上。即便是数据修改已经完成,之前的旧数据也不会被重写。COW 文件系统已日渐流行,接下来会简要概览其中最流行的两种(Btrf 和 ZFS)。

  1. ZFS 文件系统

COW 文件系统 ZFS 是由 Sun 公司于 2005 年研发的,用于 OpenSolaris 操作系统,从 2008 年起开始向 Linux 移植,最终在 2012 年投入 Linux 产品的使用。

ZFS 是一个稳定的文件系统,与 Resier4、Btrfs 和 ext4 势均力敌。它最大的弱项就是没有使用 GPL 许可。自 2013 年发起的 OpenZFS 项目有可能改变这种局面。但是,在获得 GPL 许可之前,ZFS 有可能终无法成为 Linux 默认的文件系统。

  1. Btrfs 文件系统

Btrfs 文件系统是 COW 的新人,也被称为 B 树文件系统。它是由 Oracle 公司于 2007 年开始研发的。Btrfs 在 Reiser4 的诸多特性的基础上改进了可靠性。另一些开发人员最终也加入了开发过程,帮助 Btrfs 快速成为了最流行的文件系统。究其原因,则要归于它的稳定性、易用性以及能够动态调整已挂载文件系统的大小。OpenSUSE Linux 发行版将 Btrfs 作为其默认文件系统。除此之外,该文件系统也出现在了其他 Linux 发行版中(如 RHEL),Fedora 在 2020 年将 Btrfs 作为其默认文件系统。

操作文件系统

Linux 提供了一些不同的工具,我们可以利用它们轻松地在命令行中进行文件系统操作。可使用键盘随心所欲地创建新的文件系统或者修改已有的文件系统。本节将会带你逐步了解命令行下的文件系统交互的命令。

创建分区

一开始,你必须在存储设备上创建分区来容纳文件系统。分区可以是整个硬盘,也可以是部分硬盘,以容纳虚拟目录的一部分。此部分推荐使用的终端中好用的图形化 cfdisk 工具,除此之外,fdisk 也是一个使用广泛的传统工具,不过使用较为麻烦,不推荐使用。

要启动 cfdisk 命令,你必须指定要分区的存储设备的设备名,另外还得有超级用户权限。如果在没有对应权限的情况下使用该命令,你会得到类似于下面这种错误提示。

$ cfdisk /dev/sdb

Unable to open /dev/sdb

有时候,创建新磁盘分区最麻烦的事情就是找出安装在 Linux 系统中的物理磁盘。Linux 采用了一种标准格式来为硬盘分配设备名称,但是你得熟悉这种格式。对于老式的 IDE 驱动器,Linux 使用的是/dev/hdx。其中 x 表示一个字母,具体是什么要根据驱动器的检测顺序(第一个驱动器是 a,第二个驱动器是 b,以此类推)。对于较新的 SATA 驱动器和 SCSI 驱动器,Linux 使用/dev/sdx。其中的 x 具体是什么也要根据驱动器的检测顺序(和之前一样,第一个驱动器是 a,第二个驱动器是 b,以此类推)。最新的 SSD 固态硬盘一般以/dev/nvme0nx 来标识。在格式化分区之前,最好再检查一下是否正确指定了驱动器。

如果你拥有超级用户权限并指定了正确的驱动器,那就可以进入 cfdisk 工具的操作界面了。

cfdisk 可以看到目前磁盘的详情,在界面下方有各类操作,可用方向键和回车进行选择,非常方便。一般的步骤是新建分区,输入大小,选择类型,最后写入退出即可。

创建文件系统

在将数据存储到分区之前,你必须用某种文件系统对其进行格式化,这样 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 是 /usr/bin/mkfs.ext4
$ type mkfs.btrfs
-bash: type: mkfs.btrfs: not found

据上面这个取自 Ubuntu 系统的例子显示,mkfs.ext4 工具是可用的。而 Btrfs 工具则不可用。
不可用的工具请按发行版自行安装。

每个文件系统命令都有很多命令行选项,允许你定制如何在分区上创建文件系统。要查看所有可用的命令行选项,可用 man 命令来显示该文件系统命令的手册页面。所有的文件系统命令都允许通过不带选项的简单命令来创建一个默认的文件系统。

$ sudo mkfs.ext4 /dev/sdb1
mke2fs 1.45.6 (20-Mar-2020)
创建含有 3891192 个块(每块 4k)和 972944 个inode的文件系统
文件系统UUID:3f916991-2368-4d43-8b10-90b6a7c13445
超级块的备份存储于下列块:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

正在分配组表: 完成
正在写入inode表: 完成
*创建日志*(16384 个块)完成
写入超级块和文件系统账户统计信息: 已完成

这个新的文件系统采用 ext4 文件系统类型,这是 Linux 上的日志文件系统。注意,创建过程中有一步是创建新的日志。

为分区创建了文件系统之后,下一步是将它挂载到虚拟目录下的某个挂载点,这样就可以将数据存储在新文件系统中了。你可以将新文件系统挂载到虚拟目录中需要额外空间的任何位置。

$ ls /mnt
$ sudo mkdir /mnt/my_partition
$ ls -al /mnt/my_partition/
$ #啥也没有
$ sudo  mount -t ext4  /dev/sdb1  /mnt/my_partition
$ ls -al /mnt/my_partition/
total 24
drwxr-xr-x. 3 root root  4096 Jun 11 09:53 .
drwxr-xr-x. 3 root root  4096 Jun 11 09:58 ..
drwx------. 2 root root 16384 Jun 11 09:53 lost+found

mkdir 命令在虚拟目录中创建了挂载点,mount 命令将新的硬盘分区添加到挂载点。mount 命令的-t 选项指明了要挂载的文件系统类型(ext4)。现在你可以在新分区中保存新文件和目录了!

这种挂载文件系统的方法只能临时挂载文件系统。当重启 Linux 系统时,文件系统并不会自动挂载。要强制 Linux 在启动时自动挂载新的文件系统,可以将其添加到/etc/fstab 文件。

现在文件系统已经被挂载了到虚拟目录中,可以投入日常使用了。遗憾的是,在日常使用过程中有可能会出现一些严重的问题,例如文件系统损坏。下一节将演示如何应对这种问题。

文件系统的检查与修复

就算是现代文件系统,碰上突然断电或者某个不规矩的程序在访问文件时锁定了系统,也会出现错误。幸而有一些命令行工具可以帮你将文件系统恢复正常

每个文件系统都有各自可以和文件系统交互的恢复命令。这可能会让局面变得不太舒服,随着 Linux 环境中可用的文件系统变多,你也不得不去掌握大量对应的命令。好在有个通用的前端程序,可以决定存储设备上的文件系统并根据要恢复的文件系统调用适合的文件系统恢复命令。

fsck 命令能够检查和修复大部分类型的 Linux 文件系统,包括本章早些时候讨论过的 ext、ext2、ext3、ext4、ReiserFS、JFS、XFS、ZFS 以及 Btrfs。该命令的格式是:

fsck options /dev/sdX

你可以在命令行上列出多个要检查的文件系统。文件系统可以通过设备名、在虚拟目录中的挂载点以及分配给文件系统的唯一 UUID 值来引用。

fsck 命令使用/etc/fstab 文件来自动检查文件系统类型。如果存储设备从未被挂载(比如你刚刚在新的存储设备上创建了个文件系统,/etc/fstab 并无其信息),你需要用-t 命令行选项来指定文件系统类型。使用 man 或 tldr 查看其他可用的命令行选项。在使用 fsck 时,被检查的文件系统应该处在未挂载状态。

你可能注意到了,有些命令行选项是重复的。这是为多个命令实现通用的前端带来的部分问题。有些文件系统修复命令有一些额外的可用选项。如果要做更高级的错误检查,就需要查看这个文件系统修复工具的手册页面来确定是不是有该文件系统专用的扩展选项。

只能在未挂载的文件系统上运行 fsck 命令。对大多数文件系统来说,你只需卸载文件系统来进行检查,检查完成之后重新挂载就好了。但因为根文件系统含有所有核心的 Linux 命令和日志文件,所以你无法在处于运行状态的系统上卸载它。这正是亲手体验 Linux LiveCD 的好时机!只需用 LiveCD 启动系统即可,然后在根文件系统上运行 fsck 命令。

到目前为止,本章讲解了如何处理物理存储设备中的文件系统。Linux 还有另一些方法可以为文件系统创建逻辑存储设备。下一节将告诉你如何使用逻辑存储设备。

逻辑卷管理

如果用标准分区在硬盘上创建了文件系统,为已有文件系统添加额外的空间多少是一种痛苦的体验。你只能在同一个物理硬盘的可用空间范围内调整分区大小。如果硬盘上没有地方了,你就必须弄一个更大的硬盘,然后手动将已有的文件系统移动到新的硬盘上。

这时候可以通过将另外一个硬盘上的分区加入已有文件系统,动态地添加存储空间。Linux 逻辑卷管理器(logical volume manager,LVM)软件包正好可以用来做这个。它可以让你在无需重建整个文件系统的情况下,轻松地管理磁盘空间。

逻辑卷管理布局

逻辑卷管理的核心在于如何处理安装在系统上的硬盘分区。在逻辑卷管理的世界里,物理硬盘的各个分区称作物理卷(physical volume,PV)。每个物理卷都会映射到硬盘上特定的物理分区。

多个物理卷集中在一起可以形成一个卷组(volume group,VG)。逻辑卷管理系统将卷组视为一个物理硬盘,但事实上卷组可能是由分布在多个物理硬盘上的多个物理分区组成的。卷组提供了一个创建逻辑分区的平台,而这些逻辑分区则包含了文件系统。

整个结构中的最后一层是逻辑卷(logical volume,LV)。逻辑卷基于卷组之上,为 Linux 提供了创建文件系统的分区环境,作用类似于到目前为止我们一直在探讨的 Linux 中的物理硬盘分区。Linux 系统将逻辑卷视为物理分区。

可以使用任意一种标准 Linux 文件系统来格式化逻辑卷,然后再将它加入 Linux 虚拟目录中的某个挂载点

卷组横跨多个不同的物理硬盘,覆盖了多个独立的物理分区。在卷组上层可有多个独立的逻辑卷。Linux 系统将每个逻辑卷视为一个物理分区。每个逻辑卷可以被格式化成 ext4 文件系统,然后挂载到虚拟目录中某个特定位置。

某个物理硬盘也可以有一些未使用的分区。通过逻辑卷管理,你随后可以轻松地将这个未使用分区分配到已有卷组:要么用它创建一个新的逻辑卷,要么在需要更多空间时用它来扩展已有的逻辑卷。

类似地,如果你给系统添加了一块硬盘,逻辑卷管理系统允许你将它添加到已有卷组,为某个已有的卷组创建更多空间,或是创建一个可用来挂载的新逻辑卷。这种扩展文件系统的方法要好用得多!

Linux 中的 LVM

Linux LVM 是由 Heinz Mauelshagen 开发的,于 1998 年发布到了 Linux 社区。它允许你在 Linux 上用简单的命令行命令管理一个完整的逻辑卷管理环境。

Linux LVM 有两个可用的版本。

  • LVM1: 最初的 LVM 包于 1998 年发布,只能用于 Linux 内核 2.4 版本。它仅提供了基本的逻辑卷管理功能。
  • LVM2: LVM 的更新版本,可用于 Linux 内核 2.6 版本。它在标准的 LVM 1 功能外提供了额外的功能。

大部分采用 2.6 或更高内核版本的现代 Linux 发行版都提供对 LVM 2 的支持。除了标准的逻辑卷管理功能外,LVM 2 还提供了另外一些好用的功能。

  1. 快照

最初的 Linux LVM 允许你在逻辑卷在线的状态下将其复制到另一个设备。这个功能叫作快照。在备份由于高可靠性需求而无法锁定的重要数据时,快照功能非常给力。传统的备份方法在将文件复制到备份媒体上时通常要将文件锁定。快照允许你在复制的同时,保证运行关键任务的 Web 服务器或数据库服务器继续工作。遗憾的是,LVM 1 只允许你创建只读快照。一旦创建了快照,就不能再写入东西了。
LVM 2 允许你创建在线逻辑卷的可读写快照。有了可读写的快照,就可以删除原先的逻辑卷,然后将快照作为替代挂载上。这个功能对快速故障转移或涉及修改数据的程序试验(如果失败,需要恢复修改过的数据)非常有用。

  1. 条带化

LVM 2 提供的另一个引人注目的功能是条带化(striping)。有了条带化,可跨多个物理硬盘创建逻辑卷。当 Linux LVM 将文件写入逻辑卷时,文件中的数据块会被分散到多个硬盘上。每个后继数据块会被写到下一个硬盘上。

条带化有助于提高硬盘的性能,因为 Linux 可以将一个文件的多个数据块同时写入多个硬盘,而无需等待单个硬盘移动读写磁头到多个不同位置。这个改进同样适用于读取顺序访问的文件,因为 LVM 可同时从多个硬盘读取数据。

LVM 条带化不同于 RAID 条带化。LVM 条带化不提供用来创建容错环境的校验信息。事实上,LVM 条带化会增加文件因硬盘故障而丢失的概率。单个硬盘故障可能会造成多个逻辑卷无法访问。

  1. 镜像

通过 LVM 安装文件系统并不意味着文件系统就不会再出问题。和物理分区一样,LVM 逻辑卷也容易受到断电和磁盘故障的影响。一旦文件系统损坏,就有可能再也无法恢复。

LVM 快照功能提供了一些安慰,你可以随时创建逻辑卷的备份副本,但对有些环境来说可能还不够。对于涉及大量数据变动的系统,比如数据库服务器,自上次刚刚快照之后可能又要新增存储成百上千条记录。

这个问题的一个解决办法就是 LVM 镜像。镜像是一个实时更新的逻辑卷的完整副本。当你创建镜像逻辑卷时,LVM 会将原始逻辑卷同步到镜像副本中。根据原始逻辑卷的大小,这可能需要一些时间才能完成。

一旦原始同步完成,LVM 会为文件系统的每次写操作执行两次写入,一次写入到主逻辑卷,一次写入到镜像副本。可以想到,这个过程会降低系统的写入性能。就算原始逻辑卷因为某些原因损坏了,你手头也已经有了一个完整的最新副本

使用 Linux LVM

现在你已经知道 Linux LVM 可以做什么了,本节将讨论如何创建 LVM 来帮助组织系统上的硬盘空间。Linux LVM 包只提供了命令行程序来创建和管理逻辑卷管理系统中所有组件。有些 Linux 发行版则包含了命令行命令对应的图形化前端,但为了完全控制你的 LVM 环境,最好习惯直接使用这些命令。

定义物理卷

创建过程的第一步就是将硬盘上的物理分区转换成 Linux LVM 使用的物理卷区段。这里可以直接使用 cfdisk 进行操作。类型中选择 Linux LVM 即可。

下一步是用分区来创建实际的物理卷。这可以通过 pvcreate 命令来完成。pvcreate 定义了用于物理卷的物理分区。它只是简单地将分区标记成 Linux LVM 系统中的分区而已。

如果下一步中的 pvcreate 命令不能正常工作,很可能是因为 LVM 2 软件包没有默认安装。可以使用软件包名 lvm2 进行安装

$ sudo pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created

如果你想查看创建情况的话,可以使用 pvdisplay 命令来显示已创建的物理卷列表。

$ sudo pvdisplay /dev/sdb1
"/dev/sdb1" is a new physical volume of "2.01 GiB"
--- NEW Physical volume ---
PV Name               /dev/sdb1
VG Name
PV Size               2.01 GiB
Allocatable           NO
PE Size               0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               0FIuq2-LBod-IOWt-8VeN-tglm-Q2ik-rGU2w7

pvdisplay 命令显示出/dev/sdb1 现在已经被标记为物理卷。注意,输出中的 VG Name 内容为空,因为物理卷还不属于某个卷组。

PE Size(physical extent):物理区域是物理卷中可用于分配的最小存储单元,物理区域大小在建立卷组时指定,一旦确定不能更改,同一卷组所有物理卷的物理区域大小需一致,新的 pv 加入到 vg 后,pe 的大小自动更改为 vg 中定义的 pe 大小。

创建卷组

下一步是从物理卷中创建一个或多个卷组。究竟要为系统创建多少卷组并没有既定的规则,你可以将所有的可用物理卷加到一个卷组,也可以结合不同的物理卷创建多个卷组。

$ sudo vgcreate Vol1 /dev/sdb1
  Volume group "Vol1" successfully created
$

输出结果平淡无奇。如果你想看看新创建的卷组的细节,可用 vgdisplay 命令。

$ sudo vgdisplay Vol1
--- Volume group ---
VG Name               Vol1
System ID
Format                lvm2
Metadata Areas        1
Metadata Sequence No  1
VG Access             read/write
VG Status             resizable
MAX LV                0
Cur LV                0
Open LV               0
Max PV                0
Cur PV                1
Act PV                1
VG Size               2.00 GiB
PE Size               4.00 MiB
Total PE              513
Alloc PE / Size       0 / 0
Free  PE / Size       513 / 2.00 GiB
VG UUID               oe4I7e-5RA9-G9ti-ANoI-QKLz-qkX4-58Wj6e

这个例子使用/dev/sdb1 分区上创建的物理卷,创建了一个名为 Vol1 的卷组。创建一个或多个卷组后,就可以创建逻辑卷了。

创建逻辑卷

Linux 系统使用逻辑卷来模拟物理分区,并在其中保存文件系统。Linux 系统会像处理物理分区一样处理逻辑卷,允许你定义逻辑卷中的文件系统,然后将文件系统挂载到虚拟目录上。

要创建逻辑卷,使用 lvcreate 命令。虽然你通常不需要在其他 Linux LVM 命令中使用命令行选项,但 lvcreate 命令要求至少输入一些选项。具体选项详见 man,大多数情况下你用到的只是少数几个选项。

$ sudo lvcreate -l 100%FREE -n lvtest Vol1
Logical volume "lvtest" created

如果想查看你创建的逻辑卷的详细情况,可用 lvdisplay 命令

$ sudo lvdisplay Vol1
--- Logical volume ---
LV Path                /dev/Vol1/lvtest
LV Name                lvtest
VG Name                Vol1
LV UUID                4W2369-pLXy-jWmb-lIFN-SMNX-xZnN-3KN208
LV Write Access        read/write
LV Creation host, time archlinux, 2021-02-02 13:23:03 +0800
LV Status              available
# open                 0
LV Size                2.00 GiB
Current LE             513
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           253:2

现在可以看到你刚刚创建的逻辑卷了!注意,卷组名(Vo l 1)用来标识创建新逻辑卷时要使用的卷组。
-l 选项定义了要为逻辑卷指定多少可用的卷组空间。注意,你可以按照卷组空闲空间的百分比来指定这个值。本例中为新逻辑卷使用了所有的空闲空间。
你可以用-l 选项来按可用空间的百分比来指定这个大小,或者用-L 选项以字节、千字节(KB)、兆字节(MB)或吉字节(GB)为单位来指定实际的大小。-n 选项允许你为逻辑卷指定一个名称(在本例中称作 lvtest)。

LE(logical extent):逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。

创建文件系统

运行完 lvcreate 命令之后,逻辑卷就已经产生了,但它还没有文件系统。你必须使用相应的命令行程序来创建所需要的文件系统

$ sudo mkfs.ext4 /dev/Vol1/lvtest

在创建了新的文件系统之后,可以用标准 Linux mount 命令将这个卷挂载到虚拟目录中,就跟它是物理分区一样。唯一的不同是你需要用特殊的路径来标识逻辑卷。

$ sudo mount /dev/Vol1/lvtest /mnt/my_partition

注意,mkfs.ext4 和 mount 命令中用到的路径都有点奇怪。路径中使用了卷组名和逻辑卷名,而不是物理分区路径。文件系统被挂载之后,就可以访问虚拟目录中的这块新区域了。

修改 LVM

Linux LVM 的好处在于能够动态修改文件系统,在 Linux 有一些工具允许你修改现有的逻辑卷管理配置。

如果你无法通过一个很炫的图形化界面来管理你的 Linux LVM 环境,也不是什么都干不了。在本章中你已经看到了一些 Linux LVM 命令行程序的实际用法。还有一些其他的常见命令可以用来管理 LVM 的设置。

  • vgchange 激活和禁用卷组
  • vgremove 删除卷组
  • vgextend 将物理卷加到卷组中
  • vgreduce 从卷组中删除物理卷
  • lvextend 增加逻辑卷的大小
  • lvreduce 减小逻辑卷的大小

通过使用这些命令行程序,就能完全控制你的 Linux LVM 环境。更详细的用法可使用 man 或 tldr 查看。

在手动增加或减小逻辑卷的大小时,要特别小心。逻辑卷中的文件系统需要手动修整来处理大小上的改变。大多数文件系统都包含了能够重新格式化文件系统的命令行程序,比如用于 ext2、ext3 和 ext4 文件系统的 resize2fs 程序。

posted on 2022-12-22 15:53  魏老师-正厚软件  阅读(309)  评论(0编辑  收藏  举报