软件 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。GRUB 与 GPT 结合使用时,需要额外的 BIOS 启动分区

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

某些引导加载程序(例如 GRUB Legacy, LILO)不支持任何 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 分区以及一个占用磁盘剩余空间的 / 分区。

boot 分区必须是 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]

同步完成后,“状态”行应显示“clean”。输出底部表格中的每个设备在“状态”列中应显示“spare”或“active sync”。“active 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

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

关于擦洗的通用说明
注意: 用户也可以选择将 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

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

# 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章节中概述的指示进行操作,直到您到达Prepare Hard Drive章节。跳过前两个步骤,并导航到手动配置块设备、文件系统和挂载点页面。请记住仅配置 PV(例如 /dev/VolGroupArray/lvhome),而不是实际磁盘(例如 /dev/sda1)。

警告: mkfs.xfs 将不会对齐块大小和条带大小以获得最佳性能(参见: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 文章。

参见