尝试从 MBR 移动到 GPT raid1,但 grub 无法启动

尝试从 MBR 移动到 GPT raid1,但 grub 无法启动

我有 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,以防万一

相关内容