背景
我运行的是 Centos 7。最初,它在单个磁盘上运行,如下所示:
1 200M EFI System (/boot/efi)
2 500M Microsoft basic (/boot)
3 465.1G Linux LVM
LVM VG centos
- LVM LV ext4 centos-root (/)
- LVM LV swap centos-swap (swap)
这只是一个临时解决方案,因为它最初应该安装在 Linux 软件 RAID1 阵列上。我今天抽出时间来迁移它。这是目前的样子:
Both new disks have this partition layout:
1 200M EFI System (/boot/efi)
2 457.6G Linux RAID /dev/md0 RAID1 (for boot and LVM)
3 8G Linux RAID /dev/md1 RAID0 (so 16GB total, for swap)
/dev/md0 looks like this:
1 500M Linux filesystem (/boot)
2 457G Linux LVM (centos-root is migrated to this)
LVM now has only one LV, centos-root
/etc/mdadm.conf
看起来像这样:
ARRAY /dev/md0 level=raid1 num-devices=2 metadata=1.2 name=main.centos.local:0 UUID=5b5057b4:4235ba4b:5342dfda:acf63302
devices=/dev/sda2,/dev/sdb2
ARRAY /dev/md1 level=raid0 num-devices=2 metadata=1.2 name=main.centos.local:1 UUID=f82a8c99:9b391d83:4efc9456:9e9bad98
devices=/dev/sda3,/dev/sdb3
/etc/fstab
看起来像这样:
/dev/mapper/centos-root / xfs defaults 0 0
UUID=fcb5f82f-ce6b-460b-800f-329e010bc403 /boot xfs defaults 0 0
UUID=C532-14AE /boot/efi vfat umask=0077,shortname=winnt 0 0
/dev/md1 swap swap defaults 0 0
blkid
输出此(仅限相关条目):
/dev/sdb1: SEC_TYPE="msdos" UUID="C532-14AE" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="ed301bbd-c15c-40af-ae75-bf238d0e6270"
/dev/sda1: SEC_TYPE="msdos" UUID="C532-14AE" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="f3a76412-41a0-4e04-9b04-ad1c159133cf"
/dev/md0p1: LABEL="boot" UUID="fcb5f82f-ce6b-460b-800f-329e010bc403" TYPE="xfs" PARTLABEL="primary" PARTUUID="df8d6481-c6ce-423a-b5d5-205d355e5653"
/dev/md0p2: UUID="7LfywM-oPHy-MTEt-swlI-EVbZ-opTo-m82E6R" TYPE="LVM2_member" PARTLABEL="primary" PARTUUID="19e7f9d5-a955-4036-8338-03a748faa1f6"
/dev/mapper/centos-root: UUID="deaa9788-b487-4991-adf7-2945788fb6cd" TYPE="xfs"
我有一个脚本,可以自动将其他 EFI 分区挂载到/boot/efi_[device]
,当内核更新时,grub.cfg 会被复制到该分区以保持所有内容同步。
/dev/sda1
并/dev/sdb1
通过脚本保持同步(我已经验证了这一点),因此 fstab 安装其中任何一个都不应该成为问题/boot/efi
(这也意味着如果一个驱动器由于故障而被删除,系统仍然保证启动)。我本可以在 LV 中放置交换区来简化事情,但 RAID0 可以获得更好的性能(就其价值而言),并且我获得了额外的 16GB 空间。
我使用以下命令将 LV 从旧驱动器迁移到新 PV:
pvcreate /dev/md0p2
vgextend centos /dev/md0p2
pvmove /dev/sdg3
vgreduce centos /dev/sdg3
dracut
然后我用(备份原始文件后)重新生成了initramfs ,最后重新生成了grub.cfg。之后,我安装了新/boot
分区/boot/efi
并复制了所有内容。
问题
断开旧驱动器并启动后,dracut 无法找到我的 RAID 阵列,当然/boot
也找不到分区和 LVG。看起来它根本就没有mdadm --assemble
调用/dev/md0
和/dev/md
。我可以从dracut
提示符中执行此操作,然后lvm_scan
找到我的 LVG,我可以链接/dev/centos/root
到/dev/root
,并且一旦退出提示符,系统就会继续启动,没有任何问题。一切似乎都在它应该在的地方。
有一个可用的内核更新,所以我尝试安装它(假设我第一次在重新生成 initramfs 和 grub.cfg 文件时搞砸了一些东西),但没有成功。系统仍然以完全相同的方式失败。当我手动从任一 EFI 分区启动时,情况就是如此(因为两者是相同的,所以应该如此)。
链接到 Pastebin 上的 rdsosreport.txt
我在这里缺少什么?如何让 dracut 组装我的阵列?
答案1
dracut 文档暗示任何 md raid 阵列都应自动组装,并且rd.md.uuid
仅当您只想将某些阵列组装为引导过程的一部分时才应使用该参数。
看起来实际上数组不会自动组装,实际上只有在rd.md.uuid
设置参数时才组装(对于每个需要组装的数组)。可能是因为rd.lvm.lv
参数已经设置,所以它以某种方式干扰了md
,但我没有时间来测试它。
简而言之,将rd.md.uuid
两个数组的参数添加到GRUB_CMDLINE_LINUX
中的变量中/etc/default/grub
,然后重新生成 grub 配置解决了我的问题。
答案2
rd.md=1
将和rd.md.conf=1
和rd.auto=1
参数添加到GRUB_CMDLINE_LINUX
中的变量/etc/default/grub
,然后重新生成 grub 配置修复了我的类似问题。这些参数默认为零(dracut.cmdline
文档没有明确说明,但确实如此)。
当然,rd.md.uuid
单独添加也可以,因为这会显式启动所需的数组。但我比较懒,更喜欢通用的参数。该rd.md.uuid
版本的优点是只有所需的阵列在引导时启动。
答案3
我用这个mdadm RAID CentOS 启动指南我觉得关于这个主题有很多缺失的信息。
除了显而易见的步骤之外,解决我的启动问题的还有两个步骤。 1.) 我将 rd.auto=1 添加到 /etc/default/grub 并更新 grub.cfg grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg 2.) 我必须像这样重建我的 initramfs : dracut --add="mdraid" /boot/initramfs-3.10.0-1127.13.1.el7.x86_64.img 3.10.0-1127.13.1.el7.x86_64 --force
之后我就可以启动了,但不要忘记编辑 dracut.conf 以添加 mdraid,以便所有未来的内核都将其内置。