Arch Linuxを実行しているAlienware Aurora R7を持っています。シャットダウン時にカーネルパニックが発生し、パニックメッセージに次のようなメッセージが表示されます(タイムスタンプは省略されます)。
BUG: Unable to handle kernel NULL pointer dereference at (null)
IP: i2c_dw_isr+0x3ef/0x6d0
PGD 0 P4D 0
Oops: 0000 [#1] PREEMPT SMP PTI
さまざまなソース( 1 、 2 )から、これはi2c-designware-core
モジュールに関連しているようで、回避策はそれをブラックリストに登録しています。しかし、最近のカーネル(4.10以上のようです)では、これはモジュールとしてビルドされていないようです:
# uname -srv
Linux 4.15.2-2-Arch #1 SMP PREEMPT Thu Feb 8 18:54:52 UTC 2018
# zgrep DESIGNWARE /proc/config.gz
CONFIG_I2C_DESIGNWARE_CORE=y
CONFIG_I2C_DESIGNWARE_PLATFORM=y
CONFIG_I2C_DESIGNWARE_SLAVE=y
CONFIG_I2C_DESIGNWARE_PCI=m
CONFIG_I2C_DESIGNWARE_BAYTRAIL=y
CONFIG_SPI_DESIGNWARE=m
CONFIG_SND_DESIGNWARE_I2S=m
CONFIG_SND_DESIGNWARE_PCM=y
だから私はパニック時にカーネルを再起動させることに頼りました:
# cat /proc/cmdline
root=UUID=e5018f7e-5838-4a47-b146-fc1614673356 rw initrd=/intel-ucode.img initrd=/initramfs-linux.img panic=10 sysrq_always_enabled=1 printk.devkmsg=on
(/proc/cmdline
の奇数パスは、efibootmgr
を使用して作成されたエントリを使用して、UEFIから直接ブートするためです。パスは/boot
をルートとします。ここで、my ESPがマウントされています。)
これはタッチパッド用のようですが、タッチパッドを持っていないので取得できません。これを無効にするにはどうすればよいですか? カスタムカーネルを構築する する必要がありますか?
linux-lts
も4.10(現在は4.14)よりも新しいため、古いカーネルをインストールする簡単な方法もないようで、ブラックリストが機能すると思われます。
カーネルパラメータとしてnolapic
を使用すると、シャットダウンパニックの問題は解決しますが、システムが起動してから数分後にフリーズするため、使用できません。
カーネルソースを読んだ後、ブラックリストに登録する必要がある関数を見つけました!
initcall_blacklist
についてのヒントを提供してくれた Stephen Kitt に感謝します。
カーネルコマンドラインにinitcall_blacklist=dw_i2c_init_driver
を追加します。これはカーネル4.15.0で動作します。
この答えを見つけるだれでものために。これを行うには、/etc/default/grub
を編集します。
Sudo -H gedit /etc/default/grub
。GRUB_CMDLINE_LINUX_DEFAULT
:GRUB_CMDLINE_LINUX_DEFAULT="… initcall_blacklist=dw_i2c_init_driver"
に追加します。Sudo update-grub
。カーネルコマンドラインにinitcall_blacklist=i2c_dw_init_master
を追加すると、ブート中にDesignwareドライバーが初期化されなくなり、問題が完全に回避されます。
initcall_blacklist
の簡単な説明については カーネルパラメータ を、より有用な背景情報については パッチ周辺のスレッド を参照してください。
シャットダウンのさまざまな方法を試してみると、カーネルパラメータとしてsystemd.unit=poweroff.target
を使用してLinuxをpoweroff
ターゲットで起動しているようですが、正常にシャットダウンします。
そこで、より良い解決策を待つ間、単にシャットダウンするブートエントリを追加しました。これは [〜#〜] grub [〜#〜] (おそらく他のブートローダーを使用)では簡単ですが、UEFI自体を単にシャットダウンする方法を理解できませんでした。そして、AlienwareのUEFI実装は同じファイルの複数のエントリをサポートしていないようです。そのため、vmlinuz-linux
をコピーし、コピーのエントリを追加しました。
cp /boot/vmlinuz-linux /boot/vmlinuz-shutdown
cp /boot/initramfs-linux.img /boot/initramfs-shutdown.img
kernel_opts="root=UUID=e5018f7e-5838-4a47-b146-fc1614673356 ro initrd=/initramfs-shutdown.img systemd.unit=poweroff.target"
efibootmgr --disk /dev/nvme0n1 --part 1 --create --gpt --label "Shutdown" --loader /vmlinuz-shutdown --unicode "$kernel_opts"
ここで、ディスクとパーティションのオプションは私のシステムに固有です。ここで作成されたブートエントリは0001
と番号が付けられたので、off
スクリプトは正常にシャットダウンします。
#! /bin/sh
Sudo efibootmgr -n 0001
reboot
UEFIシャットダウンターゲットを設定する簡単な方法がおそらくあります。