如何在UEFI/GPT系统上使用双启动RAID 1分区安装Ubuntu 14.04/16.04 64位操作系统?

更新:以下的问题和答案也适用于Ubuntu 16.04。
我有一台装有双SSD硬盘的电脑,另外一个硬盘上预装了Win7系统,并使用了UEFI/GPT引导。我想在我的SSD上安装64位的Ubuntu 14.04桌面版,并且仍然能够双启动我的Win7系统。这种情况是否可能?
使用桌面安装程序的这个指南没有成功,可能是因为它(隐含地)假设了MBR引导。同样的原因,安装服务器版本也没有成功。
2个回答

更新:我已经验证了下面的描述也适用于Ubuntu 16.04。其他用户报告在17.10和18.04.1上也有效。

注意:本教程不会给你提供LVM。如果你也想要LVM,请尝试在UEFI BIOS机器上安装带有RAID 1和LVM的Ubuntu 18.04桌面版

经过几天的尝试,我现在有一个可用的系统!简而言之,解决方案包括以下步骤:

  1. 使用Ubuntu Live CD/USB启动。
  2. 根据需要对SSD进行分区。
  3. 安装缺失的软件包(mdadm和grub-efi)。
  4. 创建RAID分区。
  5. 运行Ubiquity安装程序(但不要启动新系统)。
  6. 修补已安装的系统(initramfs),以启用从RAID根目录引导。
  7. 将第一个SSD的EFI分区填充为GRUB,并将其安装到EFI引导链中。
  8. 克隆 EFI分区到另一个SSD,并将其安装到引导链中。
  9. 完成!您的系统现在具有RAID 1冗余。请注意,例如内核更新后无需执行任何特殊操作,因为UEFI分区保持不变。

解决方案的第6步关键组成部分是在启动序列中添加了延迟,否则如果其中一个SSD丢失,我将直接进入GRUB提示符(没有键盘!)。

详细教程

1. 启动

使用EFI从USB驱动器启动。具体方法因您的系统而异。 选择试用Ubuntu而不安装

打开一个终端模拟器,例如xterm,以运行下面的命令。

1.1 从另一台计算机登录

在尝试这个过程时,我经常发现从另一台已经完全配置好的计算机登录更容易。这样可以简化复制和粘贴命令等操作。如果你也想这样做,可以通过以下步骤使用ssh登录:

在要配置的计算机上安装openssh服务器:

sudo apt-get install openssh-server

更改密码。用户ubuntu的默认密码为空。您可以选择一个中等强度的密码。在重新启动新电脑后,它将被忘记。

passwd

现在你可以从另一台电脑登录到Ubuntu的实时会话中。以下说明适用于Linux系统:
ssh -l ubuntu <your-new-computer>

如果您收到关于疑似中间人攻击的警告,您需要清除用于识别新计算机的SSH密钥。这是因为每当安装openssh-server时,它会生成新的服务器密钥。要使用的命令通常会被打印出来,应该类似于:
ssh-keygen -f <path-to-.ssh/known_hosts> -R <your-new-computer>

执行该命令后,您应该能够登录到Ubuntu的实时会话。
2. 分区磁盘
清除任何旧分区和引导块。警告!这将销毁您磁盘上的数据!
sudo sgdisk -z /dev/sda
sudo sgdisk -z /dev/sdb

在最小的驱动器上创建新分区:ESP 100M,RAID SWAP 32G,剩余空间用于RAID根分区。如果您的sda驱动器是最小的,请按照第2.1节进行操作;否则,请按照第2.2节进行操作。

2.1 创建分区表(/dev/sda较小)

请按照以下步骤执行:

sudo sgdisk -n 1:0:+100M -t 1:ef00 -c 1:"EFI System" /dev/sda
sudo sgdisk -n 2:0:+32G -t 2:fd00 -c 2:"Linux RAID" /dev/sda
sudo sgdisk -n 3:0:0 -t 3:fd00 -c 3:"Linux RAID" /dev/sda

复制分区表到其他磁盘并重新生成唯一的UUID(实际上将为sda重新生成UUID)。
sudo sgdisk /dev/sda -R /dev/sdb -G

2.2 创建分区表(/dev/sdb 较小)

按照以下步骤进行操作:

sudo sgdisk -n 1:0:+100M -t 1:ef00 -c 1:"EFI System" /dev/sdb
sudo sgdisk -n 2:0:+32G -t 2:fd00 -c 2:"Linux RAID" /dev/sdb
sudo sgdisk -n 3:0:0 -t 3:fd00 -c 3:"Linux RAID" /dev/sdb

复制分区表到其他磁盘并重新生成唯一的UUID(实际上将为sdb重新生成UUID)。
sudo sgdisk /dev/sdb -R /dev/sda -G

2.3 在 /dev/sda 上创建 FAT32 文件系统

为 EFI 分区创建 FAT32 文件系统。

sudo mkfs.fat -F 32 /dev/sda1
mkdir /tmp/sda1
sudo mount /dev/sda1 /tmp/sda1
sudo mkdir /tmp/sda1/EFI
sudo umount /dev/sda1

3. 安装缺失的软件包

Ubuntu Live CD中没有两个重要的软件包:grub-efi和mdadm。请安装它们。(我不能百分之百确定这里是否需要grub-efi,但为了与接下来的安装保持一致,请也安装它。)

sudo apt-get update
sudo apt-get -y install grub-efi-amd64 # (or grub-efi-amd64-signed)
sudo apt-get -y install mdadm

你如果启用了安全启动,可能需要使用grub-efi-amd64-signed代替grub-efi-amd64。(参考Alecz的评论。)

4. 创建RAID分区

以降低模式创建RAID设备,稍后再完成设备。在下面的ubiquity安装过程中,创建完整的RAID1有时会遇到问题,原因不明。(挂载/卸载?格式化?)

sudo mdadm --create /dev/md0 --bitmap=internal --level=1 --raid-disks=2 /dev/sda2 missing
sudo mdadm --create /dev/md1 --bitmap=internal --level=1 --raid-disks=2 /dev/sda3 missing

验证RAID状态。
cat /proc/mdstat

Personalities : [raid1] 
md1 : active raid1 sda3[0]
      216269952 blocks super 1.2 [2/1] [U_]
      bitmap: 0/2 pages [0KB], 65536KB chunk

md0 : active raid1 sda2[0]
      33537920 blocks super 1.2 [2/1] [U_]
      bitmap: 0/1 pages [0KB], 65536KB chunk

unused devices: <none>

分区md设备。
sudo sgdisk -z /dev/md0
sudo sgdisk -z /dev/md1
sudo sgdisk -N 1 -t 1:8200 -c 1:"Linux swap" /dev/md0
sudo sgdisk -N 1 -t 1:8300 -c 1:"Linux filesystem" /dev/md1

5. 运行安装程序

运行Ubiquity安装程序,但不要包括引导加载程序(因为它无论如何都会失败)。(注意:如果您是通过ssh登录的,则可能希望在新计算机上执行此操作。)

sudo ubiquity -b

选择“其他”作为安装类型,并将“md1p1”类型修改为“ext4”,格式化:是,并挂载点为“/”。 “md0p1”分区将自动选择为交换分区。
在安装完成之前,喝杯咖啡放松一下。
重要提示:安装完成后,请选择“继续测试”,因为系统尚未准备好启动。
完成RAID设备设置。
将等待中的sdb分区附加到RAID上。
sudo mdadm --add /dev/md0 /dev/sdb2
sudo mdadm --add /dev/md1 /dev/sdb3

验证所有RAID设备是否正常(可选择同步)。
cat /proc/mdstat

Personalities : [raid1] 
md1 : active raid1 sdb3[1] sda3[0]
      216269952 blocks super 1.2 [2/1] [U_]
      [>....................]  recovery =  0.2% (465536/216269952)  finish=17.9min speed=200000K/sec
      bitmap: 2/2 pages [8KB], 65536KB chunk

md0 : active raid1 sdb2[1] sda2[0]
      33537920 blocks super 1.2 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

unused devices: <none>

以下过程可能在同步过程中继续进行,包括重新启动。
6. 配置已安装的系统
设置以启用对安装系统的chroot。
sudo -s
mount /dev/md1p1 /mnt
mount -o bind /dev /mnt/dev
mount -o bind /dev/pts /mnt/dev/pts
mount -o bind /sys /mnt/sys
mount -o bind /proc /mnt/proc
cat /etc/resolv.conf >> /mnt/etc/resolv.conf
chroot /mnt

配置和安装软件包。
apt-get install -y grub-efi-amd64 # (or grub-efi-amd64-signed; same as in step 3)
apt-get install -y mdadm

如果您的设备仍在同步中,您可能会偶尔看到如下警告:
/usr/sbin/grub-probe: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..

这是正常的,可以忽略(请参见此问题底部的答案)。
nano /etc/grub.d/10_linux
# change quick_boot and quiet_boot to 0

禁用quick_boot将避免不支持磁盘过滤器写入的错误。禁用quiet_boot仅是个人偏好。
修改/etc/mdadm/mdadm.conf以删除任何标签引用,即更改
ARRAY /dev/md/0 metadata=1.2 name=ubuntu:0 UUID=f0e36215:7232c9e1:2800002e:e80a5599
ARRAY /dev/md/1 metadata=1.2 name=ubuntu:1 UUID=4b42f85c:46b93d8e:f7ed9920:42ea4623

ARRAY /dev/md/0 UUID=f0e36215:7232c9e1:2800002e:e80a5599
ARRAY /dev/md/1 UUID=4b42f85c:46b93d8e:f7ed9920:42ea4623

这一步可能是多余的,但我看到有些页面建议命名方案可能不稳定(name=ubuntu:0/1),这可能会导致一个完全正常的RAID设备在启动时无法组装。
修改/etc/default/grub中的行以读取。
#GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

再说一遍,这一步可能是多余的,但我更倾向于睁大眼睛启动...
6.1. 添加睡眠脚本
(社区提出了一个建议,可以通过在/etc/default/grub中使用GRUB_CMDLINE_LINUX="rootdelay=30"来替代这一步骤。由于在本教程底部解释的原因,我建议坚持使用睡眠脚本,即使它比使用rootdelay更丑陋。因此,我们继续进行我们的正常程序...)
创建一个脚本,等待RAID设备稳定下来。如果没有这个延迟,根目录的挂载可能会因为RAID组装未能及时完成而失败。我通过断开其中一个固态硬盘模拟磁盘故障才发现了这个问题!根据可用的硬件(例如缓慢的外部USB硬盘等),可能需要调整时机。
将以下代码输入到/usr/share/initramfs-tools/scripts/local-premount/sleepAwhile中:
#!/bin/sh
echo
echo "sleeping for 30 seconds while udevd and mdadm settle down"
sleep 5
echo "sleeping for 25 seconds while udevd and mdadm settle down"
sleep 5
echo "sleeping for 20 seconds while udevd and mdadm settle down"
sleep 5
echo "sleeping for 15 seconds while udevd and mdadm settle down"
sleep 5
echo "sleeping for 10 seconds while udevd and mdadm settle down"
sleep 5
echo "sleeping for 5 seconds while udevd and mdadm settle down"
sleep 5
echo "done sleeping"

将脚本设为可执行并安装它。
chmod a+x /usr/share/initramfs-tools/scripts/local-premount/sleepAwhile
update-grub
update-initramfs -u

7. 启用从第一个SSD启动
现在系统几乎准备就绪,只需要安装UEFI引导参数。
mount /dev/sda1 /boot/efi
grub-install --boot-directory=/boot --bootloader-id=Ubuntu --target=x86_64-efi --efi-directory=/boot/efi --recheck
update-grub
umount /dev/sda1

这将在/boot/efi/EFI/Ubuntu(也称为/dev/sda1上的EFI/Ubuntu)中安装引导加载程序,并将其作为计算机上UEFI引导链中的第一个安装。
8. 启用从第二个SSD启动
我们快要完成了。此时,我们应该能够在sda驱动器上重新启动。此外,mdadm应该能够处理sda或sdb驱动器的故障。然而,EFI没有进行RAID,所以我们需要克隆它。
dd if=/dev/sda1 of=/dev/sdb1

此外,除了在第二个驱动器上安装引导加载程序之外,这将使得FAT32文件系统的UUID与sdb1分区(由blkid报告)的UUID与sda1和/etc/fstab相匹配。(然而请注意,/dev/sda1和/dev/sdb1分区的UUID仍然是不同的 - 在安装后,可以使用ls -la /dev/disk/by-partuuid | grep sd[ab]1和blkid /dev/sd[ab]1进行比较以自行验证。)
最后,我们必须将sdb1分区插入启动顺序中。(注意:根据您的BIOS,此步骤可能是不必要的。我收到了一些BIOS会自动生成有效ESP列表的报告。)
efibootmgr -c -g -d /dev/sdb -p 1 -L "Ubuntu #2" -l '\EFI\ubuntu\grubx64.efi'

我没有测试过,但在ESP之间(-L)可能需要有唯一的标签,例如在sda和sdb上。
这将生成当前引导顺序的打印输出。
Timeout: 0 seconds
BootOrder: 0009,0008,0000,0001,0002,000B,0003,0004,0005,0006,0007
Boot0000  Windows Boot Manager
Boot0001  DTO UEFI USB Floppy/CD
Boot0002  DTO UEFI USB Hard Drive
Boot0003* DTO UEFI ATAPI CD-ROM Drive
Boot0004  CD/DVD Drive 
Boot0005  DTO Legacy USB Floppy/CD
Boot0006* Hard Drive
Boot0007* IBA GE Slot 00C8 v1550
Boot0008* Ubuntu
Boot000B  KingstonDT 101 II PMAP
Boot0009* Ubuntu #2

请注意,Ubuntu #2(sdb)和Ubuntu(sda)是启动顺序中的第一项。
重新启动
现在我们已经准备好重新启动了。
exit # from chroot
exit # from sudo -s
sudo reboot

系统现在应该重新启动进入Ubuntu(您可能需要先删除Ubuntu Live安装介质)。
启动后,您可以运行
sudo update-grub

将Windows引导加载程序附加到grub引导链。

虚拟机注意事项

如果您想先在虚拟机中尝试此操作,有一些注意事项:显然,保存UEFI信息的NVRAM在重新启动之间会被记住,但在关机-重启循环之间不会。在这种情况下,您可能会进入UEFI Shell控制台。以下命令应该可以从/dev/sda1(使用FS1:代替/dev/sdb1)引导您的机器:

FS0:
\EFI\ubuntu\grubx64.efi

UEFI boot in virtualbox - Ubuntu 12.04的顶部答案中,第一个解决方案可能也会有所帮助。

模拟磁盘故障

可以使用mdadm来模拟RAID组件设备的故障。然而,为了验证引导程序是否能够在磁盘故障时正常工作,我必须关闭计算机并断开一块磁盘的电源。如果您这样做,请确保md设备已同步

cat /proc/mdstat 

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : active raid1 sdb3[2] sda3[0]
      216269952 blocks super 1.2 [2/2] [UU]
      bitmap: 2/2 pages [8KB], 65536KB chunk

md0 : active raid1 sda2[0] sdb2[2]
      33537920 blocks super 1.2 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

unused devices: <none>

在下面的说明中,sdX是故障设备(X=a或b),而sdY是正常设备。
断开驱动器
关闭计算机。断开一个驱动器。重新启动。Ubuntu现在应该以降级模式启动RAID驱动器。(庆祝吧!这就是你想要实现的目标!;)
cat /proc/mdstat 

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : active raid1 sda3[0]
      216269952 blocks super 1.2 [2/1] [U_]
      bitmap: 2/2 pages [8KB], 65536KB chunk

md0 : active raid1 sda2[0]
      33537920 blocks super 1.2 [2/1] [U_]
      bitmap: 0/1 pages [0KB], 65536KB chunk

unused devices: <none>

恢复故障硬盘

如果您需要更换故障的硬盘,以下是应该遵循的流程。如果您想模拟替换,可以启动Ubuntu Live会话并使用以下方法:

dd if=/dev/zero of=/dev/sdX

在重新引导到真实系统之前,清除磁盘。如果您刚刚在上面的部分测试了引导/RAID冗余性,则可以跳过此步骤。然而,您至少必须执行下面的2和4步骤来恢复系统的完全引导/RAID冗余性。

更换磁盘后,恢复RAID+引导系统需要以下步骤:

  1. 对新驱动器进行分区。
  2. 将分区添加到md设备中。
  3. 克隆引导分区。
  4. 为克隆添加EFI记录。

1. 对新驱动器进行分区

从健康驱动器复制分区表:

sudo sgdisk /dev/sdY -R /dev/sdX

在新驱动器上重新随机生成UUID。
sudo sgdisk /dev/sdX -G

2. 添加到 md 设备

sudo mdadm --add /dev/md0 /dev/sdX2
sudo mdadm --add /dev/md1 /dev/sdX3

3. 克隆启动分区

从健康的驱动器克隆ESP。(小心,如果真的搞砸了,最好先对两个ESP进行文件转储以便恢复。)

sudo dd if=/dev/sdY1 of=/dev/sdX1

4. 将新恢复的磁盘插入启动顺序中。
添加克隆的EFI记录。根据需要修改-L标签。
sudo efibootmgr -c -g -d /dev/sdX -p 1 -L "Ubuntu #2" -l '\EFI\ubuntu\grubx64.efi'

现在,重新启动系统应该可以恢复正常(RAID设备可能仍在同步中)!
为什么要使用睡眠脚本?
社区建议添加睡眠脚本可能是不必要的,并且可以通过在/etc/default/grub中使用"GRUB_CMDLINE_LINUX="rootdelay=30"",然后运行"sudo update-grub"来替代。这个建议确实更简洁,并且在磁盘故障/替换的情况下有效。然而,有一个注意事项...
我断开了我的第二个SSD,并发现使用"rootdelay=30"等而不是睡眠脚本: 1)系统在缺少"失败"驱动器的情况下以降级模式启动。 2)在非降级启动(两个驱动器都存在)时,启动时间缩短。只有在缺少第二个驱动器的情况下才会有延迟感知。
1)和2)听起来很好,直到我重新添加了第二个驱动器。在启动时,RAID阵列无法组装,让我陷入了initramfs提示符下,不知道该怎么办。也许可以通过a)启动Ubuntu Live USB,b)安装mdadm和c)手动重新组装阵列来挽救局面,但是...我在某个地方搞砸了。相反,当我重新运行这个测试时,使用了睡眠脚本(是的,我确实从头开始第n次尝试...),系统成功启动了。阵列处于降级模式,我可以手动重新添加/dev/sdb[23]分区,而无需额外的USB驱动器。我不知道为什么睡眠脚本有效而rootdelay却无效。也许mdadm对两个稍微不同步的组件设备感到困惑,但我认为mdadm应该能处理这种情况。无论如何,既然睡眠脚本有效,我就坚持使用它。
可以说,移除一个完好无损的RAID组件设备,重新启动RAID进入降级模式,然后再重新添加该组件设备,这是一个不现实的场景。现实的情况更可能是一个设备故障,并被新设备替换,这样mdadm的困惑机会就较少了。我同意这个观点。然而,除非真的禁用一些硬件,否则我不知道如何测试系统对硬件故障的容忍能力!测试之后,我希望恢复到一个冗余的工作系统。(嗯,我可以将我的第二块SSD连接到另一台机器上并进行刷写,然后再重新添加它,但这是不可行的。)
总结一下:据我所知,rootdelay解决方案干净、比睡眠脚本更快(对于非降级引导),并且应该适用于真正的硬盘故障/替换场景。然而,我不知道有没有可行的方法来测试它。因此,暂时我将继续使用不太美观的睡眠脚本。

注意1:如果在安装过程中意外进入Windows,并且在重新启动为Ubuntu(无论是Live还是其他方式)时DHCP出现神秘故障(我遇到过),关闭计算机和路由器,然后重新启动可能会有所帮助。显然,一些路由器试图在重复的DHCP请求上做一些“聪明”的事情,这种情况对Ubuntu产生了影响,但对Windows没有影响... 叹气 - Niclas Börlin
1注意2:尽管上面安装的引导程序顺序表明sdb上的引导加载程序被使用,但你可能会发现/boot/efi仍然从sda挂载(mount | grep efi)。显然,Linux会挂载与/etc/fstab匹配的第一个分区。不过,这应该不是个问题。 - Niclas Börlin
注意事项3:如果由于某种原因,您无法启动到md设备(例如,在上述第3步中搞砸了引导分区恢复),我成功通过使用Ubuntu Live媒体进行引导,然后执行apt-get install mdadmmdadm -A /dev/md0 mdadm -A /dev/md1来恢复访问权限。 - Niclas Börlin
在启动设置过程中,我遇到了问题,出现了“致命错误:无法打开sysfs或procfs目录以访问EFI变量。”而且我的BIOS设置中没有任何关于EFI的指示。 - Coder Guy
@JonathanNeufeld,如果是这样的话,你可能没有一台支持EFI引导的电脑。我建议你尝试使用这个指南:http://askubuntu.com/questions/505446/how-to-install-ubuntu-14-04-with-raid-1-using-desktop-installer - Niclas Börlin
所以,如果我安装一个新的内核,并且通过sda引导,这意味着如果我想要在sdb上启动新的内核,我需要手动将我的sda上的/boot克隆到sdb吗?有没有办法使这个过程自动化?通常情况下,通过将/boot放在RAID上来处理此问题,但显然ESP无法进行RAID。 - CMCDragonkai
@CMCDragonkai:我相信你不需要做任何事情。EFI引导加载程序存储在sda/sdb上,路径为/EFI/Ubuntu/grubx64.efi,并被挂载为/boot/efi/EFI/Ubuntu/grubx64.efi。安装新内核不会对这些文件造成影响(自从编写这个指令以来,我已经多次升级了我的内核,并且刚刚检查了我的/dev/sd[ab]/EFI/Ubuntu/grubx64.efi,它们是相同的)。升级内核会改变位于sda/sdb之外的/boot、/boot/grub等目录中的文件。 - Niclas Börlin
哦,你的意思是只有/boot/efi/被克隆了。而/boot外面的东西在主数据分区里。我不需要为/boot单独创建一个分区,对吗?它只是主要的RAID数据分区。 - CMCDragonkai
3是的。:) 这就是我配置我的系统的方式。 - Niclas Börlin
@NiclasBörlin 非常感谢!这对我很有帮助,我已经在Asus Zenbook上安装了Ubuntu 15.10,并进行了RAID 0设置。我想要更多的空间,对于故障我并不太在意,所以我选择了RAID 0。这是我的命令https://gist.github.com/umpirsky/6ee1f870e759815333c8。只有一件事让我困扰,sleepAwhile脚本会减慢启动时间。我可以安全地删除它吗?在我的情况下是否需要它? - umpirsky
@umpirsky,对于RAID1恢复来说,休息一会是必要的,所以对于RAID0配置,你可以将其移除。 - Niclas Börlin
@NiclasBörlin 看起来有些变化,这个指令需要更新一下,安装后我遇到了一些错误。尽管它还在运行,但修复一下会很好,前几个月我遇到了麻烦,无法启动。如果你能看一下我的问题http://askubuntu.com/questions/766355/error-unknown-command-hwmatch,我将不胜感激。提前谢谢。 - umpirsky
我还没有在16.04的安装上尝试过这个。我能想到的最好的解释是grub-efi包中缺少hwmatch。apt-file搜索hwmatch只在grub-pc-{bin|dbg}中得分(在debian 8和ubuntu 14.04上测试)。有趣的是,这在https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/702707的评论#3中提到,但似乎没有被修复。目前我最好的建议是提交一个错误报告,抱歉。 - Niclas Börlin
@NiclasBörlin 你对一个使用RAID0和非GPT系统的系统有什么建议吗?https://askubuntu.com/questions/799225/ubuntu-mate-16-04-install-fails-on-an-mdadm-nvme-raid0-configuration-boot-repai - Csaba Toth
@CsabaToth:RAID0,非GPT?我没有经验,但我会选择服务器安装。 - Niclas Börlin
最后我选择了 btrfs 条带化(软RAID0,但是Intel RST也是一种伪RAID)+ GPT + UEFI + CSM - Csaba Toth
1我不得不安装grub-efi-amd64-signed,否则如果启用了安全启动,我会遇到“无效签名”efi错误。 - Alecz
谢谢@Alecz:我已经更新了我的答案以反映您的评论。 - Niclas Börlin
在Ubuntu 17.10上对我起作用,只是有一个例外,我建立了一个单个的RAID配对卷,让安装程序在md0上执行LVM,并在第4步中使用--metadata=0.90开关创建了RAID。启动正常。 - mmeyer
在Ubuntu 18.04.1上对我有效,还有一个额外的/home分区。 - xavlours
在Ubuntu Server 20.10上为我工作- subiquity使一切变得更加困难,但仍然有可能:启动安装程序,转到shell,按照这里所述的说明配置您的分区,重新启动,重新启动安装,使用先前配置的分区。 - Vinicius
您知道是否可能配置 mdadm 忽略某个慢速但并非完全损坏的磁盘吗?例如,如果设备响应时间超过4秒,则将其视为有故障,而不是为所有操作增加额外延迟。 - Mikko Rantalainen
@MikkoRantalainen,没有,而且我的直觉是这样一个功能会产生更多的问题,而不是解决问题。另外,请查看我关于睡眠脚本的评论。 - Niclas Börlin
22.04版本中的新安装程序(subiquity)在未选择启动设备的情况下不允许继续。在选择了一个设备后,它总是在下一步崩溃,导致无法继续进行。 - Thomas

我的建议是针对Debian操作系统,但我认为它也适用于Ubuntu和其他操作系统。

解决许多主板不能正确处理UEFI条目的问题的一个可能方法(即使你已经正确使用efibootmgr -c -g -d /dev/sda -p 1 -w -L "debian" -l /EFI/debian/grubx64.efi添加了"debian"的引导项,UEFI BIOS仍然显示出可引导的"debian"磁盘,但无法从中引导),是改用通用的引导项/boot/efi/EFI/boot/bootx4.efi

例如,Asus Z87C不喜欢/EFI/debian/grubx64.efi

所以,如果你把efi分区/dev/sda1挂载到/boot/efi路径下:

mkdir /boot/efi/EFI/boot
cp /boot/efi/EFI/debian/grubx64.efi /boot/efi/EFI/boot/bootx4.efi

然后重新启动。
UEFI BIOS将会看到一个名为"UEFI OS"的通用磁盘,以及之前使用efibootmgr创建的任何其他条目,但它会毫无问题地从"UEFI OS"通用磁盘启动。

  • 相关问题