软件 RAID 上的 LVM

来自 ArchWiki

本文将提供一个关于如何在软件 RAID 之上使用逻辑卷管理器 (LVM) 安装和配置 Arch Linux 的示例。

提示: LVM 本身支持 RAID 配置中的逻辑卷。有关本文的替代方案,请参阅 LVM#RAID

简介

此文章或章节需要语言、wiki 语法或风格方面的改进。请参阅 Help:Style 以供参考。

原因: 本节应合并到简介中或重命名;Help:Style#前言或简介。(在 Talk:LVM on software RAID 中讨论)
警告: 请务必查看 RAID 文章,并注意所有适用的警告,特别是如果您选择 RAID5。

虽然 RAIDLVM 可能看起来是类似的技术,但它们各自都具有独特的功能。本文使用三个类似的 1TB SATA 硬盘驱动器作为示例。本文假设驱动器可以作为 /dev/sda/dev/sdb/dev/sdc 访问。

提示: 最佳实践是确保在执行安装时仅连接安装中涉及的驱动器。
LVM 逻辑卷 / /var /swap /home
LVM 卷组 /dev/VolGroupArray
RAID 阵列 /dev/md0 /dev/md1
物理分区 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sda2 /dev/sdb2 /dev/sdc2
硬盘驱动器 /dev/sda /dev/sdb /dev/sdc

交换空间

注意: 如果您想要额外的性能,只需让内核使用不同的交换分区,因为它默认情况下会进行条带化。

许多教程以不同的方式处理交换空间,要么创建单独的 RAID1 阵列,要么创建 LVM 逻辑卷。在单独的阵列上创建交换空间并非旨在提供额外的冗余,而是为了防止损坏的交换空间导致系统无法运行,当交换空间与根目录位于同一分区时,这种情况更有可能发生。

引导加载程序

本教程将使用 Syslinux 而不是 GRUB。当与 GPT 结合使用时,GRUB 需要额外的 BIOS 启动分区

当与 initramfs 结合使用时,GRUB 支持 mdadm 当前创建的默认元数据样式(即 1.2),initramfs 已在 Arch Linux 中被 mkinitcpio 取代。Syslinux 仅支持版本 1.0,因此需要 --metadata=1.0 选项。

某些引导加载程序(例如 GRUB LegacyLILO)不支持任何 1.x 元数据版本,而是需要旧版本 0.90。如果您想使用这些引导加载程序之一,请确保在 RAID 安装期间将选项 --metadata=0.90 添加到 /boot 阵列。

安装

获取最新的安装介质,并按照安装指南中的概述启动 Arch Linux 安装程序。

加载内核模块

加载 适当的 RAID(例如 raid0raid1raid5raid6raid10)和 LVM(即 dm-mod)模块。以下示例使用 RAID1 和 RAID5。

# modprobe raid1
# modprobe raid5
# modprobe dm-mod

准备硬盘

分区 每个硬盘驱动器,包括一个 1 GiB /boot 分区、一个 4 GiB /swap 分区和一个占用磁盘剩余空间的 / 分区。

启动分区必须是 RAID1;即它不能是条带化的(RAID0)或 RAID5、RAID6 等。这是因为 GRUB 没有 RAID 驱动程序。任何其他级别都会阻止您的系统启动。此外,如果一个启动分区出现问题,引导加载程序可以从 /boot 阵列中的其他两个分区正常启动。

注意: 确保在每个磁盘上创建完全相同的分区。如果将不同大小的分区组装在一起以创建 RAID 分区,它将起作用,但冗余分区将是最小分区大小的倍数,从而浪费未分配的空间。

RAID 安装

创建物理分区后,您就可以使用 mdadm 设置 /boot/swap/ 阵列了。它是一个用于 RAID 管理的高级工具,将用于在安装环境中创建 /etc/mdadm.conf

/dev/md0 创建 / 阵列

# mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sd[abc]3

/dev/md1 创建 /swap 阵列

# mdadm --create /dev/md1 --level=1 --raid-devices=3 /dev/sd[abc]2
注意
  • 如果您使用 RAID 的唯一原因是防止存储数据丢失(即,您不关心磁盘故障时某些正在运行的应用程序崩溃),那么没有理由对交换分区进行 RAID - 您可以将它们用作多个单独的交换分区。
  • 如果您计划安装不支持 1.x 版本 RAID 元数据的引导加载程序,请确保将 --metadata=0.90 选项添加到以下命令。

/dev/md2 创建 /boot 阵列

# mdadm --create /dev/md2 --level=1 --raid-devices=3 --metadata=1.0 /dev/sd[abc]1

同步

提示: 如果您想避免新硬盘驱动器的初始重新同步,请添加 --assume-clean 标志。

创建 RAID 卷后,它将同步阵列中物理分区的内容。您可以通过每秒刷新十次 /proc/mdstat 的输出来监控进度

# watch -n .1 cat /proc/mdstat

有关阵列的更多信息可通过以下方式访问

# mdadm --misc --detail /dev/md[012]

同步完成后,State 行应显示 clean。输出底部表格中的每个设备都应在 State 列中显示 spareactive syncactive sync 表示每个设备都在阵列中处于活动状态。

注意: 由于 RAID 同步对文件系统是透明的,因此您可以继续安装并在必要时重新启动计算机。

数据擦洗

定期运行数据擦洗以检查和修复错误是一种良好的做法。

注意: 根据阵列的大小/配置,擦洗可能需要数小时才能完成。

要启动数据擦洗

# echo check > /sys/block/md0/md/sync_action

与许多与 mdadm 相关的任务/项目一样,可以查询擦洗的状态

# cat /proc/mdstat

示例

$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1] 
md0 : active raid1 sdb1[0] sdc1[1]
      3906778112 blocks super 1.2 [2/2] [UU]
      [>....................]  check =  4.0% (158288320/3906778112) finish=386.5min speed=161604K/sec
      bitmap: 0/30 pages [0KB], 65536KB chunk

要安全地停止当前正在运行的数据擦洗

# echo idle > /sys/block/md0/md/sync_action

擦洗完成后,管理员可以检查有多少块(如果有)被标记为坏块

# cat /sys/block/md0/md/mismatch_cnt

检查操作扫描驱动器上的坏扇区和不匹配项。坏扇区会自动修复。如果发现不匹配项,即包含错误数据的良好扇区(扇区中的数据与来自另一个磁盘的数据指示的数据不一致,例如,奇偶校验块 + 其他数据块会让我们认为此数据块不正确),则不采取任何操作,但该事件会被记录(见下文)。这种“不作为”允许管理员检查扇区中的数据以及通过从冗余信息重建扇区而产生的数据,并选择要保留的正确数据。

关于数据擦洗的通用说明
注意: 用户也可以 echo repair/sys/block/md0/md/sync_action,但不建议这样做,因为如果遇到数据不匹配,它将自动更新为一致。危险在于我们真的不知道奇偶校验块或数据块哪个是正确的(或者在 RAID1 的情况下哪个数据块)。操作是否获得正确数据而不是错误数据取决于运气。

最好设置一个 root 用户的 cron 作业来安排定期擦洗。请参阅 raid-checkAUR,它可以帮助您完成此操作。

关于 RAID1 和 RAID10 数据擦洗的说明

由于 RAID1 和 RAID10 在内核中的写入是无缓冲的,因此即使阵列运行状况良好,阵列也可能具有非 0 不匹配计数。这些非 0 计数仅存在于瞬态数据区域中,在这些区域中它们不会造成问题。但是,由于我们无法区分仅存在于瞬态数据中的非 0 计数或表示实际问题的非 0 计数。这一事实是 RAID1 和 RAID10 阵列误报的来源。但是,仍然建议进行擦洗以捕获和纠正设备中可能存在的任何坏扇区。

LVM 安装

本节将把两个 RAID 转换为物理卷 (PV)。然后将这些 PV 组合成一个卷组 (VG)。然后,VG 将被划分为逻辑卷 (LV),这些逻辑卷将像物理分区一样工作(例如 //var/home)。如果您不理解这一点,请确保阅读 LVM 简介 部分。

创建物理卷

通过使用以下命令将 RAID 转换为物理卷 (PV),使 RAID 可供 LVM 访问。对上面创建的每个 RAID 阵列重复此操作。

# pvcreate /dev/md0
注意: 如果您在现有卷组上创建 PV,则可能会失败。如果是这样,您可能需要添加 -ff 选项。

使用以下命令确认 LVM 已添加 PV

# pvdisplay

创建卷组

下一步是在 PV 上创建卷组 (VG)。

使用第一个 PV 创建卷组 (VG)

# vgcreate VolGroupArray /dev/md0

使用以下命令确认 LVM 已添加 VG

# vgdisplay

创建逻辑卷

在此示例中,我们将创建单独的 //var/swap/home LV。LV 将可作为 /dev/VolGroupArray/<lvname> 访问。

创建 / LV

# lvcreate -L 20G VolGroupArray -n lvroot

创建 /var LV

# lvcreate -L 15G VolGroupArray -n lvvar
注意: 如果您想将交换空间添加到 LVM,请使用 -C y 选项创建一个连续分区的 /swap LV,以便您的交换空间不会跨越一个或多个磁盘或跨越不连续的物理扩展区
# lvcreate -C y -L 2G VolGroupArray -n lvswap

创建一个 /home LV,占用 VG 中剩余的空间

# lvcreate -l 100%FREE VolGroupArray -n lvhome

确认 LVM 已创建 LV,使用以下命令:

# lvdisplay
提示: 您可以从相对较小的逻辑卷开始,并在以后需要时扩展它们。为了简单起见,在卷组中保留一些可用空间,以便有扩展的空间。

更新 RAID 配置

由于安装程序使用目标系统中的 /etc/mdadm.conf 构建 initrd,您应该使用您的 RAID 配置更新该文件。原始文件可以直接删除,因为它包含关于如何正确填充它的注释,而 mdadm 可以自动为您完成。所以让我们删除原始文件,并让 mdadm 为您创建一个包含当前设置的新文件。

# mdadm --examine --scan >> /etc/mdadm.conf
注意: 阅读 更新配置文件 部分中的注释,关于确保您从安装程序内部写入正确的 mdadm.conf 文件。

准备硬盘

按照 #Installation 部分中概述的说明进行操作,直到您到达准备硬盘部分。跳过前两个步骤并导航到手动配置块设备、文件系统和挂载点页面。记住只配置 PV(例如 /dev/VolGroupArray/lvhome),而不是实际的磁盘(例如 /dev/sda1)。

警告: mkfs.xfs 不会为了最佳性能而对齐 chunk size 和 stripe size (参见:Optimum RAID)。

配置系统

警告: 在继续安装之前,请按照 Install Arch Linux on LVM#Adding mkinitcpio hooks 部分中的步骤操作。

mkinitcpio.conf

mkinitcpio 可以使用 hook 在启动时组装阵列。有关更多信息,请参阅 mkinitcpio 使用 RAID。在 /etc/mkinitcpio.conf 中的 HOOKS 数组中,在 udev 之后添加 mdadm_udevlvm2 hooks。

结论

完成后,您可以安全地重启您的机器。

# reboot

在备用启动驱动器上安装引导加载程序

首次成功启动新系统后,您将希望将引导加载程序安装到其他两个磁盘(如果您只有 2 个 HDD,则安装到另一个磁盘)上,以便在磁盘发生故障时,系统可以从任何剩余的驱动器启动(例如,通过在 BIOS 中切换启动顺序)。该方法取决于您使用的引导加载程序系统。

Syslinux

以 root 身份登录您的新系统并执行

# /usr/sbin/syslinux-install_update -iam
注意: 为了使其与 GPT 一起工作,需要 gptfdisk 软件包作为设置启动标志的后端。

Syslinux 将处理将引导加载程序安装到 RAID 阵列的每个成员的 MBR。

Detected RAID on /boot - installing Syslinux with --raid
Syslinux install successful
Attribute Legacy Bios Bootable Set - /dev/sda1
Attribute Legacy Bios Bootable Set - /dev/sdb1
Installed MBR (/usr/lib/syslinux/gptmbr.bin) to /dev/sda
Installed MBR (/usr/lib/syslinux/gptmbr.bin) to /dev/sdb

GRUB legacy

本文或本节正在考虑移除。

原因: 2024 年不应该再有人使用它。(在 Talk:LVM on software RAID 中讨论)

以 root 身份登录您的新系统并执行

# grub
grub> device (hd0) /dev/sdb
grub> root (hd0,0)
grub> setup (hd0)
grub> device (hd0) /dev/sdc
grub> root (hd0,0)
grub> setup (hd0)
grub> quit

存档您的文件系统分区方案

现在您已经完成,值得花一点时间存档每个驱动器的分区状态。这保证了在某个磁盘发生故障时,可以很容易地更换/重建磁盘。请参阅 fdisk#备份和恢复分区表

管理

有关如何维护您的软件 RAID 或 LVM 的更多信息,请查看 RAIDLVM 文章。

参见