最近将我的服务器从 Ubuntu 14.04 升级到 18.04。在经历了通常的 UEFI 导致 grub 安装错误之后,我终于安装了操作系统。但是 UEFI 不会将安装了操作系统的驱动器视为启动选项。如果我手动选择驱动器,它就会正常启动。考虑到它之前可以正常工作,我假设驱动器本身的某些配置不正确。
信息
尽管 UEFI 是该系统上的一个选项,但操作系统似乎看不到它:
# efibootmgr
EFI variables are not supported on this system.
操作系统安装在 /dev/sdg
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 7.8G 0 7.8G 0% /dev
tmpfs 1.6G 1.5M 1.6G 1% /run
/dev/sdg4 45G 9.3G 34G 22% /
tmpfs 7.8G 8.0K 7.8G 1% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/sdg2 33G 58M 31G 1% /home
/dev/sdg3 33G 2.4G 29G 8% /srv
/dev/loop0 91M 91M 0 100% /snap/core/6350
/dev/loop1 98M 98M 0 100% /snap/docker/384
/dev/loop2 90M 90M 0 100% /snap/core/7917
/dev/md127 26T 15T 11T 59% /mnt/storage
tmpfs 1.6G 0 1.6G 0% /run/user/1000
我切换到 MBR,认为它可能与 GPT 有问题。
# fdisk /dev/sdg
Welcome to fdisk (util-linux 2.31.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk /dev/sdg: 111.8 GiB, 120034123776 bytes, 234441648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
Device Boot Start End Sectors Size Id Type
/dev/sdg1 2048 4095 2048 1M ef EFI (FAT-12/16/32)
/dev/sdg2 4096 69210111 69206016 33G 83 Linux
/dev/sdg3 69210112 138416127 69206016 33G 83 Linux
/dev/sdg4 * 138416128 234438655 96022528 45.8G 83 Linux
我不能 100% 确定第一个分区的类型是否正确,但当我手动选择驱动器时,一切都能正常启动。您觉得如何?
借助 grawity,可以进行更多调试。lsblk 和 blkid 似乎不知道第一个分区是什么。但是,gparted 将其显示为:
grub2 核心镜像
您认为那应该是 /boot 吗?
答案1
如果我手动选择潜水,它就能正常启动
在 UEFI 启动菜单中,全磁盘条目几乎总是代表“传统模式”或 BIOS 样式的启动。您不是从 EFI 系统分区启动;而是从 MBR 启动代码启动。
这就是为什么操作系统无法访问 EFI 变量的原因——当操作系统以传统/BIOS/CSM 模式启动时,无法调用 EFI 运行时服务。
我不能 100% 确定第一个分区的类型是否正确
分区表条目是正确的(EF
对于 MBR 表,尽管你也可以使用 GPT – 毕竟,GPT是最初是 EFI 的东西)。
但是,分区内容不清楚:您的df
输出没有显示它已安装在任何地方,因此不知道它是否使用正确的文件系统进行格式化,也不知道它里面是否有正确的文件。
为 UEFI 安装 GRUB
lsblk -f
通过运行或确保 EFI 分区实际上已格式化为 FAT32 sudo blkid -c /dev/null
。(忽略 fdisk 显示的内容。)
将其挂载到/boot/efi
,然后安装 EFI 版本的 GRUB:
grub-install --target=x86_64-efi --removable --efi-directory=/boot/efi
由于您目前无法访问 EFI 启动变量,因此该--removable
模式将改为在“后备”位置 (EFI/Boot/Bootx64.efi) 设置 GRUB。这应该允许磁盘显示为UEFI 模式固件启动菜单中的条目。
重启后,根据主板的不同,您可能会看到两个条目,例如:
Disk 0: Samsung 1234567
UEFI: Disk 0: Samsung 1234567
这里第一个条目用于 BIOS 启动,第二个条目用于使用“fallback”Bootx64.efi 加载程序的 UEFI 启动。如果出现第二个条目,请选择它。
如果有疑问,请仔细研究 UEFI 设置并禁用所有“CSM”或“传统启动”选项,或将启动模式设置为“仅 UEFI”(选项名称有所不同)。
一旦您能够使用访问 EFI 变量efibootmgr
,请重新安装 GRUB没有选项--removable
,以便设置正确的启动项。
更新
但是,gparted 将其显示为“grub2 core.img”
您认为那应该是 /boot 吗?
不。这看起来非常像将 GRUB 的 BIOS 版本安装到 GPT 分区时使用的“BIOS 启动分区”。在 GPT 磁盘上,它的分区类型与“EFI 系统分区”不同,而在 MBR 磁盘上,它根本不使用。
(不,“BIOS 启动分区”不是 /boot;它根本没有文件系统,只有 GRUB 启动代码的原始块,引导它进入实际的启动 /boot。
另外,再次查看您之前的fdisk
输出,它的大小只有 1 MB - 适合 GRUB 的“BIOS 启动分区”,但对于“EFI 系统分区”来说太小了(应该在 100-500 MB 范围内)。
简而言之,您的分区布局仅适用于 BIOS 模式安装,不适用于 UEFI 模式,仅设置新分区类型无法解决这个问题。您最初提到的“UEFI 看不到操作系统”完全正常,因为曾是磁盘上没有兼容 UEFI 的操作系统。(由于是 Ubuntu,我猜你遇到这个问题是因为当时的 Ubuntu 14.04 安装程序还不支持 UEFI 安装。)
您可以保持系统原样,因为它在 BIOS 模式下正常启动。但如果您确实想将其转换为 UEFI 模式,则需要:
- 将当前分区 1 的类型更改为其他类型。(GRUB 的 BIOS 启动分区没有 MBR 分区类型 ID,因此随便选一个 - 或者直接删除该分区,因为 GRUB 无论如何都不使用它。)
- 创建一个新的~200 MB 分区作为 EFI 系统分区。(它可以位于磁盘上的任何位置,因此只需通过 GParted 缩小现有分区即可腾出空间。)
- 确保新的EFI 系统分区具有正确的类型 ID。将其格式化为 FAT32,配置 fstab 以将其挂载在 /boot/efi 上。
- 按照之前发布的“安装 GRUB”说明进行操作。
答案2
终于有时间回过头来解决这个问题了。当然,最初的问题并没有得到解决,我没有修复遗留的启动问题,而是倾向于通过 EFI 来解决问题。我尝试了下面给出的方法,并将其与其他问题进行了交叉引用。我发现其他一些资源很有帮助:
- https://serverfault.com/questions/963178/how-do-i-convert-my-linux-disk-from-mbr-to-gpt-with-uefi
- https://askubuntu.com/questions/254491/failed-to-get-canonical-path-of-cow
最后卡在了“错误:没有这样的设备” grub 错误上。这可能是由于我在 MBR 和 GPT 之间来回切换时 fstab 文件没有更新。但我能够使用 Boot-Repair 让一切正常运行(并在将文件系统挂载为只读时修复 fstab 文件):
https://help.ubuntu.com/community/Boot-Repair
看来 UEFI/grub 不会随着时间的推移而变得更好。我的结论是:
- 在计算机上安装操作系统之前,务必禁用安全启动。
- 安装操作系统之前,请禁用 BIOS 中的向后兼容性。
- 所有优秀的 Grub 文档似乎都包含相同的“只需运行此命令”建议。您不太可能了解实际错误所在。这引出了我们的问题...
- 当安装程序失败时(因为它总是失败)请首先使用启动修复工具。