更新:我已经验证了下面的描述也适用于Ubuntu 16.04。其他用户报告在17.10和18.04.1上也有效。
注意:本教程不会给你提供LVM。如果你也想要LVM,请尝试在UEFI BIOS机器上安装带有RAID 1和LVM的Ubuntu 18.04桌面版。
经过几天的尝试,我现在有一个可用的系统!简而言之,解决方案包括以下步骤:
解决方案的第6步关键组成部分是在启动序列中添加了延迟,否则如果其中一个SSD丢失,我将直接进入GRUB提示符(没有键盘!)。
使用EFI从USB驱动器启动。具体方法因您的系统而异。 选择试用Ubuntu而不安装。
打开一个终端模拟器,例如xterm
,以运行下面的命令。
在尝试这个过程时,我经常发现从另一台已经完全配置好的计算机登录更容易。这样可以简化复制和粘贴命令等操作。如果你也想这样做,可以通过以下步骤使用ssh登录:
在要配置的计算机上安装openssh服务器:
sudo apt-get install openssh-server
更改密码。用户ubuntu
的默认密码为空。您可以选择一个中等强度的密码。在重新启动新电脑后,它将被忘记。
passwd
ssh -l ubuntu <your-new-computer>
openssh-server
时,它会生成新的服务器密钥。要使用的命令通常会被打印出来,应该类似于:ssh-keygen -f <path-to-.ssh/known_hosts> -R <your-new-computer>
sudo sgdisk -z /dev/sda
sudo sgdisk -z /dev/sdb
请按照以下步骤执行:
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
sudo sgdisk /dev/sda -R /dev/sdb -G
按照以下步骤进行操作:
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
sudo sgdisk /dev/sdb -R /dev/sda -G
为 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
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的评论。)
以降低模式创建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
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>
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
运行Ubiquity安装程序,但不要包括引导加载程序(因为它无论如何都会失败)。(注意:如果您是通过ssh登录的,则可能希望在新计算机上执行此操作。)
sudo ubiquity -b
sudo mdadm --add /dev/md0 /dev/sdb2
sudo mdadm --add /dev/md1 /dev/sdb3
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>
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
仅是个人偏好。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
/etc/default/grub
中的行以读取。#GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
#!/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
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
dd if=/dev/sda1 of=/dev/sdb1
efibootmgr -c -g -d /dev/sdb -p 1 -L "Ubuntu #2" -l '\EFI\ubuntu\grubx64.efi'
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
exit # from chroot
exit # from sudo -s
sudo reboot
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>
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+引导系统需要以下步骤:
从健康驱动器复制分区表:
sudo sgdisk /dev/sdY -R /dev/sdX
sudo sgdisk /dev/sdX -G
sudo mdadm --add /dev/md0 /dev/sdX2
sudo mdadm --add /dev/md1 /dev/sdX3
从健康的驱动器克隆ESP。(小心,如果真的搞砸了,最好先对两个ESP进行文件转储以便恢复。)
sudo dd if=/dev/sdY1 of=/dev/sdX1
sudo efibootmgr -c -g -d /dev/sdX -p 1 -L "Ubuntu #2" -l '\EFI\ubuntu\grubx64.efi'
initramfs
提示符下,不知道该怎么办。也许可以通过a)启动Ubuntu Live USB,b)安装mdadm
和c)手动重新组装阵列来挽救局面,但是...我在某个地方搞砸了。相反,当我重新运行这个测试时,使用了睡眠脚本(是的,我确实从头开始第n次尝试...),系统成功启动了。阵列处于降级模式,我可以手动重新添加/dev/sdb[23]
分区,而无需额外的USB驱动器。我不知道为什么睡眠脚本有效而rootdelay
却无效。也许mdadm
对两个稍微不同步的组件设备感到困惑,但我认为mdadm
应该能处理这种情况。无论如何,既然睡眠脚本有效,我就坚持使用它。mdadm
的困惑机会就较少了。我同意这个观点。然而,除非真的禁用一些硬件,否则我不知道如何测试系统对硬件故障的容忍能力!测试之后,我希望恢复到一个冗余的工作系统。(嗯,我可以将我的第二块SSD连接到另一台机器上并进行刷写,然后再重新添加它,但这是不可行的。)rootdelay
解决方案干净、比睡眠脚本更快(对于非降级引导),并且应该适用于真正的硬盘故障/替换场景。然而,我不知道有没有可行的方法来测试它。因此,暂时我将继续使用不太美观的睡眠脚本。我的建议是针对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
mount | grep efi
)。显然,Linux会挂载与/etc/fstab匹配的第一个分区。不过,这应该不是个问题。 - Niclas Börlinapt-get install mdadm
和mdadm -A /dev/md0
mdadm -A /dev/md1
来恢复访问权限。 - Niclas Börlinsda
引导,这意味着如果我想要在sdb
上启动新的内核,我需要手动将我的sda
上的/boot
克隆到sdb
吗?有没有办法使这个过程自动化?通常情况下,通过将/boot
放在RAID上来处理此问题,但显然ESP无法进行RAID。 - CMCDragonkai/boot/efi/
被克隆了。而/boot
外面的东西在主数据分区里。我不需要为/boot
单独创建一个分区,对吗?它只是主要的RAID数据分区。 - CMCDragonkaibtrfs
条带化(软RAID0,但是Intel RST也是一种伪RAID)+GPT
+UEFI + CSM
。 - Csaba Tothgrub-efi-amd64-signed
,否则如果启用了安全启动,我会遇到“无效签名”efi错误。 - Aleczsubiquity
)在未选择启动设备的情况下不允许继续。在选择了一个设备后,它总是在下一步崩溃,导致无法继续进行。 - Thomas