最近、関連する知識ポイントを整理し、Kdumpの展開プロセスと原則を体系的に説明するために、kdumpカーネルのクラッシュダンプテクノロジを確認していました。
kdumpカーネルのクラッシュダンプテクノロジは、Linuxカーネルのクラッシュなどの異常な問題に対処するときに、クラッシュの瞬間にメモリイメージ(関数スタック、メモリ、CPU、その他の情報を含む)を保持できるため、開発者は原因を分析できます。失敗の。アプリケーション層のコアダンプメカニズムに似ています。
Kdumpをデプロイするプロセスには、いくつかの知識ポイントが必要です。
- カーネルコンパイルプロセスを開始するにはどうすればよいですか?
- kexecメカニズム?
- システムの起動にどのように適応するか(条件によって異なります)?
- ダンプファイルを解析する方法は?
カーネルコンパイルによりkdumpが開きます
次の構成パラメーターを有効にしてコンパイルする必要があります。
- 在「プロセッサの種類と機能。「下使能」kexecシステムコール」。CONFIG_KEXEC= y
- 在「ファイルシステム」->「疑似ファイルシステム。「下使能」sysfsファイルシステムのサポート」。CONFIG_SYSFS= y
- 在「カーネルハッキング。「下使能」デバッグ情報を使用してカーネルをコンパイルする」。CONFIG_DEBUG_INFO= y
- 在「プロセッサの種類と機能」下使能「カーネルクラッシュダンプ」。CONFIG_CRASH_DUMP= y
- 「ファイルシステム」->「疑似ファイルシステム」で「/ proc / vmcoreサポート」を有効にします。CONFIG_PROC_VMCORE = y
kexecメカニズム
kudmpメカニズムの実装の中核はkexecです。これは、2番目のカーネル(キャプチャカーネル)を指定されたメモリに転送でき、最初のカーネルがクラッシュすると、2番目のカーネル(キャプチャカーネル)に切り替えて実行します。
Kexecは「kexec-tools」コンポーネントから取得され、kexec-toolsツールパッケージをコンパイルしてkexecツールを取得します(centosはkexec-toolsパッケージをダウンロードして直接インストールできます)。カーネルでkexecを有効にするには、上記のようにCONFIG_KEXECオプションを有効にする必要があります。
kexecコマンド呼び出しの構文は次のとおりです。
- キャプチャカーネルをロードします(キャプチャカーネルは最初のカーネルと同じイメージファイルにすることができ、通常はデフォルトで同じものが使用されます)
kexec -l <kernel-image> --initrd = <initramfsxxx.img> --append = "<command-line-options>"
例:イメージ/ boot / bzImageを開始する場合、/ proc / cmdlineの内容は "root = / dev / hda1"であり、カーネルをロードするコマンドは次のようになり
ます。kexec-l / boot / bzImage- append = "root = / dev / hda1"(つまり、kexecエントリに通知します)
- kernel-image:再起動するカーネルファイルです。
- initramfsxxx.img:カーネルのルートファイルシステムをキャプチャします
- command-line-options:キャプチャカーネルに渡す必要のあるコマンドラインコマンドラインパラメータ。通常、/ proc / cmdlineのcontentパラメーターを渡すことができます。
- カーネル操作をキャプチャするように手動で切り替えます。
kexec -eシステムは、キャプチャカーネル操作に自動的に切り替わります(上記で指定されたキャプチャカーネルエントリが必要です)
- カーネルがクラッシュした後に実行するキャプチャカーネルに自動的にジャンプするには、次の-pパラメーターを使用します。
kexec -p <kernel-image> --initrd = <initramfsxxx.img> --append = "<command-line-options>"
上記は知っています:kexecはカーネルファイル、ルートファイルシステムファイルをキャプチャする必要があります。カーネルクラッシュが発生すると、最初のカーネルのメモリイメージが/ proc / vmcoreに保存されます
システムブート適応キャプチャカーネル
1.クラッシュ
カーネルがオンになるたびにキャプチャカーネルを自動的に適応させるには、最初のカーネルのコマンド
ラインでキャプチャカーネルのメモリスペースを指定します。つまり、パラメータを追加します。crashkernelクラッシュカーネルのメモリ選択は次を参照できます:Documentation \ kdump \ kdump.txtファイル。もちろん、crashkernel = autoを直接使用することもでき、システムが自動的に割り当てます。
「crashkernel = size [@offset]
- RAMが512Mより小さい場合は、何も予約しないでください(これは「レスキュー」の場合です)
- RAMサイズが512M〜2G(排他的)の場合は、64Mを予約します
- RAMサイズが2Gより大きい場合は、128Mを予約します
2.
initramfsxxx.img initramfsxxx.imgのルートファイルシステムファイル。キャプチャカーネルに切り替えて起動した後、パーティションのマウント、プログラムの実行、プログラムの実行など、initramfsxxx.imgのコンテンツに人為的な変更を加えることができます。起動時にいくつかのドライバをインストールします。
たとえば、centosでは、kdumpサービスはinitramfsxxx.imgを自動的に生成できます。イメージファイルには、/ proc / vmcoreダンプファイル(makedumpfileツール)の圧縮に使用されるkdump-initxxx.shのより重要なスクリプトファイルがあります。およびディスクパーティションをマウントし、ファイルを指定されたパスにコピーします(デフォルトでは/ var / log / crackにコピーします)。
もちろん、imgファイルはmkinitramfsツールによって手動で生成することもできます。
3. kexec -p xxx
は、起動するたびにキャプチャカーネルエントリを指定するためにkexec -pxxxを実行する必要があります。
CentOSでは、kdumpサービスを介して、起動により、キャプチャカーネルを設定するkexecの操作が自動的に完了します。カーネルのルートファイルシステムのイメージファイル(xxxkdump.img)が/ bootでキャプチャされていない場合は、自動的に生成されます。
centos为例,服务所在脚本里 /usr/bin/kdumpctl实际kexec装载命令如下:
/sbin/kexec -p --command-line="BOOT_IMAGE=/vmlinuz-3.10.0-123.el7.x86_64 root=UUID=79704805-e306-420b-827a-52849e1376c1 ro vconsole.keymap=us vconsole.font=latarcyrheb-sun16 rhgb quiet LANG=en_US.UTF-8 irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 rootflags=nofail acpi_no_memhotplug disable_cpu_apicid=0" --initrd=/boot/initramfs-3.10.0-123.el7.x86_64kdump.img /boot/vmlinuz-3.10.0-123.el7.x86_64
最初のカーネルの下のCmdline
cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-123.el7.x86_64 root=UUID=79704805-e306-420b-827a-52849e1376c1 ro vconsole.keymap=us crashkernel=auto vconsole.font=latarcyrheb-sun16 rhgb quiet LANG=en_US.UTF-8
/ etc / sysconfig / kdump構成ファイルに、カーネルコマンドライン入力をキャプチャするための追加の補足が追加されました
KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 rootflags=nofail acpi_no_memhotplug"
クラッシュとvmlinux
カーネルパニックは、echo c> / pros / sysrq-triggerによってトリガーされる可能性があります。次に、ダンプファイルvmcoreを生成します。
ダンプファイルvmcoreが生成された後、カーネルデバッグファイルvmlinuxに依存するクラッシュツールで解析および分析する必要があります。
1. vmlinux
ここで説明するvmlinuxは、ELF形式に基づくファイルです。これは、デバッグに使用できるカーネルイメージの非圧縮バージョンです。また、zImageまたはbzImageはカーネルイメージの圧縮バージョンであり、通常は起動に使用されます。
カーネルイメージファイルvmlinuxをコンパイルするときは、-gパラメーターを指定する必要があります。つまり、デバッグ情報を使用して、コンパイル後に生成できます(centosパッケージはkernel-debuginfo-xxx.rpmカーネルパッケージにあります)。
2.クラッシュ
クラッシュスタートアップ分析コマンドは次のとおりです。
crash vmlinux vmcore
クラッシュでvmcoreが指定されていない場合、デフォルトで現在のリアルタイムシステムメモリが使用されます。
クラッシュを入力した後、クラッシュ関連のコマンド(コマンドは省略)を使用して、最初のカーネルがダウンしたときの情報(各CPU呼び出しスタック、メモリマージン、プロセス情報など)を取得する必要があります。カーネルクラッシュの原因を分析できます。具体的な理由。