はじめに (対象読者・この記事でわかること)

この記事は、RHEL8を運用しているシステム管理者や、Linuxシステムのクラッシュダンプ取得に興味がある方を対象としています。特に、kdump機能の設定やトラブルシューティングに実務経験が少ない方にも役立つ内容です。

この記事を読むことで、kdump.serviceが起動しない問題の主な原因を特定する方法、kdumpの正しい設定手順、起動時のトラブルシューティング方法を学ぶことができます。また、システムクラッシュ時に確実にダンプを取得するためのベストプラクティスも理解できます。これにより、システム障害発生時の原因究明時間を短縮し、システムの安定性を向上させるための知識を得られるでしょう。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - Linuxの基本的なコマンド操作 - systemdの基本的な概念とサービス管理方法 - RHEL8の基本的なシステム管理知識 - カーネルパラメータの設定方法(grub-editenv等) - テキストエディタ(vim, nano等)の基本的な操作

kdumpとはなぜ重要か

kdumpはLinuxカーネルクラッシュ時にメモリダンプを取得するための機能です。システムがクラッシュした際に、通常のカーネルではなく、別途準備されたクラッシュカーネルを起動し、クラッシュ直前のメモリ状態をダンプファイルとして保存します。このダンプファイルは、クラッシュの原因を特定するための貴重な情報源となります。

RHEL8では、kdumpサービスはsystemdによって管理されており、kdump.serviceという名前で提供されています。しかし、実際の運用では、このサービスが起動しない、あるいはクラッシュ時に正しくダンプを取得できないといった問題が発生することがあります。

kdumpが動作しないと、システムクラッシュの原因究明が困難になるだけでなく、長時間のシステム停止や予期せぬ再起動につながる可能性があります。特に、ミッションクリティカルな環境では、kdumpの適切な動作は必須と言えるでしょう。

kdump.serviceが起動しない主な原因と解決策

kdumpの有効化と基本設定

まず、kdumpがシステムで有効化されているか確認します。

Bash
# kdumpサービスの有効化状態を確認 $ systemctl is-enabled kdump.service # kdumpが有効になっていない場合は有効化 $ sudo systemctl enable kdump.service # kdumpサービスの起動状態を確認 $ sudo systemctl status kdump.service

kdumpを有効にした後は、/etc/kdump.confファイルを編集して、ダンプの保存先やフォーマットなどを設定します。

Bash
# kdump設定ファイルの編集 $ sudo vi /etc/kdump.conf

設定ファイル内で、以下の主要なパラメータを確認・設定します:

  • path: ダンプファイルの保存先パス
  • core_collector: ダンプの保存形式(例:makedumpfile --mem-xy core.%(pid)s)
  • default: クラッシュカーネルの指定(通常はデフォルトのままで問題ありません)

設定後は、kdumpサービスを再起動して設定を反映させます。

Bash
$ sudo systemctl restart kdump.service

メモリ確保の設定

kdumpが動作するためには、クラッシュカーネル用にメモリを確保する必要があります。RHEL8では、以下のいずれかの方法でメモリを確保できます。

  1. GRUB起動オプションでの指定: /etc/default/grubファイルのGRUB_CMDLINE_LINUXcrashkernel=autoを追加します。
Bash
$ sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet"

設定後は、grub設定を更新して再起動します。

Bash
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg $ sudo reboot
  1. 手動でのメモリ確保量指定: crashkernelパラメータに具体的なメモリ量を指定することも可能です。例えば、1GBを確保する場合はcrashkernel=1Gとします。

メモリ確保量はシステムのメモリ容量によって調整する必要があります。一般的な目安は以下の通りです:

  • システムメモリが2GB未満:128MB
  • システムメモリが2GB以上:256MB以上
  • 大規模システム:1GB以上

カーネルパラメータの調整

kdumpの動作には、いくつかのカーネルパラメータが影響します。特に重要なのは以下のパラメータです:

  • nr_cpus: クラッシュ時に使用するCPUコア数
  • irqaffinity: 割り込み affinity の設定
  • enforce_cpuspeed: CPU速度の固定

これらのパラメータは、/etc/sysctl.conf/etc/sysctl.d/配下のファイルで設定できます。

Bash
# sysctl設定ファイルの編集 $ sudo vi /etc/sysctl.d/99-kdump.conf
# クラッシュ時に使用するCPUコア数を1に限定
kernel.nr_cpus = 1

# 割り込み affinity の設定
kernel.irqaffinity = 0

# CPU速度の固定
kernel.enforce_cpuspeed = 1

設定後は、sysctlを再読み込みします。

Bash
$ sudo sysctl -p /etc/sysctl.d/99-kdump.conf

クラッシュカーネルの準備

kdumpは、クラッシュ時に通常のカーネルとは別のカーネル(クラッシュカーネル)を使用します。このクラッシュカーネルが正しく準備されているか確認する必要があります。

Bash
# クラッシュカーネルの確認 $ sudo ls -l /boot/vmlinuz-* | grep crash

クラッシュカーネルが存在しない場合は、以下の手順で準備します:

Bash
# クラッシュカーネルのインストール $ sudo yum install kernel-debug # initramfsの再作成 $ sudo dracut -f /boot/initramfs-$(uname -r).kdump.img $(uname -r)

起動時の問題解決

kdump.serviceが起動しない場合のトラブルシューティング手順を以下に示します:

ステップ1: サービス起動ログの確認

まず、kdumpサービスの起動ログを確認します。

Bash
$ sudo journalctl -u kdump.service -b -p err

ログにエラーが表示されていない場合は、以下のコマンドで詳細なログを確認します。

Bash
$ sudo journalctl -u kdump.service -b -n 100

ステップ2: kdumpサービスの手動起動

サービスを手動で起動し、エラー内容を確認します。

Bash
$ sudo systemctl start kdump.service $ echo $?

戻り値が0でない場合は、エラーが発生しています。エラー内容を確認するために以下のコマンドを実行します。

Bash
$ sudo systemctl status kdump.service

ステップ3: kdumpのテスト実行

kdumpが正常に動作するかテストします。

Bash
$ sudo kdumpctl test

このコマンドは、実際にシステムクラッシュをシミュulateするわけではありませんが、kdumpの初期化とダンプ領域の確保が正常に行われるかを確認します。

ステップ4: メモリ不足の確認

システムメモリが不足している場合、kdumpが起動しないことがあります。メモリ使用状況を確認します。

Bash
$ free -h

必要なメモリが確保できない場合は、crashkernelパラメータの値を調整するか、システムメモリを増設する必要があります。

ステップ5: ディスク容量の確認

ダンプ保存先のディスクに十分な容量があるか確認します。

Bash
$ df -h

容量不足の場合は、ダンプファイルの保存先を変更するか、ディスク容量を増設する必要があります。

解決策

kdump.serviceが起動しない問題に対する具体的な解決策を以下に示します:

解決策1: kdump設定ファイルの修正

kdump設定ファイル(/etc/kdump.conf)に誤りがある場合、修正が必要です。特に、以下の設定を確認します:

  • pathディレクティブで指定したパスが存在し、書き込み可能であること
  • core_collectorディレクティブのフォーマットが正しいこと
  • 必要なディレクトリが作成されていること
Bash
# ダンプ保存先ディレクトリの作成 $ sudo mkdir -p /var/crash $ sudo chmod 1777 /var/crash

解決策2: initramfsの再作成

initramfsが破損している場合、kdumpが起動しないことがあります。initramfsを再作成します。

Bash
# 現在のカーネル用initramfsの再作成 $ sudo dracut -f -v # 特定のカーネル用initramfsの再作成 $ sudo dracut -f -v /boot/initramfs-$(uname -r).img $(uname -r)

解決策3: セキュリティポリシーの調整

SELinuxが有効な場合、kdump関連のファイルに適切なコンテキストが設定されていないと起動に失敗することがあります。

Bash
# SELinuxの一時的な無効化(テスト用) $ sudo setenforce 0 # kdumpサービスの再起動 $ sudo systemctl restart kdump.service # もしサービスが起動した場合、SELinux関連の問題が疑われる

SELinux関連の問題を永続的に解決するには、以下のコマンドでkdump関連のファイルのコンテキストを修正します。

Bash
# kdump関連ファイルのSELinuxコンテキストを修正 $ sudo restorecon -R -v /usr/bin/kdumpctl /etc/kdump.conf /var/crash

解決策4: ファイアウォール設定の確認

ファイアウォールがkdumpの動作を妨害している可能性があります。必要に応じてファイアウォール設定を調整します。

Bash
# firewalldが有効な場合 $ sudo firewall-cmd --permanent --add-service=kdump $ sudo firewall-cmd --reload

解決策5: カーネルパラメータの最適化

一部のシステムでは、特定のカーネルパラメータがkdumpの動作に影響を与えることがあります。以下のパラメータを試してみてください:

Bash
# /etc/sysctl.d/99-kdump.conf に以下を追加 vm.panic_on_oom = 1 kernel.panic = 10 kernel.panic_on_unrecovered_nmi = 1 kernel.panic_on_io_nmi = 1

設定後は、sysctlを再読み込みします。

Bash
$ sudo sysctl -p /etc/sysctl.d/99-kdump.conf

まとめ

本記事では、RHEL8でkdump.serviceが起動しない問題の原因と解決策について解説しました。kdumpはシステムクラッシュ時に重要な情報を取得するための機能であり、適切に設定しておくことが重要です。

  • kdumpの有効化と基本設定はシステムクラッシュ時のダンプ取得の基本です
  • メモリ確保の設定はkdump動作の前提条件であり、システム環境に応じた調整が必要です
  • カーネルパラメータの調整はkdumpの安定性向上に寄与します
  • クラッシュカーネルの準備はkdump機能の核となる部分です
  • 起動時の問題解決では、ログ確認から具体的な解決策までを網羅的に説明しました

この記事を通して、kdump.serviceが起動しない問題に対する体系的なアプローチ方法を理解できたことでしょう。今後は、kdumpで取得したダンプファイルの分析方法や、大規模環境でのkdump運用に関するベストプラクティスについても記事にする予定です。

参考資料