Nic*_*lin 24 dual-boot raid uefi system-installation 16.04
更新:下面的问答也适用于 Ubuntu 16.04
我有一台带有双 SSD 和 Win (7) 的计算机,预装在另一个磁盘上。预安装使用 (U)EFI/GPT 引导。我想在我的 SSD 的 RAID1 根分区上安装 Ubuntu 14.04 64 位桌面,并且仍然能够双启动我的 Win7 系统。这可能吗?
Nic*_*lin 43
更新:我已验证以下描述也适用于 Ubuntu 16.04。其他用户报告在 17.10 和 18.04.1 上工作。
注意:本 HOWTO 不会为您提供 LVM。如果您也需要 LVM,请尝试在带有 UEFI BIOS 的机器上安装带有 RAID 1 和 LVM 的 Ubuntu 18.04 桌面。
经过几天的尝试,我现在有了一个可以运行的系统!简而言之,该解决方案包括以下步骤:
解决方案第 6 步的一个关键组成部分是启动顺序的延迟,否则如果缺少任何一个 SSD,我就会直接转储到 GRUB 提示符(没有键盘!)。
从 U 盘使用 EFI 启动。具体如何因您的系统而异。选择在不安装的情况下试用 ubuntu。
启动终端模拟器,例如xterm
运行以下命令。
在尝试这个时,我经常发现从另一台已经完全配置的计算机登录更容易。这种简化的命令剪切和粘贴等。如果你想这样做,你可以通过执行以下操作通过 ssh 登录:
在要配置的电脑上,安装openssh服务器:
sudo apt-get install openssh-server
Run Code Online (Sandbox Code Playgroud)
更改密码。用户的默认密码为ubuntu
空。您可以选择一个中等强度的密码。一旦您重新启动新计算机,它就会被遗忘。
passwd
Run Code Online (Sandbox Code Playgroud)
现在您可以从另一台计算机登录 ubuntu 实时会话。以下说明适用于 linux:
ssh -l ubuntu <your-new-computer>
Run Code Online (Sandbox Code Playgroud)
如果您收到有关疑似中间人攻击的警告,则需要清除用于识别新计算机的 ssh 密钥。这是因为openssh-server
无论何时安装都会生成新的服务器密钥。要使用的命令通常会打印出来,看起来应该像
ssh-keygen -f <path-to-.ssh/known_hosts> -R <your-new-computer>
Run Code Online (Sandbox Code Playgroud)
执行该命令后,您应该能够登录到 ubuntu 实时会话。
清除所有旧分区和引导块。警告!这会破坏磁盘上的数据!
sudo sgdisk -z /dev/sda
sudo sgdisk -z /dev/sdb
Run Code Online (Sandbox Code Playgroud)
在最小的驱动器上创建新分区:100M 用于 ESP,32G 用于 RAID SWAP,其余用于 RAID 根。如果您的 sda 驱动器最小,请遵循第 2.1 节,否则请遵循第 2.2 节。
执行以下步骤:
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
Run Code Online (Sandbox Code Playgroud)
将分区表复制到其他磁盘并重新生成唯一的 UUID(实际上将为 sda 重新生成 UUID)。
sudo sgdisk /dev/sda -R /dev/sdb -G
Run Code Online (Sandbox Code Playgroud)
执行以下步骤:
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
Run Code Online (Sandbox Code Playgroud)
将分区表复制到其他磁盘并重新生成唯一的 UUID(实际上将为 sdb 重新生成 UUID)。
sudo sgdisk /dev/sdb -R /dev/sda -G
Run Code Online (Sandbox Code Playgroud)
为 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如果您启用了安全启动,您可能需要grub-efi-amd64-signed
代替grub-efi-amd64
。(见亚历克斯的评论。)
在降级模式下创建 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
Run Code Online (Sandbox Code Playgroud)
验证 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>
Run Code Online (Sandbox Code Playgroud)
对 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
Run Code Online (Sandbox Code Playgroud)
运行无处不在的安装程序,不包括无论如何都会失败的引导加载程序。(注意:如果您通过 ssh 登录,您可能希望在新计算机上执行此操作。)
sudo ubiquity -b
Run Code Online (Sandbox Code Playgroud)
选择“其他”作为安装类型并将类型修改md1p1
为ext4
、格式:是和挂载点/
。该md0p1
分区将自动被选为交换分区。
安装完成后喝杯咖啡。
重要提示:安装完成后,选择继续测试,因为系统尚未准备好启动。
将等待的 sdb 分区附加到 RAID。
sudo mdadm --add /dev/md0 /dev/sdb2
sudo mdadm --add /dev/md1 /dev/sdb3
Run Code Online (Sandbox Code Playgroud)
验证所有 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>
Run Code Online (Sandbox Code Playgroud)
以下过程可能会在同步期间继续,包括重新启动。
设置为启用 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
Run Code Online (Sandbox Code Playgroud)
配置和安装软件包。
apt-get install -y grub-efi-amd64 # (or grub-efi-amd64-signed; same as in step 3)
apt-get install -y mdadm
Run Code Online (Sandbox Code Playgroud)
如果您的 md 设备仍在同步,您可能会偶尔看到如下警告:
/usr/sbin/grub-probe: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
Run Code Online (Sandbox Code Playgroud)
这是正常现象,可以忽略(请参阅此问题底部的答案 )。
nano /etc/grub.d/10_linux
# change quick_boot and quiet_boot to 0
Run Code Online (Sandbox Code Playgroud)
禁用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
Run Code Online (Sandbox Code Playgroud)
到
ARRAY /dev/md/0 UUID=f0e36215:7232c9e1:2800002e:e80a5599
ARRAY /dev/md/1 UUID=4b42f85c:46b93d8e:f7ed9920:42ea4623
Run Code Online (Sandbox Code Playgroud)
这一步可能是不必要的,但我看到一些页面表明命名方案可能不稳定 (name=ubuntu:0/1),这可能会阻止一个完美的 RAID 设备在启动期间组装。
修改行/etc/default/grub
以读取
#GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
Run Code Online (Sandbox Code Playgroud)
同样,这一步可能是不必要的,但我更喜欢睁着眼睛启动......
(社区已经建议这一步可能是不必要的,可以使用GRUB_CMDLINE_LINUX="rootdelay=30"
in替换/etc/default/grub
。出于本 HOWTO 底部解释的原因,我建议坚持使用 sleep 脚本,即使它比使用 rootdelay 更丑陋。因此,我们继续我们的常规计划......)
创建将等待 RAID 设备稳定的脚本。如果没有这个延迟,由于 RAID 组装没有及时完成,root 的安装可能会失败。我发现这一点很困难 - 直到我断开其中一个 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"
Run Code Online (Sandbox Code Playgroud)
使脚本可执行并安装它。
chmod a+x /usr/share/initramfs-tools/scripts/local-premount/sleepAwhile
update-grub
update-initramfs -u
Run Code Online (Sandbox Code Playgroud)
现在系统基本准备好了,只需要安装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
Run Code Online (Sandbox Code Playgroud)
这将在/boot/efi/EFI/Ubuntu
(又名EFI/Ubuntu
on /dev/sda1
)中安装引导加载程序,并首先将其安装在计算机上的 UEFI 引导链中。
我们快完成了。此时,我们应该能够在sda
驱动器上重新启动。此外,mdadm
应该能够处理驱动器sda
或sdb
驱动器的故障。但是,EFI 不是 RAID,所以我们需要克隆它。
dd if=/dev/sda1 of=/dev/sdb1
Run Code Online (Sandbox Code Playgroud)
除了在第二个驱动器上安装引导加载程序外,这将使sdb1
分区上的 FAT32 文件系统的 UUID (如 所报告的blkid
)与sda1
和的 UUID匹配/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'
Run Code Online (Sandbox Code Playgroud)
我没有测试它,但可能需要在 ESP onsda
和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
Run Code Online (Sandbox Code Playgroud)
请注意,Ubuntu #2 (sdb) 和 Ubuntu (sda) 是启动顺序中的第一个。
现在我们准备重新启动。
exit # from chroot
exit # from sudo -s
sudo reboot
Run Code Online (Sandbox Code Playgroud)
系统现在应该重新启动到 Ubuntu(您可能必须先删除 Ubuntu Live 安装介质。)
启动后,您可以运行
sudo update-grub
Run Code Online (Sandbox Code Playgroud)
将 Windows 引导加载程序附加到 grub 引导链。
如果您想先在虚拟机中尝试此操作,有一些注意事项:显然,保存 UEFI 信息的 NVRAM 会在重新启动之间被记住,但不会在关闭-重新启动周期之间被记住。在这种情况下,您可能最终会进入 UEFI Shell 控制台。以下命令应该从/dev/sda1
(FS1:
用于/dev/sdb1
)引导您进入您的机器:
FS0:
\EFI\ubuntu\grubx64.efi
Run Code Online (Sandbox Code Playgroud)
在 virtualbox中UEFI 启动的最佳答案中的第一个解决方案- 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>
Run Code Online (Sandbox Code Playgroud)
在下面的说明中,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>
Run Code Online (Sandbox Code Playgroud)
如果您需要更换有故障的磁盘,则应遵循此过程。如果你想模拟一个替代品,你可以启动一个 Ubuntu Live 会话并使用
dd if=/dev/zero of=/dev/sdX
Run Code Online (Sandbox Code Playgroud)
在重新启动到真实系统之前擦除磁盘。如果您刚刚在上一节中测试了引导/RAID 冗余,则可以跳过此步骤。但是,您必须至少执行下面的第 2 步和第 4 步才能恢复系统的完全引导/RAID 冗余。
更换磁盘后恢复 RAID+引导系统需要以下步骤:
从健康驱动器复制分区表:
sudo sgdisk /dev/sdY -R /dev/sdX
Run Code Online (Sandbox Code Playgroud)
在新驱动器上重新随机化 UUID。
sudo sgdisk /dev/sdX -G
Run Code Online (Sandbox Code Playgroud)
sudo mdadm --add /dev/md0 /dev/sdX2
sudo mdadm --add /dev/md1 /dev/sdX3
Run Code Online (Sandbox Code Playgroud)
从健康驱动器克隆 ESP。(小心,如果你真的搞砸了,也许首先将两个 ESP 转储到文件以启用恢复。)
sudo dd if=/dev/sdY1 of=/dev/sdX1
Run Code Online (Sandbox Code Playgroud)
为克隆添加 EFI 记录。根据需要修改 -L 标签。
sudo efibootmgr -c -g -d /dev/sdX -p 1 -L "Ubuntu #2" -l '\EFI\ubuntu\grubx64.efi'
Run Code Online (Sandbox Code Playgroud)
现在,重新启动系统应该会恢复正常(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) 手动重新组装阵列来挽救这种情况,但是......我在某处搞砸了。相反,当我用睡眠脚本重新运行这个测试时(是的,我确实第 n 次从顶部启动了 HOWTO...),系统确实启动了。阵列处于降级模式,我可以手动重新添加/dev/sdb[23]
分区,而无需任何额外的 USB 记忆棒。我不知道为什么 sleep 脚本有效而rootdelay
它没有。也许mdadm
会被两个稍微不同步的组件设备弄糊涂,但我认为mdadm
旨在处理这个问题。无论如何,由于睡眠脚本有效,我坚持使用它。
可以说,移除一个完全健康的 RAID 组件设备,将 RAID 重新启动到降级模式,然后重新添加组件设备是一种不切实际的情况:现实情况是一个设备出现故障并被新设备替换, 减少mdadm
混淆的机会。我同意这个论点。但是,除了实际禁用某些硬件之外,我不知道如何测试系统如何容忍硬件故障!在测试之后,我想回到一个冗余的工作系统。(好吧,我可以将我的第二个 SSD 连接到另一台机器上并在重新添加之前刷卡,但这是不可行的。)
总结:据我所知,该rootdelay
解决方案是干净的,比非降级启动的睡眠脚本更快,并且应该适用于真正的驱动器故障/更换场景。但是,我不知道一种可行的方法来测试它。所以,暂时我会坚持丑陋的睡眠脚本。
归档时间: |
|
查看次数: |
34387 次 |
最近记录: |