- sda1&2 是 Windows 分区
- sda4 是包含逻辑分区 sda5&6 的扩展分区
- sda5 是 ubuntu 的交换分区
- sda6 是根 ubuntu 分区(版本 20.04)
- sda3 是一个仅包含 grub 文件的分区,计算机从此处启动,然后根据 grub 菜单中选择的内容链式加载 windows 或 ubuntu 引导加载程序
基本上,我一直在尝试使用 Grub Customizer(用于编辑 grub 配置文件和生成 grub.cfg 的 GUI)自定义我的 grub 菜单。虽然成功地使用不同的超时时间和背景图像对其进行了自定义,但在选择启动到 Ubuntu 后,它最终卡住了,显示以下“[ OK ]”日志(我不知道如何调用它):
请注意,此时我仍然可以通过 ctrl+alt+f2 无需 GUI 登录。
我使用 diff 命令确认 Grub Customizer 生成的 grub.cfg 与 grub-mkconfig 命令相同(根据这次讨论),这样就将问题隔离到了 grub 配置本身。在使用 kdiff3 并进行大量实验后,我发现,如果我以以下方式手动更改 grub.cfg 中的 ubuntu 菜单项(当然是 grub 分区上的菜单项),问题就会消失,同时保留所需的自定义设置:
启动故障:
### BEGIN /etc/grub.d/10_linux_proxy ###
function gfxmode {
set gfxpayload="${1}"
if [ "${1}" = "keep" ]; then
set vt_handoff=vt.handoff=7
else
set vt_handoff=
fi
}
if [ "${recordfail}" != 1 ]; then
if [ -e ${prefix}/gfxblacklist.txt ]; then
if hwmatch ${prefix}/gfxblacklist.txt 3; then
if [ ${match} = 0 ]; then
set linux_gfx_mode=keep
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=keep
fi
else
set linux_gfx_mode=text
fi
export linux_gfx_mode
menuentry "Ubuntu" --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-c1cf0131-85a4-4147-b74c-38df34cd47cc' {
recordfail
savedefault
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_msdos
insmod ext2
set root='hd0,msdos6'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos6 --hint-efi=hd0,msdos6 --hint-baremetal=ahci0,msdos6 --hint='hd0,msdos6' c1cf0131-85a4-4147-b74c-38df34cd47cc
else
search --no-floppy --fs-uuid --set=root c1cf0131-85a4-4147-b74c-38df34cd47cc
fi
linux /boot/vmlinuz-5.4.0-45-generic root=UUID=c1cf0131-85a4-4147-b74c-38df34cd47cc ro acpi_sleep=nonvs quiet splash $vt_handoff
initrd /boot/initrd.img-5.4.0-45-generic
}
### END /etc/grub.d/10_linux_proxy ###
工作启动:
...
linux /boot/vmlinuz-5.4.0-42-generic root=UUID=c1cf0131-85a4-4147-b74c-38df34cd47cc ro acpi_sleep=nonvs quiet splash $vt_handoff
initrd /boot/initrd.img-5.4.0-42-generic
}
### END /etc/grub.d/10_linux_proxy ###
(我只是简单地将 vmlinuz-5.4.0-45-generic 和 initrd.img-5.4.0-45-generic 分别更改为 vmlinuz-5.4.0-42-generic 和 initrd.img-5.4.0-42-generic)
我想:
- 知道使用 5.4.0-42 图像而不是 5.4.0-45 图像有何不同
- 找到与“45s”一起使用的正确的 grub 配置选项,这样我就不必每次想要自定义 grub.cfg 时都手动编辑它。
更新时间:UTC+2, 9/9/20 11:31:就在一小时前,我下载了新的 Linux 内核 (5.4.0-47),并尝试使用它进行启动,但出现了与 5.4.0-45 相同的问题。因此,我将 grub.cfg 编辑回 5.4.0-42。因此,现在我可以使用 3 个不同的内核:5.4.0-{42,45,47}。只是一个想法,但考虑到根据启动“[OK]”日志(仍然不知道它的名字是什么),gnome 桌面似乎可以成功启动,这难道不是主要嫌疑犯吗?此外,nvidia 守护进程在日志顶部附近失败。
更新时间 13:14 UTC+2 9/9/20sudo systemctl status nvdia-persistenced.service
:这是GUI 启动失败后的结果:
● nvidia-persistenced.service - NVIDIA Persistence Daemon
Loaded: loaded (/lib/systemd/system/nvidia-persistenced.service; static; vendor preset: enabled)
Active: failed (Result: exit-code) since Wed 2020-09-09 11:54:44 EEST; 1min 43s ago
Process: 876 ExecStart=/usr/bin/nvidia-persistenced --user nvidia-persistenced --no-persistence-mode --verbose (code=exited, status=1/FAILURE)
Process: 896 ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced (code=exited, status=0/SUCCESS)
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[882]: Failed to query NVIDIA devices. Please ensure that the NVIDIA device files (/dev/nvidia*) exist, and that user 126 has read and write permissions for those files.
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[882]: PID file unlocked.
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[882]: PID file closed.
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[882]: The daemon no longer has permission to remove its runtime data directory /var/run/nvidia-persistenced
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[876]: nvidia-persistenced failed to initialize. Check syslog for more details.
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[882]: Shutdown (882)
Σεπ 09 11:54:42 george-Aspire-E5-571G systemd[1]: Starting NVIDIA Persistence Daemon...
Σεπ 09 11:54:43 george-Aspire-E5-571G systemd[1]: nvidia-persistenced.service: Control process exited, code=exited, status=1/FAILURE
Σεπ 09 11:54:44 george-Aspire-E5-571G systemd[1]: nvidia-persistenced.service: Failed with result 'exit-code'.
Σεπ 09 11:54:44 george-Aspire-E5-571G systemd[1]: Failed to start NVIDIA Persistence Daemon.
答案1
原来我运行的是较旧的 nvidia 驱动程序版本,它与较新的内核不兼容。删除旧的 nvidia 驱动程序并从 ubuntu repos 安装最新的驱动程序就可以了。
假设 nvidia 驱动程序有问题,我通过运行此脚本(对发现的脚本稍作修改)执行了高风险、高回报的操作这里)卸载所有 nvidia 驱动程序并从 ubuntu repos 安装最新的驱动程序:
#!/bin/bash
sudo apt remove --purge '^nvidia-.*' -y
sudo apt install ubuntu-desktop -y
sudo apt --purge remove "*cublas*" "cuda*" -y
sudo apt --purge remove "*nvidia*" -y
sudo add-apt-repository --remove ppa:graphics-drivers/ppa -y
sudo trash /etc/X11/xorg.conf
sudo apt autoremove -y
sudo ubuntu-drivers devices
sudo ubuntu-drivers autoinstall
sudo reboot
安装新的 nvidia 驱动程序后,我没有修改 grub.cfg 以使用最新内核 (5.0.4-47),以查看旧内核 (5.0.4-42) 的工作情况。这导致了与问题中描述的相同的错误。之后,我将 grub.cfg 中的内核版本切换为 5.0.4-47,终于可以正确启动到 gnome 桌面了。
我的结论是,问题毕竟是由 Linux 内核和 nvidia 显卡驱动程序不兼容引起的。如果您遇到类似问题,我建议您将 Linux 内核和显卡驱动程序保持为最新版本,必要时重新安装 nvidia 驱动程序。