ブートデバッグ
様々なデバッグ出力のレベルで既存のシステムを簡単に出来るように、カーネルはあらゆる高度な設定を行うための便利な手段を用意しています [1]。ブートローダーの設定にエントリを追加するだけで、とても簡単に複数のレベルのデバッグを作成することが可能です。電源やハードウェアの問題によって、後で問題が起こった時に、手数を減らすことができ、また、システムについて習熟したいと思った時にデバッグ出力に勝るものはありません。
まず、カーネルパラメータの記事を読んでブートローダーにカーネルパラメータを追加する方法を見て下さい。
目次
デバッグレベル
Light Debug
コンソールで詳細なメッセージを見るための一番簡単な方法はブートローダーのエントリの kernel 行に verbose
を追加してから起動することです。
Medium Debug
kernel 行に debug
カーネルパラメータを追加することでデフォルト状態に比べて多くのデバッグ情報を得ることができます。
Heavy Debug
さらに効果的なカーネルパラメータとして ignore_loglevel
があり、ログレベルを全て無視して、システムの内部的なログレベルが最大レベルにまで引き上げられます。
Extreme Debug
"Heavy Debug" でも大量の出力がなされますが、カーネルパラメータを加えることでさらに倍以上のログを出力できます:
debug ignore_loglevel log_buf_len=10M print_fatal_signals=1 LOGLEVEL=8 earlyprintk=vga,keep sched_debug
EFI 環境の場合:
debug ignore_loglevel log_buf_len=10M print_fatal_signals=1 LOGLEVEL=8 earlyprintk=efi,keep sched_debug
カーネルパラメータの説明:
earlyprintk
パラメータはメッセージを vga スクリーンや EFI フレームバッファに early printing するようにカーネルを設定します。keep
パラメータは通常時ブートプロセスで隠れてしまうログを表示させます。log_buf_len=10M
はログバッファの長さを 10MB に変更します。print_fatal_signals
によって fatal signal を全て表示します。- 最後の
sched_debug
についてはカーネルドキュメントの カーネルパラメータ に詳しい説明があります。
Insane Debug
上記のデバッグカーネルパラメータは大量のデバッグ情報を表示するようになります。システムを最大化して裏で何が起こっているのか知るのには極めて効果的です。しかしながら、さらに強力な決定打が存在します。環境変数と、起動時のモジュールパラメータを設定します。
以下が真の insane デバッグをするためのカーネルパラメータです。実際に使用するときは GRUB のエントリに一行で記述します。ほとんどのデバイスでデバッグレベルを絶対最大値まで上げられます。マシンは TI-89 電卓よりも遅くなります (ブートパフォーマンスの向上を参照)。
rootwait ignore_loglevel debug debug_locks_verbose=1 sched_debug initcall_debug mminit_loglevel=4 udev.log_priority=8 loglevel=8 earlyprintk=vga,keep log_buf_len=10M print_fatal_signals=1 apm.debug=Y i8042.debug=Y drm.debug=1 scsi_logging_level=1 usbserial.debug=Y option.debug=Y pl2303.debug=Y firewire_ohci.debug=1 hid.debug=1 pci_hotplug.debug=Y pci_hotplug.debug_acpi=Y shpchp.shpchp_debug=Y apic=debug show_lapic=all hpet=verbose lmb=debug pause_on_oops=5 panic=10 sysrq_always_enabled
デバッグの方法
モジュールパラメータ
カーネルモジュールを見て下さい。
netconsole
デバッグに関するカーネルドキュメント を読むと、カーネルに組み込んでモジュールとしてロードできる netconsole を知ることができます。古いノートパソコンやシンクライアントなど、動作が遅いコンピュータをデバッグするときは、netconsole エントリをカーネルパラメータに記述すると役に立つでしょう。簡単に使うことができます:
syslog.conf
を使ってリモートホストの syslog リクエストを受け入れるように (Arch が動作する) 他のコンピュータを設定。/var/log/everything.log
ファイルでログを確認。- デバッグするコンピュータに、
netconsole=514@10.0.0.2/12:34:56:78:9a:bc
のようなカーネルパラメータを追加 (デバッグしたいパラメータも追加してください)。 - コンピュータを再起動してログを確認する。
cmdline をハイジャック
ブートローダーにアクセスすることすらできない場合でも、(root 権限があれば) カーネルパラメータを変更してデバッグを有効にできる可能性があります。その方法とは、カーネルパラメータが保存されている /proc/cmdline
を上書きすることです。/proc/cmdline
は root でも書き込むことができないので、バインドマウントを使ってパスをマスクすることでハイジャックします。
まず、使用したいカーネルパラメータを記述したファイルを作成してください:
/root/cmdline
root=/dev/disk/by-label/ROOT ro console=tty1 logo.nologo debug
次に、バインドマウントを使ってパラメータを上書きします:
# mount -n --bind -o ro /root/cmdline /proc/cmdline
-n
オプションは /etc/mtab
へのマウントの追加をスキップするため、root が読み取り専用でマウントされていても機能します。cat /proc/cmdline
を実行することでカーネルパラメータが変更されたか確認できます。
トラブルシューティング
出力が途切れる
解像度の変更時に出力が消える
解像度が変更されるときに起動出力が消えてしまう場合、デバッグのために KMS を無効化することができます。
スクロールができない
起動時の出力が4または5ページに限られており、上記のデバッグパラメータを使うためにもっと表示させたい場合、カーネルパラメータに以下のアイテムを追加します:
fbcon=scrollback:512k
詳しくはスクロールバックバッファを参照。
Arch ライブ CD で修復
GRUB がカーネルを起動できなくなったり、initramfs が壊れた場合、Arch ライブ CD を使って安全にシステムを起動することができます。修復が修正したら、壊れたシステムをアンマウントして、再起動してください。
リカバリシェル
デーモンによるエラーや、fstab の記述が間違っている、またはディスプレイマネージャや Xorg に問題が発生していて、起動できない場合、シングルユーザーランレベルを使うことで問題を修正できることがあります。シングルユーザーモードでは起動後に root シェルだけを表示します。リカバリシェルを起動するカーネルパラメータは複数存在しますが、どれも exit
で通常シェルに戻り、カーネルが元の状態に復帰します:
rescue
は root ファイルシステムが読み書きできる状態で再マウントされたすぐ後にシェルを起動します。emergency
は更に早く、ファイルシステムがマウントされる前にシェルを起動します。- (何らかの理由で上記のパラメータが使えない場合)
init=/bin/sh
は init プログラムを root シェルに変えます。rescue
とemergency
はどちらも systemd に依存しますが、init=/bin/sh
はたとえ systemd が壊れても使えます。
また、debug-shell.service
を有効化することで tty9
に root シェルを追加することもできます (Ctrl+Alt+F9 でアクセス可能)。root シェルが開きっぱなしになっているとセキュリティ上危険なので、修復が終わったらサービスは無効化してください。
参照
- Memtest86+
- List of Tools for UBCD - Can be added to custom menu.lst like memtest
- Wikipedia's page on BIOS Boot partition
- QA/Sysrq - Using sysrq
- systemd ドキュメント: Debug Logging to a Serial Console
- How to Isolate Linux ACPI Issues