拾い物のコンパス

まともに書いたメモ

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コマンドは,単一パッケージのダウングレードするバージョンを選べるだけ。

というわけで自作してみた。
動作に関しての検証は済んでいないから、利用は自己責任でお願いします。 使った感想とか大歓迎です。

downgrade_all

システムが安定しているときに以下を実行。

$ 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というバージョンはしばらく忘れられそうにない。

同じ症状に見舞われた人の相棒が元気な姿に戻ってくれればいいなと思う。
数日掛けてのんびり復旧するくらいがちょうど良さそうだ.

参考

Arch Linux の安定化 - ArchWiki