なにこれ?
先日、ネットワークエラーか単純に失敗したかわかりませんが、カーネルパニックを起こしてubuntuが正常に起動できなくなりました。
寝ぼけてた私はapt upgradeのエラーを調べもせずにrebootして解決しようとしました。
消灯した部屋に突然紫の光が充満し、顔を上げると、AAでできたペンギンが静かにこちらを見つめていました...
「Unable to mount fs on unknown-block」。
それ以降は覚えていません...
結論から言うと、私の場合は単に更新に失敗しただけで、カーネルを戻せば普通に起動しました。
数分で復旧できたので画像なども特にありませんが、同様の状況に陥ったとき、私がパニックを起こさず後で思い出せるように簡単なメモとして残しておきます。
今回は初心者の書いた備忘録です。
何が起こった?
エラーをみると分かる通り、システムの肝心なディレクトリが見つからないんだなぁと、なんとなく分かります。
これが起こる原因としては、ルート関連の初期環境が壊れたり、ストレージのモジュールが読み込めなかったり、/ディレクトリが別のパーティションにあってマウントできなかったりすると起こるらしいです。
今回のケースでは、そもそものカーネル自体が破損して中途半端な状態で起動したためにパニックが起きちゃったんですね。他のシステムには特に問題がないので、カーネルのロールバックで元に戻った、というわけです。
復旧
さっきまで普通に動いていたのであれば、おそらく私と同じ方法で復旧できます。
PCを起動すると、grabが勝手に表示されると思います。OSインストールで見た黒いやつですね。久しぶり。
そのままにしてると勝手にパニックを起こすので、少し急いで「Advanced options for Ubuntu」を選びます。
あとは以前のバージョンに相当するカーネルを選択して起動。(recovery mode で起動する必要はない)
元通りに起動できたらロールバック完了です。
毎回同様の手順を踏めば起動できます。
おつかれさまでした〜
...
で、終われるわけがないでしょう。
真 何が起こった?
ぐっすり寝て起きて起動したら再度パニックを起こしたので、ちゃんと原因を探します。
カーネルパニックの原因を探すため、もう一度apt upgradeでエラーを起こし、該当するカーネルと問題を特定します。
Building module:
Cleaning build area...
'make' KERNELVER=6.14.0-24-generic..........(bad exit status: 2)
ERROR: Cannot create report: [Errno 17] File exists: '/var/crash/amdgpu-dkms.0.crash'
5 Error! Bad return status for module build on kernel: 6.14.0-24-generic (x86_64)
Consult /var/lib/dkms/amdgpu/6.12.12-2164967.24.04/build/make.log for more information.
dkms autoinstall on 6.14.0-24-generic/x86_64 failed for amdgpu(10)
Error! One or more modules failed to install during autoinstall.
Refer to previous errors for more information.
10 * dkms: autoinstall for kernel 6.14.0-24-generic
...fail!
run-parts: /etc/kernel/header_postinst.d/dkms exited with return code 11
dpkg: パッケージ linux-headers-6.14.0-24-generic の処理中にエラーが発生しました (--configure):
installed linux-headers-6.14.0-24-generic package post-installation script subprocess returned error exit status 11
15 処理中にエラーが発生しました:
linux-headers-6.14.0-24-generic
E: Sub-process /usr/bin/dpkg returned an error code (1)
(見易くするために行数を付け加えています)
今回私の環境で問題となっているカーネルは「linux-headers-6.14.0-24-generic」だそうです。
『エラーが起きたら一番最初のエラーを読め』の教えに従い更に辿っていくと、エラーの元はamdgpuモジュールに関係するみたいです。Say thank you to error.
一番最初のエラーから紐解いて行きます。
まず4行目にある最初のエラーですが、これは既に同じエラーが起きているので書き込めませんでした、というものです。初回のエラーでは発生しないかもしれません。今回は関係なさそうですね。
続く5〜7行目です。問題となるカーネルのバージョンと、amdgpuの文字が。7行目にはハッキリとamdgpuのせいでインストールに失敗したと出力されています。amdgpuのdkmsは結構めんどくさいですね。またお前かという...
残りはエラーが発生しましたよ、ということを教えてくれる出力ですね。
では、問題の範囲が絞れましたので、6行目にあるログを見てみます。(cat -nはnlコマンドのように行数を追加して表示するオプションです)
cat -n /var/lib/dkms/amdgpu/6.12.12-2164967.24.04/build/make.log
私の環境では500超まで続くログが出力されました。SAY
落ち着いてログを確認しましょう。彼はあなたが問題に対処できるように何が起こったのかを見せたいんだ。
このログからエラーを抽出してみます。
先程ログを出力したコマンドを呼び出して、後ろにgrepを付け加えます。
(今度はcatではなくgrep -nを実行して該当箇所の行数を表示しています。-iは大文字小文字の区別をしないオプションです)
cat /var/lib/dkms/amdgpu/6.12.12-2164967.24.04/build/make.log | grep -ni Error
すると、いくつかのエラーが出力されましたが、一番上にはこんなエラーが。
error: implicit declaration of function ‘drm_fbdev_ttm_setup’ [-Werror=implicit-function-declaration]
原因の特定ができました。今回起きた問題を整理します。
前日のカーネル更新前までは正常に動作していた、昨日のアップデート配信直後にパニックが発生した、カーネルのロールバックで問題なく動作する、問題は新しいカーネルのファイルではなくamdgpuのdkmsが原因で発生した。
この状況から推測できる可能性は一つ。
GPUがカーネルの更新に追いついていない。
まあ昨日今日の更新だからそうだよね、と薄々気づいていましたが...
なんかそういうことみたいです。何か大きく変わったんですかね?
真 復旧
プログラムの構造も分からないので、これに関しては素直にカーネルをロールバックするのが一般人にできる正しい対処法だと思います。
自力でdkmsを書き換える技術と自信がある人は仮想上でやってみるといいかもしれません。私もいつかその域に到達したいですが、今回は遠慮しておきます...
毎回該当のカーネルで起動してパニックを起こされても困るので、該当するカーネルを削除していきます。
警告
事前に別記憶媒体へバックアップを取ることをおすすめします。
同様の手順に従い発生した不利益について、私は一切責任を取りません。
1. まずはdpkgにある該当パッケージの抽出
dpkg -l | grep <version>
2. また後で問題が起きても困るので、該当するものは全て削除
sudo apt remove <packege1> <packege2> ...
3. おそらく削除できないものも出てくるので、それも削除
注意
実行前に正しく指定されているかを必ず確認し、一度に指定するファイルは一つに絞り、慎重に作業してください
sudo dpkg --purge --force-all <packege>
4. 一通り作業したら、確認の為もう一度抽出
dpkg -l | grep <version>
5. 最後にgrubをアップデート
sudo update-grub
Option
当面の間は様子を見たいので、カーネル関係だけ勝手に更新しないよう必要最低限の設定をします。
sudo apt-mark hold linux-image-generic linux-headers-generic
補足
apt full-updradeは、この設定を無視してしまうみたいです。
sudo apt update && sudo apt upgradeを使うことをおすすめします。
image-genericはインストーラーのような役割を、headers-genericは今回問題となった関数などの宣言が含まれているファイルのようです。
ちゃんと設定できたか確認
apt-mark showhold
更新したいときはholdを解除
sudo apt-mark unhold linux-image-generic linux-headers-generic
設定作業は以上になります。
再起動してシステムが正常に動作することを確認してください。もし異常が起こった場合は、予め作成していたバックアップを使って、もう一度作業してください。
念の為にuname -rで安定するカーネルバージョンを控えておくといいかもしれません。
お疲れ様でした。
終わりに
こういうトラブルシューティングは初めてだったので、かなり時間を使ってしまいました。相手がカーネルだったのでなおさらです。エラーが表示されるってすごく有り難いですね...
今回も見知らぬ誰かが書いた記事に大いに助けられました。ありがとうございます。
私もいつか誰かの役に立てるようになりたいです。
参考