![尝试从 MBR 移动到 GPT raid1,但 grub 无法启动](https://linux22.com/image/912211/%E5%B0%9D%E8%AF%95%E4%BB%8E%20MBR%20%E7%A7%BB%E5%8A%A8%E5%88%B0%20GPT%20raid1%EF%BC%8C%E4%BD%86%20grub%20%E6%97%A0%E6%B3%95%E5%90%AF%E5%8A%A8.png)
我有 mdadm raid1 作为启动/根驱动器。磁盘已分区为 MBR,我可以启动 Ubuntu 18.04
其中一个驱动器出现故障,我将其替换为一个 4TB 驱动器,并想切换到 GPT,以便以后可以扩大阵列。
新驱动器采用 GPT 分区:
Number Start End Size File system Name Flags
1 1049kB 2097kB 1049kB BIOS boot partition bios_grub
2 2097kB 4001GB 4001GB Linux RAID raid
旧驱动器仍为 MBR:
Number Start End Size Type File system Flags
1 1049kB 1000GB 1000GB primary boot, raid
我在新的 GPT 驱动器上运行了 grub-install,并且没有出现任何错误,但我无法从该驱动器启动。
接下来我运行了启动修复,并能够通过 BIOS 启动新的 GPT 驱动器,但是仅有的当镜子存在的时候。
当我移除 MBR 磁盘并从 GPT 磁盘启动时,我得到了相同的 grub 救援模式提示,但它找不到我的启动/根 lvm。但从救援模式运行 ls 会列出不同 mbr 磁盘上的其他 raid lvm。
我的 grub.cfg 有:set root='lvmid/xxxx'
lvmid/xxx 是 grub 找不到的。lvmid 对于 /dev/mapper/boot 是正确的
blkid 输出:
/dev/mapper/bootdisk-boot: UUID="f13dfe22-a31e-413e-a587-af3f68b82913" TYPE="ext4"
/dev/mapper/bootdisk-data: UUID="702554d1-1113-4aba-bdc0-5db182287343" TYPE="ext4"
/dev/mapper/bootdisk-root: UUID="5b4bc8f5-dc1c-4850-9404-22be00669e23" TYPE="ext4"
/dev/mapper/datavg-datalv: UUID="b6c2eeb5-e868-4b93-89f8-d056f4a43202" TYPE="ext4"
/dev/sda1: PARTLABEL="BIOS boot partition" PARTUUID="a513db1e-893a-4e58-b31f-b848b7adec09"
/dev/sda2: UUID="96535c2c-f839-8d5d-f055-7396b19a6914" UUID_SUB="9a164f93-31ab-e8fc-091b-f95e91e2dfa1" LABEL="bootdisknew:0" TYPE="linux_raid_member" PARTLABEL="Linux RAID" PARTUUID="387427c6-8e47-4c39-8d98-fc1a096164f1"
/dev/sdc1: UUID="96535c2c-f839-8d5d-f055-7396b19a6914" UUID_SUB="2fddbf50-6d71-8724-c8e7-afa45ff686ea" LABEL="bootdisknew:0" TYPE="linux_raid_member" PARTUUID="a5d01761-01"
答案1
固定的。天啊真是痛苦。
简短回答:通过启动修复和选择 ATA 磁盘支持进行修复
长答案:使用 GPT 将软件 RAID1 替换/升级为更大的驱动器是可行的,但比较棘手。
第一步:为您的系统制作一个可启动的 USB。不是救援/livecd - 您可能无论如何都想要一个,但请确保您自己的系统可以从 USB 启动。SystemrescueCD 启动了我的系统并以某种方式降级了另一个镜像,所以要小心。
选修的:我使用相同的 MBR RAID1/LVM 创建了 18.0.4 系统的虚拟盒模型来测试所有内容。我确认 grub-install 存在一些问题,所以这是值得的。
可启动 USB:我使用 YUMI/Multiboot 并将我的内核和 initrd 复制到 USB /boot 并编辑 /multiboot/syslinux.cfg 以添加:
label Mysystem
menu label Mysystem
MENU INDENT 1
KERNEL /boot/vmlinuz-4.15.0-47-generic
APPEND ro noapic root=/dev/mapper/system-root
INITRD /boot/initrd.img-4.15.0-47-generic
引导修复
- 您可以尝试默认修复。
- 请注意,清除 grub 将删除 /etc/default/grub。如果使用 Ubuntu 默认设置,我的系统将出现内核恐慌。此外,默认的 Ubuntu grub.cfg 会隐藏重要的启动消息。尝试启动修复几次后,我放弃了清除 GRUB 并使用了高级选项
- 我的系统最终需要 ATA 磁盘支持
将 MBR 转换为 GPT
这假设您有备份或您确定在转换过程中不会出现驱动器故障。破坏镜像并重新分区是破坏性的,因此您将在一段时间内依赖一个驱动器。重建镜像可能会给旧驱动器带来压力,因此请注意。
我有另一个驱动器/镜像作为备份,以防需要恢复。
您要转换的驱动器发生故障:
mdadm /dev/md0 --fail /dev/sdb1
mdadm /dev/md0 -r /dev/sdb1
使用 gdisk 创建新的 GPT 分区。您需要一个 1 MB 的 bios-boot 来启动 grub。我添加了一个 EFI 分区,以防我将驱动器移至新系统。驱动器的其余部分分配给 RAID,然后添加回 /dev/md0。在新驱动器上创建更大的 RAID 分区是可以的。原始 /dev/md0 将保持不变,直到您将其扩大。
after gdisk:
Number Start (sector) End (sector) Size Code Name
1 2048 4095 1024.0 KiB EF02 BIOS boot partition
2 4096 208895 100.0 MiB EF00 EFI System
3 208896 7814037134 3.6 TiB FD00 Linux RAID
我遇到了 grub-install 失败的问题,并且 boot-repair 也没有修复或者发出抱怨(即使在清除 grub 之后)。
清除 bios-boot 分区似乎可以修复 grub-install。确保它是正确的驱动器/分区!
dd if=/dev/zero of=/dev/sdb1
然后:(注意raid分区的变化!)
mdadm /dev/md0 -a /dev/sdb3
最好等待 RAID 完成重建。Grub-install 应该可以在新驱动器上运行。
此时,您应该使用旧 MBR 驱动器和新 GPT 驱动器组成 raid1。如果您不更换 MBR 驱动器,则可以重复失败、GPT 分区和重新添加到 /dev/md0 的过程。
但我想用更大的驱动器替换 MBR 驱动器,所以我不得不关机。这个旧驱动器将是我的备份,我不想让它在 mdadm 中失败,以防出现问题。所以我拔出了驱动器,给了我一个离线备份。
如果旧驱动器出现故障,请更换它并重新启动,希望 Ubuntu 能够使用降级的阵列启动,并且您可以使用 GPT 重新分区并重新添加到阵列。
我的 mdadm radi1 系统似乎使用降级的镜像启动,因此驱动器发生故障然后关闭可能对我来说有效。
但是,如果您的驱动器确实出现故障,或者您在驱动器没有出现故障的情况下更换了它,Linux 可能无法正常启动并会让您进入 initramfs。
问题出在/scripts/local-block/mdadm:
mdadm -q --assemble --scan --no-degraded || true
这会阻止正确启动 /dev/md0,因此它无法挂载根文件系统。
您可以从 initramfs shell 启动系统:
# /dev/md0 is "up" but not mountable so stop it
mdadm --stop /dev/md0
# start it degraded
mdadm -q --assemble --scan
# if /dev/md0 is extfs it should be mountable now
# I use lvm and had to start manually:
lvm vgchange -ay
您可能需要修复 iniramfs 脚本。Ubuntu 文档中关于 BOOT_DEGRADED 选项的说明可能不正确。该脚本是 /usr/share/initramfs-tools/scripts/local-block/mdadm,您需要重建 initrd 等。
启动后,您可以使用 GPT 对替换驱动器进行分区并重新安装 grub
调整大小
所有这些的重点是使用 GPT 并利用更大的驱动器。在 /dev/md0 完全同步并且系统可以工作/启动后,我扩展了 RAID、物理卷、逻辑卷和 ext4 文件系统。
在新的更大驱动器上,您应该已经创建了新的、更大的 RAID 分区。(如果没有,您应该能够使用 gparted 增加分区而不会丢失数据)。
确保阵列已启动并同步[呜呜]并声明干净的
# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdb3[3] sda3[2]
3906783047 blocks super 1.2 [2/2] [UU]
bitmap: 2/8 pages [8KB], 262144KB chunk
# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu May 3 22:06:08 2018
Raid Level : raid1
Array Size : 3906783047 (3725.80 GiB 4000.55 GB)
Used Dev Size : 3906783047 (3725.80 GiB 4000.55 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Sun Jun 2 13:45:17 2019
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : bitmap
Name : mysystem:0 (local to host mysystem)
UUID : xxxxx
Events : 1995897
Number Major Minor RaidDevice State
3 8 35 0 active sync /dev/sdb3
2 8 3 1 active sync /dev/sda3
现在您可以扩展系统以获取更多磁盘空间
# Grow the RAID. Docs suggest using a backup file on another drive
# mdadm didn't seem to use the backup file but doesn't hurt to include
mdadm --grow --backup-file=/mnt/otherdisk/grow_md0.bak /dev/md0 --size=max
# Have to grow the physical volume. By default uses all available space
pvresize /dev/md0
# You can extend logical volumes or create new ones
# I extended an existing one to use it all
lvextend -l +100%FREE /dev/mysystem/data
#
resize2fs /dev/mapper/mysystem-data # should be same as /dev/mysystem/data
此时,我有一个可启动的 mdadm raid1 和 LVM,以及一个备份 USB,以防万一