在 Linux 中配置 RAID 和 LVM 存储

CompTIABeginner
立即练习

介绍

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

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

这是一个引导式实验,提供了逐步指导以帮助你学习和练习。请仔细遵循说明完成每个步骤并获取实践经验。历史数据表明,这是一个初学者级别的实验,完成率为 88%。它在学习者中获得了 99% 的好评率。

使用 pvcreate 和 vgcreate 初始化 LVM

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

LVM 的基本组成单元包括:

  • 物理卷(PV): 这些是你的块设备,例如硬盘分区,或者在本实验中模拟的磁盘。
  • 卷组(VG): 这是通过将一个或多个物理卷组合在一起而创建的存储池。
  • 逻辑卷(LV): 这些是从卷组的可用空间中创建的「虚拟分区」。你将在这些逻辑卷上创建文件系统。

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

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

由于在此实验环境中没有多余的物理硬盘,我们将使用回环设备进行模拟。回环设备允许将文件视为块设备。首先在你的项目目录中创建两个 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

接下来,将这些镜像文件与回环设备关联。我们将使用 /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

输出确认物理卷已成功创建:

  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 的卷组,将两个物理卷的存储空间合并。我们将为此使用 vgcreate 命令。

sudo vgcreate labvg /dev/loop20 /dev/loop21

成功的输出将是:

  Volume group "labvg" successfully created

最后,让我们检查新创建的卷组,使用 vgs 查看摘要或 vgdisplay 查看详情。

sudo vgs

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

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

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

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

在这一步中,你将使用之前创建的卷组 labvg 来创建一个逻辑卷(LV)。逻辑卷在 LVM 中相当于分区。创建完成后,你可以为其格式化文件系统并进行挂载,使其可以用于存储数据。

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

sudo lvcreate -L 200M -n lablvm labvg

你会看到一条确认消息:

  Logical volume "lablvm" created.

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

sudo lvs

输出将显示 labvg 组中新创建的 lablvm

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

新的逻辑卷可以通过设备路径 /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(查看磁盘空闲情况,以易读格式显示)命令。

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

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

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(冗余磁盘阵列)。你将使用 mdadm 工具创建一个 RAID 1 阵列,也称为镜像。在 RAID 1 配置中,数据会同步写入两块磁盘,从而提供冗余。如果其中一块磁盘损坏,数据在另一块磁盘上依然安全。

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

truncate -s 256M disk3.img disk4.img

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

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

现在你已经准备好构建 RAID 1 阵列了。我们将使用 mdadm 命令,利用这两个回环设备创建一个名为 /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 并按回车键继续。

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 阵列也都不会被挂载。为了解决这个问题,你需要更新两个关键的配置文件:用于 RAID 阵列的 /etc/mdadm/mdadm.conf 和用于挂载点的 /etc/fstab

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

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

sudo mdadm --detail --scan

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

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

现在,让我们将此配置追加到位于 /etc/mdadm/mdadm.confmdadm 配置文件中。我们将使用 tee 将扫描命令的输出直接写入文件。

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

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

cat /etc/mdadm/mdadm.conf

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

让我们先为 LVM 卷添加条目。我们将使用 echo 创建该行,并使用 sudo tee -a 将其追加到 /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 文件系统。

总结

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

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