Arch Linuxでカーネルパニックが起こった時にやったこと
普段使っている相棒はArch Linuxをインストールしている。
Ubuntuと違い、提供されるパッケージが最新のものだから使いやすい。
しかし今回pacman -Syu
を実行したところ、多分kernel panic(freeze?、hang up?、違いがわからない)と呼ばれる現象が起こるようになった。
何が起こったかとどう対処したかを書き残す。
ついでにパッケージ全体を一つ前に戻すスクリプトも書いてみた。
最初に
これを読んでいるということは、それっぽい惨劇が起きたのかもしれない。
そんな人はまず落ち着こう。
テンパってパッケージをやたらと消したり、変更を加えすぎると復旧したときに後が怖い。
問題
普段通りに
$ sudo pacman -Syu
した後、頻繁に画面が凍結して、入力を一切受け付けなくなった。
凍結時の特徴はCapsLock
キーのランプやWifiのランプが点滅する。
Ctrl+Alt+F1
とかでコンソールに切り替えようとしてもダメ。
1時間に10回(落とす・点ける)以上電源ボタンを触ったのは初めてで壊れやしないかとヒヤヒヤした。
毎回起動時にジャーナル復元メッセージが出たぜ・・・。
パニックトリガー
パニックする引き金になった動作は以下の通り。
- ネットに繋ぐ(短時間でパニック、特にWifi)
- 普段通りに使う(プログラムのコンパイル・ファイル操作)
- ファイルマネージャ(
pantheon-files
)でUSBをマウント(一発アウト、nautilus
はセーフ)
その他起こった事象
$ dmesg ...(snip)... [drm:i915_gem_idle_work_handler [i915]] *ERROR* Timeout waiting for engines to idle perf: interrupt took too long (3982 > 3935), lowering kernel.perf_event_max_sample_rate to 50100 Direct firmware load for iwlwifi-6000-6.ucode failed with error -2 ...(snip)...
などのエラーが出るようになった。
xmobar
も定期的にセグフォした。
かれこれ2年ほどArch Linuxを使っているが、こんな問題だらけなのは初めてだ。
以下を試してみたが、効果はなし。
- 発生したカーネルメッセージに対してそれぞれ対処
- ファイルマネージャをアンインストール
- ウィンドウマネージャ(
Xmonad
)のダウングレード
最初は入っているソフトがまずいかと思ったが、そうでは無さそうだ。
PC全体が止まること、アップデート以降様々なエラーが出始めたことから、カーネル周りが怪しい感じがしてくる。
案の定,アップデート時に4.13.4-1
へと変更があった。
対処
Arch Linuxはこれまでインストールしたパッケージを/var/cache/pacman/pkg
以下に全部持っている。
これを利用するといつでも戻すことができる。
問題はカーネル関連だと考えられるため、カーネルを戻した。
$ ls -l /var/cache/pacman/pkg/linux* -rw-r--r-- 1 root root 62M May 22 14:58 /var/cache/pacman/pkg/linux-4.11.2-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 62M May 29 13:58 /var/cache/pacman/pkg/linux-4.11.3-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 62M Jul 6 02:07 /var/cache/pacman/pkg/linux-4.11.9-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 65M Jul 29 17:55 /var/cache/pacman/pkg/linux-4.12.4-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 65M Aug 11 21:28 /var/cache/pacman/pkg/linux-4.12.5-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 66M Sep 22 04:11 /var/cache/pacman/pkg/linux-4.13.3-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 66M Sep 28 17:15 /var/cache/pacman/pkg/linux-4.13.4-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 57M Oct 27 2015 /var/cache/pacman/pkg/linux-4.2.5-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 58M Mar 15 2016 /var/cache/pacman/pkg/linux-4.5-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 59M Jun 8 2016 /var/cache/pacman/pkg/linux-4.6.2-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 59M Jun 25 2016 /var/cache/pacman/pkg/linux-4.6.3-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 60M Oct 1 2016 /var/cache/pacman/pkg/linux-4.7.6-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 61M Dec 9 2016 /var/cache/pacman/pkg/linux-4.8.12-3-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 61M Dec 9 2016 /var/cache/pacman/pkg/linux-4.8.13-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 61M Feb 7 2017 /var/cache/pacman/pkg/linux-4.9.8-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 853K Mar 7 2017 /var/cache/pacman/pkg/linux-api-headers-4.10.1-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 921K Aug 17 19:47 /var/cache/pacman/pkg/linux-api-headers-4.12.7-1-any.pkg.tar.xz -rw-r--r-- 1 root root 767K Aug 6 2015 /var/cache/pacman/pkg/linux-api-headers-4.1.4-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 786K Feb 20 2016 /var/cache/pacman/pkg/linux-api-headers-4.4.1-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 789K May 20 2016 /var/cache/pacman/pkg/linux-api-headers-4.5.5-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 811K Aug 2 2016 /var/cache/pacman/pkg/linux-api-headers-4.7-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 30M Sep 4 2015 /var/cache/pacman/pkg/linux-firmware-20150904.6ebf5d5-1-any.pkg.tar.xz -rw-r--r-- 1 root root 35M Jan 14 2016 /var/cache/pacman/pkg/linux-firmware-20160113.40e9ae8-1-any.pkg.tar.xz -rw-r--r-- 1 root root 36M May 20 2016 /var/cache/pacman/pkg/linux-firmware-20160516.80d463b-1-any.pkg.tar.xz -rw-r--r-- 1 root root 40M Oct 5 2016 /var/cache/pacman/pkg/linux-firmware-20161005.9c71af9-1-any.pkg.tar.xz -rw-r--r-- 1 root root 40M Dec 23 2016 /var/cache/pacman/pkg/linux-firmware-20161222.4b9559f-2-any.pkg.tar.xz -rw-r--r-- 1 root root 42M May 5 15:37 /var/cache/pacman/pkg/linux-firmware-20170422.ade8332-1-any.pkg.tar.xz -rw-r--r-- 1 root root 45M Jul 14 06:13 /var/cache/pacman/pkg/linux-firmware-20170622.7d2c913-1-any.pkg.tar.xz -rw-r--r-- 1 root root 46M Sep 8 20:52 /var/cache/pacman/pkg/linux-firmware-20170907.a61ac5c-1-any.pkg.tar.xz
ここからそれっぽいパッケージとカーネル依存のものをダウングレードする。
以下はあくまでこちらの環境の場合だから、自分で調整して欲しい。ファイルの作成日時が鍵となる。
linux-?.??.?-?-x86_64.pkg.tar.xz
は間違いなく必要。
$ sudo pacman -U /var/cache/pacman/pkg/util-linux-2.30.1-2-x86_64.pkg.tar.xz /var/cache/pacman/pkg/linux-firmware-20170622.7d2c913-1-any.pkg.tar.xz /var/cache/pacman/pkg/linux-4.12.4-1-x86_64.pkg.tar.xz /var/cache/pacman/pkg/virtualbox-host-modules-arch-5.1.26-3-x86_64.pkg.tar.xz
今のところdmesg
に出ていたエラーも消えて、パニックも起こらなくなった。
とりあえずしばらくはこれで使っていこうと思う。
安定した運用への備え
安定して動くバージョンリストを作成する
本当はシステム全体のパッケージをダウングレードしたかったが、その方法はぱっと調べた限り見つからなかった。
downgrade
コマンドは,単一パッケージのダウングレードするバージョンを選べるだけ。
というわけで自作してみた。
動作に関しての検証は済んでいないから、利用は自己責任でお願いします。
使った感想とか大歓迎です。
システムが安定しているときに以下を実行。
$ git clone https://github.com/poppycompass/downgrade_all $ downgrade_all/save_pkglist.sh
これでpkg(実行した日付).list
にパッケージ名のリストが作成される。
一部のパッケージは/var/cache/pacman/pkg
以下に無いこともあるから注意。
システムがぶっ壊れたときの復旧は
downgrade_all/recover_pkg.sh <作成したファイル>.list
単調な実装だから、時間がかかる。
同じシステムを一から作成する
インストールしているパッケージのリストをUSBや外部HDDに格納しておくと、OSを一新するときに役立つ。
$ sudo pacman -Qqne > pkg.list $ sudo pacman -S --needed $(< pkg.list)
所感
リリースされているカーネルの不具合は都市伝説ではなかったようだ。
公式のWikiを見てもあまり情報が無いことに驚いた。
4.13.4-1
というバージョンはしばらく忘れられそうにない。
同じ症状に見舞われた人の相棒が元気な姿に戻ってくれればいいなと思う。
数日掛けてのんびり復旧するくらいがちょうど良さそうだ.