由于更新 Grub-pc,自动系统更新期间陷入无限循环

由于更新 Grub-pc,自动系统更新期间陷入无限循环

执行系统更新时(以 GUI 方式启动),我在更新 grub-pc 时陷入了无限循环。请参阅下面的详细信息。

出现问题的系统及其设置方式

我的电脑是双启动的 Windows 10 / Xubuntu 18.04。它在 DOS 分区的 SSD 上有 7 个分区,并且在启动期间使用 EFI 机制:

名称标签 FSTYPE 挂载点
sda
═─sda1 系统保留 ntfs
═─sda2 SSD-Windows-Sys ntfs
═─sda3 SSD-EFI vfat /boot/efi
═─sda4
═─sda5 SSD-Linux-Home ext4 /home
═─sda6 SSD-Windows-Home ntfs
└─sda7 SSD-Linux-Sys ext4 /

几年前我买了这台电脑时,它只有 Windows 10 和系统保留分区,现在已变为 /dev/sda1。在调整分区大小并为 Windows home 创建单独的分区后,我安装了 Xubuntu 16.04,在此过程中,我创建了一个 Linux 系统分区、一个交换分区和一个 Linux-Home 分区。当我将所有内容克隆到 SSD 以替换我之前的 HDD 时,我丢弃了 Linux 交换分区(在执行中间步骤以修复无法正常工作的启动设置之后)。

在将系统升级到 Xubuntu 18.04 时,我遇到了很多麻烦:我没有选择将它与 Windows 一起安装。我不得不在安装过程中使用“其他”方式。

结果是计算机根本无法启动,或者只能启动到 Windows 或只能启动到 Linux。但 /dev/sda7 在我看来像是一个系统分区。

可能在 Xubuntu 16.04 中,系统保留分区也用作 ESP,尽管它的格式为 ntfs。其当前内容(可能包括之前使用 Xubuntu 16.04 的双启动安装的剩余内容)如下:

$ tree -L 3 /media/verwalter/System-reserviert/
/media/v/System-reserviert/
├── Boot
│   ├── BCD
│   ├── BCD.LOG
│   ├── BCD.LOG1
│   ├── BCD.LOG2
│   ├── bg-BG
│   │   └── bootmgr.exe.mui
│   ├── BOOTSTAT.DAT
│   ├── bootuwf.dll
│   ├── bootvhd.dll
│   ├── cs-CZ
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── da-DK
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── de-DE
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── el-GR
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── en-GB
│   │   └── bootmgr.exe.mui
│   ├── en-US
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── es-ES
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── es-MX
│   │   └── bootmgr.exe.mui
│   ├── et-EE
│   │   └── bootmgr.exe.mui
│   ├── fi-FI
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── Fonts
│   │   ├── chs_boot.ttf
│   │   ├── cht_boot.ttf
│   │   ├── jpn_boot.ttf
│   │   ├── kor_boot.ttf
│   │   ├── malgun_boot.ttf
│   │   ├── malgunn_boot.ttf
│   │   ├── meiryo_boot.ttf
│   │   ├── meiryon_boot.ttf
│   │   ├── msjh_boot.ttf
│   │   ├── msjhn_boot.ttf
│   │   ├── msyh_boot.ttf
│   │   ├── msyhn_boot.ttf
│   │   ├── segmono_boot.ttf
│   │   ├── segoen_slboot.ttf
│   │   ├── segoe_slboot.ttf
│   │   └── wgl4_boot.ttf
│   ├── fr-CA
│   │   └── bootmgr.exe.mui
│   ├── fr-FR
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── hr-HR
│   │   └── bootmgr.exe.mui
│   ├── hu-HU
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── it-IT
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── ja-JP
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── ko-KR
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── lt-LT
│   │   └── bootmgr.exe.mui
│   ├── lv-LV
│   │   └── bootmgr.exe.mui
│   ├── memtest.exe
│   ├── nb-NO
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── nl-NL
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── pl-PL
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── pt-BR
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── pt-PT
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── qps-ploc
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── qps-plocm
│   │   └── bootmgr.exe.mui
│   ├── Resources
│   │   ├── bootres.dll
│   │   └── de-DE
│   ├── ro-RO
│   │   └── bootmgr.exe.mui
│   ├── ru-RU
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── sk-SK
│   │   └── bootmgr.exe.mui
│   ├── sl-SI
│   │   └── bootmgr.exe.mui
│   ├── sr-Latn-CS
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── sr-Latn-RS
│   │   └── bootmgr.exe.mui
│   ├── sv-SE
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── tr-TR
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── uk-UA
│   │   └── bootmgr.exe.mui
│   ├── zh-CN
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   ├── zh-HK
│   │   ├── bootmgr.exe.mui
│   │   └── memtest.exe.mui
│   └── zh-TW
│       ├── bootmgr.exe.mui
│       └── memtest.exe.mui
├── bootmgr
├── BOOTNXT
├── BOOTSECT.BAK
├── EFI
│   ├── Boot
│   │   ├── bkpbootx64.efi
│   │   └── bootx64.efi
│   ├── Microsoft
│   │   ├── Boot
│   │   └── Recovery
│   └── ubuntu
│       └── shimx64.efi
├── Recovery
│   └── Logs
├── $RECYCLE.BIN
│   ├── S-1-5-21-1255711166-3792583174-1275079413-1008
│   │   └── desktop.ini
│   └── S-1-5-21-1255711166-3792583174-1275079413-1009
│       └── desktop.ini
├── System Volume Information
│   ├── Chkdsk
│   │   ├── Chkdsk20190923203942.log
│   │   └── Chkdsk20190923204533.log
│   ├── IndexerVolumeGuid
│   ├── tracking.log
│   └── WPSettings.dat
├── $WINRE_BACKUP_PARTITION.MARKER
└── WinSich
    └── W530

58 directories, 103 files

最有可能的是,安装过程(无处不在)没有将其识别为 EFI 系统分区(ESP),因此创建了不正确的启动安装。

最后,我手动创建了一个 ESP,格式为 VFAT。在上次安装过程中,我在 GpartEd 类似部分中手动将此分区 /dev/sda3/ 标记为“用作 EFI 系统分区”。这给了它 esp 标志。启动标志是 /dev/sda1(上面已经显示了它上面的内容)。

但尽管进行了这些设置,系统仍无法正常启动,让我在 Grub 菜单中自行选择要启动的系统。EFI 分区中缺少 Grub 引导加载程序。

我最终通过使用 ISO 映像安装棒解决了这个问题,我曾将 Xubuntu 18.04 安装到 /dev/sda7 上。我这样做了(按照提示如何将 GRUB 重新安装到 EFI 分区?):

sudo mount /dev/sda7 /mnt
sudo mount /dev/sda3 /mnt/boot/efi
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i;
mount
sudo chroot /mnt
grub-install /dev/sda
update-grub
exit

最后我得到了一个系统,它首先显示一个 Grub 菜单并让我选择要启动的操作系统。

系统更新期间无限循环

我使用 GUI 方式进行了常规系统更新。其中包括 Linux-firmware、grub-efi-amd64.bin、grub-pc.bin。出现了这个菜单。

grub 安装的对话设备

当我将鼠标放在带有两个复选框的右侧子窗口上时,出现了一个说明,说明已对 grub-pc 进行了升级。我应该选择要为哪些设备自动执行 grub-install。在大多数情况下,让它自动运行是合理的,这样可以避免安装的 GRUB 映像不适合 Grub 模块或 grub.cfg。如果我不确定 BIOS 使用哪个设备进行启动,最好在所有设备中安装 GRUB。还有一个提示,关于可以将 GRUB 安装到分区的启动块中。这里提供了一些合适的分区。然而,这会迫使 GRUB 使用不太可靠的阻止列表机制,因此不推荐使用。

由于我的安装过程(见上文),我首先选中了两个复选标记。但随后我收到了以下错误消息:

i-386-pc 将在您的平台上安装 grub-install:错误:对于 /,没有 GRUB 安装程序。对您的设备地图进行检查。

伴随此对话框告诉我无法将 Grub 写入启动设备并询问我是否继续。它伴随一个复选框。

帮助功能解释说,GRUB 无法安装在 / 中。如果我继续,计算机可能无法正常启动。因此我没有选中问题前面的复选框。

这使我返回到第一个询问 GRUB 安装设备的对话框。

上次勾选了两个框后,我首先取消了第一个框的勾选。这又让我进入了后续对话(见上文)。我没有像以前一样勾选问题前面的勾选,这让我回到了之前一直停留的地方。

这次,我的选择恰恰相反,这又让我陷入了同样的第二次对话(见上文)。因此,除非我采取可能有害的解决方法,否则我将陷入无限循环选择提供的两个分区中的任何一个,并选中“配置 grub-pc”中的复选框。

那么我该怎么办呢?我不想让我的系统完全无法启动或者不让我选择启动哪个系统。

答案1

我让电脑连续运行了四天,没有关机。最后我还是不得不关机。

下次重启时,我进入 GRUB 菜单并可以选择启动 Xubuntu 还是 Windows 10。所以在这种情况下,计算机可能无法正常启动的威胁是错误的。我很高兴!

我查看了已安装的 Xubuntu 的 GRUB 版本:它是 2.02-2ubuntu8.14。在 USB 上,我之前从同一个 ISO 映像安装了 Xubuntu 18.04,我的是 grub-common 2.02-2ubuntu8.13。显然,这在我的 SSD 上已经发生了变化。

我还查看了 ntfs 格式的分区 /dev/sda1 上标有“System-reserviert”的文件和目录的文件日期:/media/username/System-reserviert/Boot/bg-BG 和其他特定于语言的文件都有我关闭系统当天的时间戳。但仔细查看它们和 /var/log/kern*.log 以查看我最终关闭计算机的时间后,我发现在这些时间戳生成之前至少发生了两次 Xubuntu 启动事件。我确信在生成这些时间戳之前,我也将计算机启动到 Windows 中。

查看 /boot/efi/EFI/ubuntu/(即已安装的 ESP 分区 /dev/sda3),我发现最近的时间戳来自我关闭系统的那天(但在此事件之前)。/boot/efi/EFI/ubuntu/grub.cfg 也带有此时间戳(关闭系统之前的时间戳)。/boot/EFI/ubuntu 中的所有文件实际上都有升级后关闭之前的时间戳,这导致了这个问题。

还有一件奇怪的事情:有一个空目录 /boot/efi/EFI/microsoft/boot。此目录的文件日期为 2019-11-11,因此在本次更新之前它就在那里。这个目录有什么用?里面是不是少了什么?

一方面,我很幸运没有遇到启动问题。另一方面,GRUB 的设置中肯定存在错误,至少在安装过程普遍性方面存在错误,它没有为我提供与现有 Windows 10 一起安装 Xubuntu 的选项。此外,值得一看的是,为什么我需要一个特殊的 VFAT 格式的 Efi 系统分区 (esp),以及为什么 ntfs 格式的 ntfs 分区“系统保留”在 Xubuntu 18.04 下不再能用于此目的。显然,这在 Xubuntu 16.04 中是可能的。

相关内容