如何在UEFI / GPT系统上安装具有双引导RAID 1分区的Ubuntu 14.04 / 16.04 64位?


22

更新:以下问答也适用于Ubuntu 16.04

我有一台装有双SSD的计算机,并且在另一张磁盘上预装了Win(7)。预安装使用(U)EFI / GPT引导。我想在我的SSD的RAID1根分区上安装Ubuntu 14.04 64位桌面,并且仍然能够双重引导Win7系统。这可能吗?

使用台式机安装程序的本指南无法正常工作,可能是因为(隐式地)假定启动了MBR引导。可能出于相同的原因,也没有安装服务器发行版

Answers:


36

更新:我已验证以下说明也适用于Ubuntu 16.04。其他用户报告说正在使用17.10和18.04.1。

注意:本操作手册不会提供LVM。如果也需要LVM,请尝试在具有UEFI BIOS的计算机上安装具有RAID 1的Ubuntu 18.04桌面和LVM

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

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

解决方案第6步的关键部分是启动顺序的延迟,否则,如果缺少两个SSD,我会直接将我转储到GRUB提示符(无键盘!)。

详细的HOWTO

1.开机

使用USB随身碟中的EFI引导。实际情况将因系统而异。选择不安装即可尝试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。安装它们。(我不是100%肯定这里需要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-signedgrub-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.运行安装程序

运行无处不在的安装程序,但仍然会失败的引导加载程序除外。(注意:如果您是通过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

如果您的md设备仍在同步中,您可能会偶尔看到如下警告:

/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将避免不支持Diskfilter写操作的错误。禁用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。添加睡眠脚本

(社区建议该步骤可能是不必要的,可以使用GRUB_CMDLINE_LINUX="rootdelay=30"in 代替/etc/default/grub。出于本HOWTO底部解释的原因,我建议坚持使用sleep脚本,即使该脚本比使用rootdelay更为丑陋。因此,我们继续我们的常规程序...

创建一个脚本,等待RAID设备稳定下来。如果没有此延迟,由于RAID组装未及时完成,根目录的安装可能会失败。我发现这很困难-该问题直到我断开其中一个SSD来模拟磁盘故障后才出现!可能需要根据可用硬件(例如,慢速外部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(又名EFI/Ubuntu/dev/sda1)和电脑上的UEFI引导链先安装它。

8.启用从第二个SSD引导

我们快完成了。此时,我们应该能够在sda驱动器上重新启动。此外,mdadm应该能够处理sdasdb驱动器的故障。但是,EFI没有RAID,因此我们需要对其进行克隆

dd if=/dev/sda1 of=/dev/sdb1

除了在第二个驱动器上安装引导加载程序之外,这还将使sdb1分区上的FAT32文件系统的UUID (由所报告blkid)与sda1和匹配/etc/fstab。(不过请注意,/dev/sda1/dev/sdb1分区的UUID 仍将有所不同- ls -la /dev/disk/by-partuuid | grep sd[ab]1blkid /dev/sd[ab]1安装后的UUID进行比较,以进行自我检查。)

最后,我们必须将sdb1分区插入启动顺序。(注意:根据您的BIOS,此步骤可能是不必要的。我得到的报告称某些BIOS自动生成有效ESP列表。)

efibootmgr -c -g -d /dev/sdb -p 1 -L "Ubuntu #2" -l '\EFI\ubuntu\grubx64.efi'

我没有对其进行测试,但是可能有必要在sda和的ESP之间使用唯一的标签(-L)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/sda1FS1:用于/dev/sdb1)引导您进入计算机:

FS0:
\EFI\ubuntu\grubx64.efi

在virtualboxUEFI引导的最佳答案中的第一个解决方案-Ubuntu 12.04也可能会有所帮助。

模拟磁盘故障

可以使用来模拟任一RAID组件设备的故障mdadm。但是,为了验证启动程序是否可以在磁盘故障中幸免,我不得不关闭计算机并断开磁盘电源。如果这样做,请首先确保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 + boot系统需要执行以下步骤:

  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设备可能仍在同步)!

为什么要使用睡眠脚本?

社区建议,添加睡眠脚本可能是不必要的,可以使用GRUB_CMDLINE_LINUX="rootdelay=30"in /etc/default/grub后跟代替sudo update-grub。该建议当然更干净,并且确实适用于磁盘故障/更换情况。但是,有一个警告...

我断开了我的第二个SSD的连接,并发现它使用rootdelay=30等等代替了睡眠脚本:
1)系统确实以降级模式启动而没有“故障”驱动器。
2)在非降级启动(两个驱动器都存在)中,启动时间会减少。仅在缺少第二个驱动器的情况下才可以看到延迟。

1)和2)听起来很棒,直到我重新添加了第二个驱动器。在启动时,RAID阵列无法组装,并在initramfs提示符下不知所措。可以通过以下方法来挽救这种情况:a)引导至Ubuntu Live USB记忆棒,b)安装mdadm并c)手动重新组装阵列,但是...我在某个地方搞砸了。相反,当我使用 sleep脚本重新运行此测试(是的,我确实从第n次开始从顶部启动HOWTO ...),系统确实启动了。阵列处于降级模式,我可以手动重新添加/dev/sdb[23]分区,而无需任何额外的USB记忆棒。我不知道为什么睡眠脚本起作用而rootdelay不能。也许mdadm会被两个稍微不同步的组件设备弄糊涂,但是我认为mdadm旨在解决这个问题。无论如何,由于睡眠脚本有效,所以我坚持使用它。

可能存在争议,即删除一个运行状况良好的RAID组件设备,将RAID重新引导至降级模式,然后重新添加该组件设备是不现实的情况:现实情况是,一台设备发生故障并由新设备替换,从而减少了mdadm混淆的机会。我同意这种说法。但是,除了实际禁用某些硬件外,我不知道如何测试系统如何容忍硬件故障!在测试之后,我想回到一个冗余的工作系统。(好吧,我可以将第二个SSD附加到另一台机器上,然后在重新添加之前对其进行刷卡,但这是不可行的。)

总结:据我所知,该rootdelay解决方案是干净的,比用于非降级启动的睡眠脚本要快,并且在实际的驱动器故障/更换情况下应该可以使用。但是,我不知道一种可行的测试方法。因此,暂时而言,我将坚持使用丑陋的睡眠脚本。


注意1:如果您在安装过程中不小心启动了Windows,而后来在重新启动到Ubuntu(实时或其他)时DHCP神秘地失败了(发生在我身上),则关机+重新启动计算机+路由器可能会有所帮助。显然,某些路由器试图对重复发生的DHCP请求“保持智能”,这出于某种原因会影响Ubuntu,但不会影响Windows ... 感叹
NiclasBörlin2015年

1
注意2:尽管上面安装的引导程序建议使用sdb上的引导加载程序,但您可能会发现/ boot / efi仍是从sda(mount | grep efi)挂载的。显然,Linux挂载了blkid匹配的第一个分区/etc/fstab。不过,这应该不是问题。
NiclasBörlin2015年

注意3:如果由于某种原因而导致您无法启动md设备(例如,通过破坏上述步骤3中的启动分区恢复),我可以通过使用Ubuntu Live媒体(然后apt-get install mdadm和)启动来恢复访问mdadm -A /dev/md0 mdadm -A /dev/md1
NiclasBörlin2015年

3
是。:)这就是我配置系统的方式。
NiclasBörlin2015年

1
grub-efi-amd64-signed如果启用了安全启动,则必须安装,否则会出现“无效签名” efi错误。
Alecz

0

我的建议是使用Debian OS,但我认为它也适用于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

例如华硕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”通用磁盘启动而没有任何麻烦。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.