使用 Fake RAID 安装 Arch Linux
本指南的目的是允许使用板载 BIOS RAID 控制器创建的 RAID 组,从而允许使用 GRUB 从 RAID 组 **内部** 的分区双启动 Linux 和 Windows。在使用所谓的“Fake RAID”或“Host RAID”时,磁盘组通过 /dev/mapper/chipsetName_randomName 访问,而不是 /dev/sdX。
什么是“Fake RAID”
- 基于操作系统的 RAID 并不总是能保护引导过程,并且在 Windows 桌面版本上通常不实用。硬件 RAID 控制器价格昂贵且专有。为了填补这一空白,引入了廉价的“RAID 控制器”,它们不包含 RAID 控制器芯片,而只是一个带有特殊固件和驱动程序的标准磁盘控制器芯片。在引导的早期阶段,RAID 由固件实现。当加载了 Linux 或 Microsoft Windows 最新版本等受保护模式操作系统内核时,驱动程序就会接管。
- 这些控制器被制造商称为 RAID 控制器,但很少向购买者明确说明 RAID 处理的负担是由主机中央处理单元承担——而不是 RAID 控制器本身——从而引入了硬件控制器不会遇到的 CPU 开销。固件控制器通常只能在其 RAID 阵列中使用特定类型的硬盘(例如,Intel Matrix RAID 的 SATA,因为现代 Intel ICH 南桥不支持 SCSI 或 PATA;但是,主板制造商会在某些主板上将 RAID 控制器实现到南桥之外)。在此之前,“RAID 控制器”意味着控制器执行处理,而这种新类型在技术上知识渊博的圈子里被称为“Fake RAID”,即使 RAID 本身是正确实现的。Adaptec 将其称为“Host RAID”。
另请参阅 Ubuntu 文档社区的 FakeRaidHowto 获取更多信息。
尽管存在术语上的差异,“fake RAID”(伪 RAID)通过 dmraid 实现,但它是一个健壮的软件 RAID 实现,它提供了一个可靠的系统,可以在多个磁盘之间镜像或条带化数据,并且对任何现代系统来说开销都可以忽略不计。dmraid 与 mdadm(纯 Linux 软件 RAID)相当,但它有一个额外的优势,即能够在驱动器发生故障**之前**完全重建驱动器。然而,请注意,并非所有 BIOS RAID 实现都支持驱动器重建。相反,它们依赖非 Linux 软件来执行重建。如果您的系统无法在 BIOS RAID 设置实用程序中重建驱动器,强烈建议您使用 mdraid(通过 mdadm 实现的纯 Linux 软件 RAID - 请参阅 RAID)而不是 dmraid,否则在驱动器发生故障时您将无法重建阵列,或者在主板发生故障时无法从阵列中检索信息,除非进行大量额外的工作。
准备工作
- 在另一台机器上打开任何需要的指南(安装指南)。如果您无法访问另一台机器,请将其打印出来。
- 下载最新的 Arch Linux 安装镜像。
- 备份所有重要文件,因为目标分区上的所有内容都将被销毁。
配置 RAID 组
- 进入 BIOS 设置并启用 RAID 控制器。
- BIOS 可能包含一个选项,将 SATA 驱动器配置为“IDE”、“AHCI”或“RAID”;请确保选择了“RAID”。
- 保存并退出 BIOS 设置。在启动过程中,进入 RAID 设置实用程序。
- RAID 实用程序通常可以通过启动菜单(通常是 F8、F10 或 CTRL+I)或在 RAID 控制器初始化时访问。
- 使用 RAID 设置实用程序创建首选的条带/镜像集。
启动安装程序
有关详细信息,请参阅 Installation guide#Pre-installation。
使用 mdadm 和 Intel FakeRAID 的 MBR 安装示例
之所以在此处添加此内容,是因为我花了数小时才使其正常工作,因为网上有很多关于不同方法的不同信息,还有过时的信息。它可能需要更好地整合到本页面中并提供更多解释,但我目前要结束它。这是一个基本的命令行转储,显示了使用 MBR 分区结构成功设置 RAID。
看起来一旦你在 Intel 实用程序中创建了阵列,它就会写入 RAID 元数据。因此,组装/创建阵列不需要发生。我在 Intel 实用程序中将我的阵列命名为 ZERO,您可以在此示例中看到它。
我将整个安装示例保留原样,因为它显示了在安装过程中何时配置各项。您需要修改一些内容才能使其正常工作,请不要直接复制粘贴!
# ls /dev/md/ # parted /dev/md/ZERO_0 # mklabel msdos # mkpart primary ext4 1MiB 100MiB # set 1 boot on # mkpart primary ext4 100MiB 16.5GiB # mkpart primary linux-swap 16.5GiB 100%
仅用于查看更改
# fdisk -l /dev/md/ZERO_0
创建文件系统/swap 并激活 swap
# mkfs.ext4 /dev/md/ZERO_0p1 # mkfs.ext4 /dev/md/ZERO_0p2 # mkswap /dev/md/ZERO_0p3 # swapon /dev/md/ZERO_0p3 # mount /dev/md/ZERO_0p2 /mnt # mkdir /mnt/boot # mount /dev/md/ZERO_0p1 /mnt/boot/
编辑 /etc/pacman.conf 并为 x64 取消注释 multilib(为什么不)(在 chroot 后也这样做)。然后
# pacstrap -K -i /mnt base base-devel # genfstab -U /mnt > /mnt/etc/fstab
编辑 /mnt/etc/fstab 并将 UUID 替换为(这可能是可选的)
/dev/md/ZERO_0p1 /dev/md/ZERO_0p2 /dev/md/ZERO_0p3
然后运行:
# mdadm --detail --scan >> /mnt/etc/mdadm.conf
Chroot 进入进行配置
# arch-chroot /mnt /bin/bash
编辑 /etc/locale.gen 并取消注释 en_US.UTF-8 UTF-8 和其他所需的 UTF-8 区域设置。运行以下命令生成区域设置:
# locale-gen
创建 locale.conf(5) 文件,并相应地设置 LANG 变量:
/etc/locale.conf
LANG=en_US.UTF-8
设置 时区
# ln -sf /usr/share/zoneinfo/Region/City /etc/localtime
安装 grub。 编辑 /etc/default/grub 并取消注释 GRUB_DISABLE_LINUX_UUID=true
将 mdadm_udev 添加到 /etc/mkinitcpio.conf 的 HOOKS 数组中
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block mdadm_udev filesystems fsck)
# grub-install --recheck /dev/md/ZERO_0 # grub-mkconfig -o /boot/grub/grub.cfg
/etc/hostname
yourhostname
相应地更新 /etc/hosts 文件。然后
# systemctl enable dhcpcd@enp13s0.service # exit # umount -R /mnt # reboot
移除安装介质。
加载 dmraid
加载设备映射器并查找 RAID 组
# modprobe dm_mod # dmraid -ay # ls -la /dev/mapper/
dmraid -ay 在启动到 Arch Linux Release: 2011.08.19 后可能会失败,因为初始 RAM 磁盘环境的镜像文件不支持 dmraid。您可以使用旧版本 Release: 2010.05。请注意,在安装后您必须在 grub 的 menu.lst 中更正您的内核名称和 initramfs 名称,因为这些版本使用不同的命名方式。示例输出
/dev/mapper/control <- Created by device-mapper; if present, device-mapper is likely functioning /dev/mapper/sil_aiageicechah <- A RAID set on a Silicon Image SATA RAID controller /dev/mapper/sil_aiageicechah1 <- First partition on this RAID set
如果只有一个文件(/dev/mapper/control),请使用 lsmod 检查您的控制器芯片组模块是否已加载。如果已加载,则 dmraid 不支持此控制器,或者系统上没有 RAID 组(请再次检查 RAID BIOS 设置)。如果正确,那么您可能被迫使用 软件 RAID(这意味着在此控制器上无法实现双启动 RAID 系统)。
如果您的芯片组模块**未**加载,请立即加载。例如
# modprobe sata_sil
有关可用驱动程序,请参阅 /lib/modules/`uname -r`/kernel/drivers/ata/。
测试 RAID 组
# dmraid -tay
安装引导加载程序
GRUB2
有关配置 GRUB2 的详细信息,请参阅 GRUB2。grub-bios 对 dm-raid 分区开箱即用。
$ grub-install --target=i386-pc --recheck --debug /dev/mapper/sil_aiageicechah
GRUB_DISABLE_LINUX_UUID=true,grub2 将生成带有 root=UUID=... 的行,这会导致挂载镜像 RAID 1 阵列的一侧。如果您有其他操作系统(如 Windows),可以(可选)安装 os-prober。
$ grub-mkconfig -o /boot/grub/grub.cfg
就是这样,grub-mkconfig 将自动生成配置。您可以在 grub-mkconfig 之前编辑 /etc/default/grub 来修改配置(超时、颜色等)。
故障排除
降级阵列启动
Fake RAID 方法在 GNU/Linux 上有一个缺点,即 dmraid 目前无法处理降级阵列,并且将拒绝激活。在这种情况下,必须从另一个操作系统(例如 Windows)内部或通过 BIOS/芯片组 RAID 实用程序解决问题。
或者,如果使用镜像(RAID 1)阵列,用户可以暂时在启动过程中绕过 dmraid 并从单个驱动器启动。
- 编辑 GRUB 菜单中的**内核**行。
- 删除对 dmraid 设备(例如,将
/dev/mapper/raidSet1更改为/dev/sda1)的引用。 - 将
disablehooks=dmraid追加到内核参数中,以防止 dmraid 检测到降级阵列时发生内核恐慌。
- 删除对 dmraid 设备(例如,将
- 启动系统
错误:无法确定根设备的主/次设备号
如果在内核更新后遇到引导失败,并且引导过程无法确定根设备的主/次设备号,这可能只是一个计时问题(即 dmraid -ay 可能在 /dev/sd* 完全设置和检测到之前就被调用)。这会影响正常和 LTS 内核镜像。启动“Fallback”内核镜像应该可以工作。错误看起来会像这样:
Activating dmraid arrays... no block devices found Waiting 10 seconds for device /dev/mapper/nvidia_baaccajap5 Root device '/dev/mapper/nvidia_baaccajap5' doesn't exist attempting to create it. Error: Unable to determine major/minor number of root device '/dev/mapper/nvidia_baaccajap5'
为了解决这个问题
- 启动 Fallback 内核
- 在
/etc/mkinitcpio.conf的HOOKS数组中,将sleephook 放在udevhook 之后,如下所示:
HOOKS=(base udev sleep autodetect microcode modconf kms keyboard keymap consolefont block dmraid filesystems fsck)
- 重新生成内核镜像并重启
dmraid 镜像激活失败
以上所有内容第一次都能正常工作,但重启后 dmraid 找不到阵列了吗?
这是因为 Linux 软件 RAID(mdadm)在系统初始化过程中已尝试挂载 fakeraid 阵列,并将其置于无法卸载的状态。为了防止 mdadm 运行,请将负责的 udev 规则移开。
# cd /lib/udev/rules.d # mkdir disabled # mv 64-md-raid.rules disabled/ # reboot
现有 RAID 阵列上的分区没有块设备
如果您的现有阵列(在尝试安装 Arch 之前设置)出现在 /dev/mapper/raidnamehere 中,但没有分区(例如 raidnamehere1),请重新检查 RAID 分区的状态。
如果在其他操作系统中可以工作的分区存在某些(即使是微小的)问题,Arch 可能不会为这些分区创建块设备。
gparted 可用于诊断和修复大多数问题。不幸的是,您可能需要从头开始重新分区。