如何使用UEFI和RAID1 + LVM安装Ubuntu服务器

我过去习惯在服务器上使用LVM和软件RAID1进行安装,并将grub安装在两个驱动器的MBR上。现在我有一台UEFI服务器,兼容性(BIOS)模式似乎不起作用。
所以我选择了使用UEFI进行安装。
第一次测试,单盘安装正常运行。
然后我尝试使用RAID1 + LVM进行安装。 我以相同的方式对两个驱动器进行了分区:

  • 一个EFI系统分区,200MB
  • 一个物理RAID分区
然后我进行了设置: - 使用两个磁盘的RAID分区创建了一个RAID 1 - 在RAID 1阵列上创建了一个LVM卷组 - 创建了三个逻辑卷:/、/home和swap

安装进行了下去,但重新启动时,我得到了一个grub shell,无法继续。
那么,在LVM上使用RAID1是否可能使grub2-efi工作?如何实现这一点?是否有其他引导加载程序替代方案(直接从EFI加载Linux?)等等...
3个回答

好的,我找到了解决方案,可以回答自己的问题。
1)在UEFI机器上,我可以在RAID1上使用LVM吗?
是的,当然可以。即使其中一个磁盘故障,它也能够启动。
2)怎么做?
安装程序中似乎存在一个bug,所以仅使用安装程序会导致无法启动(grub shell)。
以下是一个可行的步骤:
1)在每个磁盘上手动创建以下分区: - 在磁盘开头创建一个512MB的UEFI类型分区 - 在此之后创建一个RAID类型的分区
2)使用这两个RAID分区创建RAID 1阵列,然后使用该阵列创建LVM卷组和逻辑卷(我创建了一个用于根目录、一个用于主目录和一个用于交换空间)。
3)让安装继续进行,并重新启动。失败!您应该进入grub shell。
4) 可能可以从grub shell启动,但我选择从救援USB磁盘启动。在救援模式下,我在目标根文件系统上打开了一个shell(即位于根LVM逻辑卷上的文件系统)。
5) 使用'blkid'命令获取目标根分区的UUID。记下来或用手机拍照,下一步会用到。
6) 挂载EFI系统分区('mount /boot/efi'),并编辑grub.cfg文件:vi /boot/efi/EFI/ubuntu/grub.cfg 在这里,用第5步得到的正确UUID替换错误的UUID。 保存。
7) 为了能够从第二个磁盘启动,将EFI分区复制到第二个磁盘: dd if=/dev/sda1 of=/dev/sdb1(根据您的配置更改sda或sdb)。
8) 重新启动。在UEFI设置屏幕中,将两个EFI分区设置为可引导,并设置引导顺序。
完成!您可以测试一下,拔掉其中一个磁盘,应该可以正常工作!

非常感谢您提供详细的步骤。请问您能否提供您的启动信息?(https://help.ubuntu.com/community/Boot-Info) - LovinBuntu
@LovinBuntu 这是从USB键启动的Boot-Info输出结果:http://paste.ubuntu.com/6223137/ - alci
我得到了失败,但无法获得 grub shell。 - Peter Lawrey
@PeterLawrey 也许你可以像我一样使用救援USB盘来启动(参见第4点)。 - alci
@acli 令人惊讶的是,我的系统不支持从USB启动。:| 我尝试了从CD启动,但重新挂载驱动器时遇到了麻烦。我怀疑我需要从“尝试Ubuntu”安装,并在重新启动前修复驱动器。我已经重新构建了没有LVM和RAID的系统,一切都正常。 - Peter Lawrey
感谢您指导我如何在整体RAID概念中包含冗余的EFI引导分区。关于GRUB问题,似乎在14.04版本中已经解决了。 - Run CMD
'bkid' 应该是 'blkid' - Quantum7
嗨 @alci,我想请你再提供一点细节:在第5步中,如果"/boot"和"/"(根目录)位于不同的分区上,你会得到哪个uuid?在我的情况下,/boot不是LVM,而根目录是。 - dmeu
@dmeu 我不确定。我会选择/boot,但你得试一下...抱歉 - alci
@alci,嗨,我刚刚尝试了一下。问题是我收到了一个错误,说扇区无法读取。 - dmeu
4我刚刚浪费了几天的时间,试图按照类似的步骤进行操作,主要是因为我太蠢了。但是以防这能帮助其他人避免同样的问题,我想提醒大家需要确保使用UEFI引导启动live USB,而不是传统的BIOS引导方式。 (我的主板在“自动”设置下更喜欢传统模式引导。我必须关闭它或手动选择EFI选项才能使安装正常运行。) - Jonathan Y.
1使用Ubuntu 16.04.1,这个问题似乎不再是一个问题了。我设置了一个512MB的EFI分区,一个SWAP分区,以及一个490GB的RAID分区用于RAID1,并且在新的md设备上完全无问题地安装了Ubuntu 16.04服务器。重启后,新系统顺利启动,无需处理EFI分区、fstab等。 - nerdoc
快到2019年了,我又遇到了同样的问题。这个问题在LVM和Ubuntu 18.04上依然存在。如果历史重演的话,15年的Ubuntu经验告诉我Ubuntu是一个悲剧性的例子。:D - Abhishek Dujari

我大约一年前自己做过这个,虽然遇到了问题,但没有这里列出的问题。当时我不确定在哪里找到的建议,所以我会在这里分享我做的事情。
1)在开头创建128MB的efi分区(只有一个会挂载在/boot/efi)
2)创建1GB的/boot RAID1阵列,没有LVM
3)使用LVM创建大型RAID1阵列
将/boot放在单独的分区/RAID1阵列上解决了efi分区无法找到适当内容的问题。
对于那些像我当时一样想要更详细信息的人,这是我设置的更准确的方式:
6x 3TB Drives

Have 4 RAID arrays:
/dev/md0 = 1GB RAID1 across 3 drives
   --> /boot (no LVM)
/dev/md1 = 500GB RAID1 across 3 drives
   LVM:
      --> /     =  40GB
      --> /var  = 100GB
      --> /home = 335GB
      --> /tmp  =  10GB

/dev/md2 = 500GB RAID1 across 3 drives (for VM's/linux containers)
   LVM:
      --> /lxc/container1 =  50GB
      --> /lxc/container2 =  50GB
      --> /lxc/container3 =  50GB
      --> /lxc/container4 =  50GB
      --> /lxc/extra      = 300GB (for more LXC's later)

/dev/md3 = 10TB RAID6 across 6 drives (for media and such)
   --> /mnt/raid6 (no LVM)


Disks are setup thus:

/sda => /boot/efi (128 MB) | /dev/md0 (1 GB) | /dev/md1 (500GB) | /dev/md3 (2.5TB)
/sdb => /boot/efi (128 MB) | /dev/md0 (1 GB) | /dev/md1 (500GB) | /dev/md3 (2.5TB)
/sdc => /boot/efi (128 MB) | /dev/md0 (1 GB) | /dev/md1 (500GB) | /dev/md3 (2.5TB)
/sdd => ----- left empty for simplicity ---- | /dev/md2 (500GB) | /dev/md3 (2.5TB)
/sde => ----- left empty for simplicity ---- | /dev/md2 (500GB) | /dev/md3 (2.5TB)
/sdf => ----- left empty for simplicity ---- | /dev/md2 (500GB) | /dev/md3 (2.5TB)

注意只有一个/boot/efi会被挂载,而另外两个是克隆的;我这样做是因为我希望当RAID1中的任何一个磁盘损坏时,机器仍然能够启动。如果我仍然拥有完全冗余,我不介意以降级模式运行,并且这给了我时间在机器仍然运行时更换驱动器。
此外,如果我没有第二个RAID1阵列来放置LXC容器和基本上所有的数据库等,/var目录必须要更大。然而,将每个LXC作为自己的逻辑卷是一个很好的解决方案,可以防止一个虚拟机/网站由于错误日志失控而影响其他虚拟机/网站。
最后,我使用12.04.01版本的Ubuntu Alternate Install USB进行安装,一切都非常顺利。在头疼了72小时之后。
希望对某人有所帮助!

1Grub2能够很好地处理直接引导lvm在纯md设备上的情况,而无需/boot分区。至少几年来,它一直如此。 - psusi
@psusi我希望你是对的,但我的新安装无法自行从第二个磁盘启动。这与jhaagsma的设置不同,所有都是LVM。 - sjas

我遇到了同样的问题,使用两个磁盘和软件RAID进行EFI引导。
/dev/sda
- /dev/sda1 - 200MB的EFI分区 - /dev/sda2 - 20G用于RAID的物理分区 - /dev/sda3 - 980G用于RAID的物理分区
/dev/sdb
- /dev/sdb1 - 200MB的EFI分区 - /dev/sdb2 - 20G用于RAID的物理分区 - /dev/sdb3 - 980G用于RAID的物理分区
交换空间在/dev/md0上(sda2和sdb2) 根目录在/dev/md1上(sda3和sdb3)
如果你进入grub-rescue shell,使用以下命令启动:
set root=(md/1)
linux /boot/vmlinuz-3.8.0-29-generic root=/dev/md1
initrd /boot/initrd.img-3.8.0-29-generic
boot

在那之后,下载这个补丁文件 - https://launchpadlibrarian.net/151342031/grub-install.diff(如https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1229738所述)
cp /usr/sbi/grub-install /usr/sbi/grub-install.backup
patch /usr/sbin/grub-install patch
mount /dev/sda1 /boot/efi
grub-install /dev/sda1
umount /dev/sda1
mount /dev/sdb1 /boot/efi
grub-install /dev/sdb1
reboot