在 Linux 中配置 RAID 和 LVM 存储

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

引言

在本实验中,你将学习如何在 Linux 环境中配置和管理高级存储解决方案。你将使用两个强大的工具:用于灵活卷管理的逻辑卷管理器 (LVM),以及用于软件驱动的独立磁盘冗余阵列 (RAID) 的 mdadm。本实验将通过命令行,利用 loop 设备模拟物理磁盘,为你提供设置健壮且可扩展存储基础设施的实践经验。

你将首先初始化 LVM 物理卷并创建一个卷组。接下来,你将创建、格式化、挂载和调整逻辑卷的大小,以了解其动态特性。然后,你将继续构建和挂载 RAID 1(镜像)阵列以实现数据冗余。最后,你将通过修改 /etc/fstabmdadm.conf 文件,确保这些存储配置在系统重启后依然有效。

使用 pvcreate 和 vgcreate 初始化 LVM

在此步骤中,你将开始使用逻辑卷管理器 (LVM)。LVM 是 Linux 上管理存储设备的一个强大工具。它在你的物理硬盘和文件系统之间增加了一个抽象层,允许进行更灵活的配置,例如动态调整卷的大小。

LVM 的基本构建块包括:

  • 物理卷 (Physical Volumes, PVs): 这是你的块设备,例如硬盘分区,或者在本例中,是模拟磁盘。
  • 卷组 (Volume Groups, VGs): 这是通过将一个或多个物理卷组合在一起创建的存储池。
  • 逻辑卷 (Logical Volumes, LVs): 这是你从卷组可用空间中创建的“虚拟分区”。你将在这些逻辑卷上创建文件系统。

首先,让我们确保已安装必要的工具 lvm2mdadm

sudo apt-get update && sudo apt-get install -y lvm2 mdadm

由于此环境中没有额外的物理硬盘,我们将使用 loop 设备来模拟它们。Loop 设备允许将文件视为块设备。让我们首先在你的项目目录中创建两个 256MB 的文件,它们将作为我们的磁盘映像。

truncate -s 256M disk1.img disk2.img

现在,验证文件是否已以正确的大小创建。

ls -lh

你应该会看到类似以下的输出:

total 0
-rw-r--r-- 1 labex labex 256M Jan 1 12:00 disk1.img
-rw-r--r-- 1 labex labex 256M Jan 1 12:00 disk2.img

接下来,将这些映像文件与 loop 设备关联起来。我们将使用 /dev/loop20/dev/loop21

sudo losetup /dev/loop20 disk1.img
sudo losetup /dev/loop21 disk2.img

现在我们有了“磁盘”(/dev/loop20/dev/loop21),我们可以使用 pvcreate 命令将它们初始化为 LVM 物理卷。

sudo pvcreate /dev/loop20 /dev/loop21

输出确认 PV 已成功创建:

  Physical volume "/dev/loop20" successfully created.
  Physical volume "/dev/loop21" successfully created.

你可以使用 pvs 显示物理卷的摘要,或使用 pvdisplay 获取更详细的视图。

sudo pvs
  PV           VG   Fmt  Attr PSize   PFree
  /dev/loop20       lvm2 ---  256.00m 256.00m
  /dev/loop21       lvm2 ---  256.00m 256.00m

在准备好物理卷后,下一步是创建一个名为 labvg 的卷组,它将组合两个 PV 的存储。我们将为此使用 vgcreate 命令。

sudo vgcreate labvg /dev/loop20 /dev/loop21

成功的输出将是:

  Volume group "labvg" successfully created

最后,让我们使用 vgs 查看摘要或 vgdisplay 查看详细信息来检查我们新的卷组。

sudo vgs

输出显示了我们的 labvg 组,其总大小约为 512MB(每个 PV 256MB)。

  VG    #PV #LV #SN Attr   VSize   VFree
  labvg   2   0   0 wz--n- 512.00m 512.00m

你现在已经成功地将两个设备初始化为物理卷,并将它们组合成一个卷组,为创建灵活的逻辑卷奠定了基础。

使用 lvcreate 和 mkfs 创建并挂载逻辑卷

在此步骤中,你将使用之前创建的卷组 labvg 来创建一个逻辑卷 (LV)。LV 是 LVM 中与分区相对应的概念。创建后,你可以用文件系统对其进行格式化并挂载,使其可用于存储数据。

首先,让我们从 labvg 存储池中创建一个名为 lablvm 的 200MB 逻辑卷。我们使用 lvcreate 命令,用 -L 标志指定大小,用 -n 标志指定名称。

sudo lvcreate -L 200M -n lablvm labvg

你将看到一条确认消息:

  Logical volume "lablvm" created.

现在你可以使用 lvs 命令查看你的新 LV,它提供了所有逻辑卷的摘要。

sudo lvs

输出将显示你在 labvg 组中的新 lablvm

  LV     VG    Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lablvm labvg -wi-a----- 200.00m

新创建的 LV,其设备路径为 /dev/labvg/lablvm,目前是一个未格式化的原始块设备。要在其上存储文件,你必须先创建一个文件系统。我们将使用 mkfs.ext4 命令将其格式化为常用的 ext4 文件系统。

sudo mkfs.ext4 /dev/labvg/lablvm

该命令将输出它创建的文件系统的详细信息:

mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 51200 4k blocks and 51200 inodes
Filesystem UUID: 28796151-bd37-4cae-a17f-071db8795919
Superblock backups stored on blocks:
        32768

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

接下来,你需要一个目录作为“挂载点”。这是一个空目录,逻辑卷的文件系统将在此目录中附加到主目录树。让我们在根目录下创建一个名为 /lablvm 的目录。

sudo mkdir /lablvm

最后,使用 mount 命令将你的逻辑卷 (/dev/labvg/lablvm) 上的文件系统挂载到挂载点 (/lablvm)。

sudo mount /dev/labvg/lablvm /lablvm

要确认卷已成功挂载并检查其可用空间,请使用 df -h(disk free, human-readable)命令。

df -h /lablvm

输出显示该设备已挂载,并且有大约 200MB 的可用空间。

Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/labvg-lablvm  172M   24K  158M   1% /lablvm

你现在已经成功创建、格式化并挂载了一个逻辑卷,使其准备好使用。

使用 lvresize 调整 LVM 逻辑卷大小

在此步骤中,你将探索 LVM 最强大的功能之一:在逻辑卷及其文件系统在线使用时调整它们大小的能力。这种灵活性比传统的静态分区具有显著优势。

首先,让我们使用 df -h 命令重新确认你已挂载的逻辑卷的当前大小。

df -h /lablvm

你将看到卷的大小约为 200MB。

Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/labvg-lablvm  194M  2.6M  179M   2% /lablvm

现在,假设你在 /lablvm 上运行的应用程序空间不足。你需要将其容量从 200MB 增加到 300MB。你可以使用 lvresize 命令来完成此操作。我们将使用 -r 标志,这非常重要,因为它告诉 lvresize 同时调整逻辑卷内包含的文件系统的大小。如果没有它,文件系统将保持其原始大小,新的空间将无法使用。

sudo lvresize -r -L 300M /dev/labvg/lablvm

输出显示逻辑卷和文件系统的大小都正在被调整。

  Size of logical volume labvg/lablvm changed from 200.00 MiB (50 extents) to 300.00 MiB (75 extents).
  Logical volume labvg/lablvm successfully resized.
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/mapper/labvg-lablvm is mounted on /lablvm; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/mapper/labvg-lablvm is now 76800 (4k) blocks long.

再次使用 df -h 检查磁盘空间以验证更改。

df -h /lablvm

卷现在的大小约为 300MB。

Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/labvg-lablvm  293M  2.6M  275M   1% /lablvm

有时,你不想设置新的绝对大小,而是想添加一定量的空间。你可以通过在大小前使用 + 号来实现。为了演示,我们将使用绝对大小的方法来确保可靠性。

sudo lvresize -r -L 400M /dev/labvg/lablvm

如果在调整大小操作期间遇到文件系统错误,请不要担心——这有时会发生在连续快速调整大小时。在这种情况下,你可以通过卸载文件系统、运行文件系统检查,然后重新挂载来恢复:

## 如果遇到文件系统错误,请运行以下恢复命令:
## sudo umount /lablvm
## sudo e2fsck -f /dev/labvg/lablvm
## sudo mount /dev/labvg/lablvm /lablvm

最后,再运行一次 df -h 来查看最终结果。

df -h /lablvm

卷现在的大小约为 400MB,并且你的 labvg 卷组中的可用空间也相应减少了。

Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/labvg-lablvm  392M  2.7M  369M   1% /lablvm

你现在已经成功地两次调整了一个正在运行的 LVM 卷的大小,展示了如何在不中断服务的情况下轻松管理存储分配。

使用 mdadm 构建并挂载 RAID 1 阵列

在此步骤中,你将把焦点从 LVM 转移到另一项强大的存储技术:RAID(Redundant Array of Independent Disks)。你将使用 mdadm 工具来创建一个 RAID 1 阵列,也称为镜像。在 RAID 1 配置中,数据会同时写入两个磁盘,从而提供冗余。如果一个磁盘发生故障,数据在另一个磁盘上仍然是安全的。

首先,我们需要为 RAID 阵列准备另外两个模拟磁盘。让我们在你的 ~/project 目录中创建两个新的 256MB 磁盘映像文件,disk3.imgdisk4.img

truncate -s 256M disk3.img disk4.img

接下来,将这些新映像文件与未使用的 loop 设备 /dev/loop22/dev/loop23 关联起来。

sudo losetup /dev/loop22 disk3.img
sudo losetup /dev/loop23 disk4.img

现在你已准备好构建 RAID 1 阵列。我们将使用 mdadm 命令,利用我们的两个 loop 设备创建一个名为 /dev/md0 的新 RAID 设备。

  • --create /dev/md0: 创建一个名为 /dev/md0 的新 RAID 设备。
  • --level=1: 指定 RAID 级别,在此情况下为 RAID 1(镜像)。
  • --raid-disks=2: 指定阵列将包含两个磁盘。
  • /dev/loop22 /dev/loop23: 阵列的组成设备。

执行以下命令:

sudo mdadm --create /dev/md0 --level=1 --raid-disks=2 /dev/loop22 /dev/loop23

系统会要求确认后再继续。键入 y 并按 Enter 继续。

mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

你可以通过查看 /proc/mdstat 文件来检查新 RAID 阵列的状态。

cat /proc/mdstat

输出显示 /dev/md0 正在运行,并使用了 /dev/loop23/dev/loop22。你可能还会看到阵列正在同步(resync),这是正常的。即使此过程完成,阵列也是可用的。

Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 loop13[1] loop12[0]
      261120 blocks super 1.2 [2/2] [UU]
      [>....................]  resync =  0.4% (1088/261120) finish=0.1min speed=21760K/sec

unused devices: <none>

就像 LVM 卷一样,新的 RAID 设备 /dev/md0 也需要一个文件系统。让我们用 ext4 来格式化它。

sudo mkfs.ext4 /dev/md0

接下来,为 RAID 阵列创建一个挂载点。

sudo mkdir /labraid

最后,将 RAID 设备挂载到新目录。

sudo mount /dev/md0 /labraid

使用 df -h 验证 RAID 阵列是否已正确挂载。

df -h /labraid

输出确认 /dev/md0 设备(总大小约为 256MB,因为它是镜像)已挂载并准备好使用。

Filesystem      Size  Used Avail Use% Mounted on
/dev/md0        249M  2.6M  234M   2% /labraid

你已成功创建并挂载了一个 RAID 1 阵列,为 /labraid 挂载点提供了数据冗余。

使用 /etc/fstab 和 mdadm.conf 持久化挂载和 RAID 配置

在此最后一步中,你将使你的 LVM 和 RAID 配置永久生效。当前,如果重启系统,RAID 阵列将不会自动重新组装,LVM 卷和 RAID 阵列也不会被挂载。要解决此问题,你需要更新两个关键配置文件:/etc/mdadm/mdadm.conf 用于 RAID 阵列,/etc/fstab 用于挂载点。

首先,我们来处理 RAID 阵列。系统需要在启动时知道如何重新组装 /dev/md0mdadm 工具可以为你生成必要的配置行。

运行以下命令来扫描活动阵列并打印其配置:

sudo mdadm --detail --scan

输出是一行描述你的阵列。

ARRAY /dev/md0 metadata=1.2 name=<hostname>:0 UUID=<some-uuid>

现在,我们将此配置追加到 mdadm 配置文件中,该文件位于 /etc/mdadm/mdadm.conf。我们将使用 tee 将扫描命令的输出直接通过管道传输到文件中。

sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf

你可以通过查看文件内容来验证该行是否已添加:

cat /etc/mdadm/mdadm.conf

接下来,你需要告诉系统在启动时自动挂载你的文件系统。这可以通过向 /etc/fstab(文件系统表)添加条目来完成。此文件中的每一行都定义了一个挂载点。

让我们先为你的 LVM 卷添加条目。我们将使用 echo 创建该行,并使用 tee -asudo 将其追加到 /etc/fstab

echo '/dev/labvg/lablvm /lablvm ext4 defaults 0 0' | sudo tee -a /etc/fstab

现在,为 RAID 阵列挂载点执行相同的操作。

echo '/dev/md0 /labraid ext4 defaults 0 0' | sudo tee -a /etc/fstab

你可以通过查看 /etc/fstab 文件的最后两行来检查是否已正确添加这两行。

tail -n 2 /etc/fstab

你应该会看到你刚刚添加的两行:

/dev/labvg/lablvm /lablvm ext4 defaults 0 0
/dev/md0 /labraid ext4 defaults 0 0

为了在不重启系统的情况下测试你的 /etc/fstab 条目是否正确,你可以卸载文件系统,然后使用 mount -a 命令,该命令会挂载 /etc/fstab 中列出的所有文件系统。

首先,卸载两个卷:

sudo umount /lablvm
sudo umount /labraid

现在,运行 mount -a 让系统读取 /etc/fstab 并挂载所有内容。

sudo mount -a

最后,使用 df -h 验证它们是否再次被挂载。

df -h /lablvm /labraid

输出应显示两个文件系统都已挂载,就像它们之前一样。

Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/labvg-lablvm  392M  2.7M  369M   1% /lablvm
/dev/md0                  249M  2.6M  234M   2% /labraid

恭喜!你已成功配置了你的系统,使其能够在启动时自动组装你的 RAID 阵列并挂载你的 LVM 和 RAID 文件系统。

总结

在此实验中,你学习了使用 LVM 和软件 RAID 进行 Linux 高级存储管理的基础知识。你首先使用 truncatelosetup 模拟物理磁盘,然后使用 pvcreate 将它们初始化为 LVM 物理卷(PV)。接着使用 vgcreate 将这些 PV 聚合到一个卷组(VG)中。从这个存储池中,你使用 lvcreate 创建了一个灵活的逻辑卷(LV),使用 mkfs 将其格式化为 ext4 文件系统,并将其挂载到系统。通过使用 lvresize 动态调整 LV 大小,并使用 resize2fs 扩展文件系统以利用新空间,演示了 LVM 的一个关键功能。

此外,你还使用 mdadm 工具配置了一个软件 RAID 1(镜像)阵列,以提供数据冗余。在从两个模拟磁盘构建阵列后,你以与 LVM 卷类似的方式对其进行了格式化和挂载。实验最后通过确保这些配置在重启后依然生效来完成。这通过将 LVM 卷和 RAID 阵列的挂载点添加到 /etc/fstab,并将 RAID 阵列的配置详细信息保存到 /etc/mdadm/mdadm.conf 来实现。