软件 RAID 上的 LVM
本文将提供一个示例,说明如何在软件 RAID 之上安装和配置带有逻辑卷管理器 (LVM) 的 Arch Linux。
简介
虽然 RAID 和 LVM 可能看起来是类似的技术,但它们各自呈现出独特的功能。本文使用三个类似的 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(例如 raid0
、raid1
、raid5
、raid6
、raid10
)和 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 安装
创建物理分区后,您就可以使用 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”表示每个设备都在阵列中处于活动状态。
擦洗
定期运行数据擦洗以检查和修复错误是一个好习惯。
要启动数据擦洗
# 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
-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
-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)。配置系统
mkinitcpio.conf
mkinitcpio 可以使用 hook 在启动时组装阵列。有关更多信息,请参见 mkinitcpio 使用 RAID。在 /etc/mkinitcpio.conf
中的 HOOKS
数组中,在 udev
之后添加 mdadm_udev
和 lvm2
hooks。
结论
完成后,您可以安全地重启您的机器
# reboot
在备用启动驱动器上安装引导加载程序
首次成功启动新系统后,您需要将引导加载程序安装到其他两个磁盘(或者如果您只有 2 个 HDD,则安装到另一个磁盘)上,以便在发生磁盘故障时,可以从任何剩余的驱动器启动系统(例如,通过在 BIOS 中切换启动顺序)。该方法取决于您使用的引导加载程序系统
Syslinux
以 root 身份登录您的新系统并执行以下操作
# /usr/sbin/syslinux-install_update -iam
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
以 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 的更多信息,请查看 RAID 和 LVM 文章。
参见
- LVM on RAID 还是 RAID on LVM 哪个更好? 在 Server Fault 上
- 使用 Linux 管理 RAID 和 LVM (v0.5),作者:Gregory Gulik
- 2011-09-08 - Arch Linux - LVM & RAID (1.2 元数据) + SYSLINUX
- 2011-04-20 - Arch Linux - 软件 RAID 和 LVM 问题
- 2011-03-12 - Arch Linux - 关于安装、LVM、grub、RAID 的一些新手问题