OS に依存しない grub パーティションが、古いカーネル バージョンを使用すると Ubuntu に正しく起動できるのに、新しいカーネル バージョンを使用すると起動できないのはなぜですか?

OS に依存しない grub パーティションが、古いカーネル バージョンを使用すると Ubuntu に正しく起動できるのに、新しいカーネル バージョンを使用すると起動できないのはなぜですか?

次のパーティション設定を持つ単一のハードドライブがあります。 ここに画像の説明を入力してください

  • sda1と2はWindowsパーティションです
  • sda4は論理パーティションsda5と6を含む拡張パーティションです。
  • sda5はUbuntuのスワップパーティションです
  • sda6 は Ubuntu のルート パーティションです (バージョン 20.04)
  • sda3はgrubファイルだけを含むパーティションで、コンピュータはここから起動し、grubメニューで選択された内容に応じてWindowsまたはUbuntuブートローダをチェーンロードします。

基本的に、私は 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 パーティション上のもの) の ubuntu メニューエントリを次のように手動で変更すると、必要なカスタマイズを維持しながら問題が解決されることが分かりました。

ブート不良:

### 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: ちょうど 1 時間前に新しい 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/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 リポジトリから最新のドライバーをインストールすると、問題は解決しました。

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 ドライバーをインストールした後、古いカーネル (5.0.4-42) がどのように動作するかを確認するために、最新のカーネル (5.0.4-47) を使用するように grub.cfg を変更しませんでした。その結果、質問で説明されているのと同じエラーが発生しました。その後、grub.cfg のカーネル バージョンを 5.0.4-47 に切り替え、ようやく gnome デスクトップを正しく起動できるようになりました。

私の結論は、結局のところ、この問題は Linux カーネルと NVIDIA グラフィック ドライバーの非互換性によって発生したということです。同様の問題がある場合は、Linux カーネルとグラフィック ドライバーの両方を最新の状態に保ち、必要に応じて NVIDIA ドライバーを再インストールすることをお勧めします。

関連情報