Почему мой независимый от ОС раздел grub может корректно загрузить Ubuntu, используя старую версию ядра, но не может загрузить более новую?

Почему мой независимый от ОС раздел grub может корректно загрузить Ubuntu, используя старую версию ядра, но не может загрузить более новую?

У меня есть один жесткий диск со следующей конфигурацией разделов: введите описание изображения здесь

  • 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 соответственно)

Я хотел бы:

  1. знаю, как использование изображений 5.4.0-42 вместо изображений 5.4.0-45 дает какие-либо результаты
  2. найти правильные параметры конфигурации 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, если необходимо.

Связанный контент