У меня есть один жесткий диск со следующей конфигурацией разделов:
- sda1&2 — это разделы Windows
- sda4 — расширенный раздел, содержащий логические разделы sda5&6
- sda5 — раздел подкачки для Ubuntu
- sda6 — корневой раздел Ubuntu (версия 20.04)
- sda3 — это раздел, содержащий только файлы grub, компьютер загружается отсюда, а затем последовательно загружает загрузчики Windows или Ubuntu в зависимости от того, что выбрано в меню grub.
В принципе, я пытался настроить меню grub с помощью Grub Customizer, графического интерфейса для редактирования файлов конфигурации grub и генерации grub.cfg. Несмотря на то, что мне удалось настроить его с другой длительностью тайм-аута и фоновым изображением, после выбора загрузки Ubuntu он в конечном итоге зависает, показывая следующий журнал "[ OK ]" (я не знаю, как его назвать):
Обратите внимание, что на этом этапе я все еще могу войти в систему без графического интерфейса, используя ctrl+alt+f2.
Я использовал команду diff, чтобы убедиться, что Grub Customizer генерирует тот же grub.cfg, что и команда grub-mkconfig (почти эквивалентно update-grub согласноэто обсуждение), так что проблема была изолирована от самой конфигурации grub. После использования kdiff3 и обширных экспериментов я обнаружил, что если я вручную изменю пункт меню ubuntu в grub.cfg (тот, что на разделе 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 дает какие-либо результаты
- найти правильные параметры конфигурации grub, которые работают с «45s», чтобы мне не пришлось редактировать grub.cfg вручную каждый раз, когда я захочу его настроить.
ОБНОВЛЕНИЕ 11:31 UTC+2, 9/9/20: Всего час назад я скачал новое ядро linux (5.4.0-47) и попытался использовать его для загрузки, но возникла та же проблема, что и с 5.4.0-45. Поэтому я отредактировал grub.cfg обратно до 5.4.0-42. Так что теперь у меня есть 3 разных ядра, доступных для использования: 5.4.0-{42,45,47}. Просто мысль, но учитывая, что рабочий стол gnome, судя по журналу загрузки "[OK]", запускается успешно (до сих пор не знаю, как его зовут), разве это не главный подозреваемый? Это и сбой демона nvidia ближе к началу журнала.
ОБНОВЛЕНИЕ 13:14 UTC+2 9/9/20: Вот результат sudo systemctl status nvdia-persistenced.service
после неудачной загрузки графического интерфейса:
● 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 помогли.
Предположив, что виноват драйвер nvidia, я выполнил рискованный, но выгодный маневр, запустив этот скрипт (слегка измененную версию одного найденного скрипта).здесь) чтобы удалить все драйверы nvidia и установить новейшие из репозиториев ubuntu:
#!/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, если необходимо.