OS 독립적인 grub 파티션이 이전 커널 버전을 사용하면 Ubuntu로 올바르게 부팅할 수 있지만 최신 커널 버전에서는 부팅할 수 없는 이유는 무엇입니까?

OS 독립적인 grub 파티션이 이전 커널 버전을 사용하면 Ubuntu로 올바르게 부팅할 수 있지만 최신 커널 버전에서는 부팅할 수 없는 이유는 무엇입니까?

다음과 같은 파티션 설정을 갖춘 단일 하드 드라이브가 있습니다. 여기에 이미지 설명을 입력하세요

  • sda1&2는 Windows 파티션입니다.
  • sda4는 논리 파티션 sda5&6을 포함하는 확장 파티션입니다.
  • sda5는 우분투용 스왑 파티션입니다.
  • sda6은 루트 우분투 파티션입니다(버전 20.04).
  • sda3는 grub 파일만 포함하는 파티션입니다. 여기에서 컴퓨터가 부팅된 다음 grub 메뉴에서 선택한 항목에 따라 창 또는 우분투 부트로더를 체인로드합니다.

기본적으로 저는 grub 구성 파일을 편집하고 grub.cfg를 생성하기 위한 GUI인 Grub Customizer를 사용하여 grub 메뉴를 사용자 정의하려고 노력해 왔습니다. 다른 시간 초과 기간과 배경 이미지를 사용하여 성공적으로 사용자 정의했지만 Ubuntu로 부팅하기로 선택한 후 결국 다음 "[ OK ]" 로그가 표시되면서 멈추게 됩니다(호칭 방법을 모르겠습니다). 여기에 이미지 설명을 입력하세요

이 시점에서는 Ctrl+Alt+F2를 사용하여 GUI 없이도 로그인할 수 있습니다.

diff 명령을 사용하여 Grub Customizer가 grub-mkconfig 명령과 동일한 grub.cfg를 생성하는지 확인했습니다(아래에 따르면 update-grub과 거의 동일함).이 토론), 문제를 grub 구성 자체로 격리했습니다. kdiff3을 사용하고 광범위하게 실험한 후에 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-45 이미지 대신 5.4.0-42 이미지를 사용하면 어떤 차이가 있는지 알아보세요.
  2. "45s"에서 작동하는 올바른 grub 구성 옵션을 찾으면 grub.cfg를 사용자 정의할 때마다 수동으로 편집할 필요가 없습니다.

업데이트 11:31 UTC+2, 9/9/20: 불과 한 시간 전에 새 Linux 커널(5.4.0-47)을 다운로드하고 이를 사용하여 부팅을 시도했지만 5.4.0-45와 동일한 문제가 나타났습니다. 그래서 grub.cfg를 다시 5.4.0-42로 편집했습니다. 이제 5.4.0-{42,45,47}의 3가지 커널을 사용할 수 있습니다. 그냥 생각해보면 부팅 "[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 드라이버를 제거하고 우분투 저장소에서 최신 드라이버를 설치하는 것이 성공했습니다.

nvidia 드라이버에 결함이 있다고 가정하고 이 스크립트를 실행하여 고위험, 고수익 전략을 수행했습니다(발견된 스크립트의 약간 수정된 버전).여기) 모든 Nvidia 드라이버를 제거하고 우분투 저장소에서 최신 드라이버를 설치하려면 다음을 수행하세요.

#!/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 드라이버를 설치한 후 이전 커널(5.0.4-42)이 어떻게 작동하는지 확인하기 위해 최신 커널(5.0.4-47)을 사용하도록 grub.cfg를 수정하지 않았습니다. 그 결과 질문에 설명된 것과 동일한 오류가 발생했습니다. 그 후 grub.cfg의 커널 버전을 5.0.4-47로 전환했고 마침내 gnome 데스크탑으로 올바르게 부팅할 수 있었습니다.

내 결론은 결국 리눅스 커널과 엔비디아 그래픽 드라이버 간의 비호환성으로 인해 문제가 발생했다는 것입니다. 비슷한 문제가 있는 경우 Linux 커널과 그래픽 드라이버를 모두 최신 상태로 유지하고 필요한 경우 Nvidia 드라이버를 다시 설치하는 것이 좋습니다.

관련 정보