KDUMP — это ключевая функция ядра Linux, которая используется для создания дампов памяти (дампов ядра) при сбое системы. Это очень важно для системных администраторов и разработчиков для анализа и устранения проблем, связанных с сбоями системы. В этой статье подробно описаны принцип работы, метод настройки и применение KDUMP в реальных операциях.
KDUMP использует механизм kexec, который позволяет загружать и запускать новое ядро сразу после сбоя ядра без необходимости перезагрузки системы через BIOS или прошивку. Основные этапы KDUMP следующие:
Настройка KDUMP в основном включает в себя следующие шаги:
В большинстве дистрибутивов Linux инструмент KDUMP можно установить через менеджер пакетов, например в CentOS или RHEL:
bash
sudo yum install kexec-tools
Редактировать файлы конфигурации GRUB,добавить вcrashkernel
параметры для резервирования памяти。Например,существовать/etc/default/grub
в файле:
bash
GRUB_CMDLINE_LINUX="crashkernel=128M"
Обновите конфигурацию GRUB:
bash
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
редактироватьKDUMPКонфигурациядокумент/etc/kdump.conf
,Укажите место сохранения файла дампа памяти:
bash
path /var/crash
Запустите и включите службу KDUMP:
bash
sudo systemctl start kdump
sudo systemctl enable kdump
Чтобы убедиться, что KDUMP настроен правильно, вы можете вручную вызвать сбой системы:
bash
echo c > /proc/sysrq-trigger
Система выйдет из строя и перезагрузится, а служба KDUMP создаст файл дампа памяти. Созданный файл дампа можно просмотреть в настроенном месте сохранения.
Сгенерированный дамп памятидокумент Можетиспользоватьcrash
инструменты для анализа。crash
Инструмент предоставляет интерактивный интерфейс командной строки.,Используется для просмотра структуры данных Ядро, трассировки стека и другой информации.
Установитьcrash
инструмент:
bash
sudo yum install crash
использоватьcrash
инструмент Загрузить дамп памятидокументиотлаживатьсимволдокумент:
bash
sudo crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/crash/2023-06-24-10\:00/vmcore
существоватьcrash
инструментсередина,Для просмотра сведений о файле дампа памяти можно использовать различные команды.
log
иbt
Команды — две очень важные команды。log
команда для просмотра Ядробревно,иbt
Команда для просмотра информации трассировки стека при сбое。Ниже приводится подробное описание и примеры этих двух команд.。
log
Заказlog
Заказдля показа Ядроизбревноинформация,В этих журналах фиксируются различные события, происходящие во время работы системы.,Включает ошибки, предупреждения и информационные сообщения. Просмотр журнала Ядро может помочь нам понять, какие важные события произошли до сбоя системы.
Предположим, мысуществоватьcrash
инструментсередина输入log
Заказ,Вывод может быть следующим:
bash
crash> log
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
[ 0.000000] Linux version 3.10.0-957.21.3.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Tue May 14 21:24:45 UTC 2019
...
[ 15.625908] SELinux: Disabled at runtime.
[ 15.625914] SELinux: Unregistering netfilter hooks
[ 15.631763] type=1404 audit(1621513042.185:2): selinux=0 auid=4294967295 ses=4294967295
[ 15.632076] systemd[1]: Successfully loaded SELinux policy in 13.217130ms.
...
[ 1183.443830] BUG: unable to handle kernel NULL pointer dereference at 0000000000000010
[ 1183.444069] IP: [<ffffffff810dffef>] __wake_up_common+0x2f/0x80
[ 1183.444332] PGD 0
[ 1183.444404] Oops: 0002 [#1] SMP
[ 1183.444529] Modules linked in: ip_tables xfs libcrc32c sd_mod crc_t10dif crct10dif_generic sr_mod cdrom crct10dif_pclmul crct10dif_common crc32_pclmul ghash_clmulni_intel aesni_intel glue_helper lrw gf128mul ablk_helper cryptd serio_raw ahci libahci libata tg3 libphy dm_mirror dm_region_hash dm_log dm_mod
...
[ 1183.447114] RIP [<ffffffff810dffef>] __wake_up_common+0x2f/0x80
[ 1183.447369] RSP <ffff8801184c3a68>
[ 1183.447463] CR2: 0000000000000010
[ 1183.447560] ---[ end trace 19da2b7b7a6f3c54 ]---
unable to handle kernel NULL pointer dereference
)、связанный IP-адрес、Информация о модуле и т. д.RIP
、RSP
ждать),Эта информация очень полезна для определения источника ошибки.bt
Заказbt
Заказдля показа崩溃时из栈跟踪(Backtrace)информация,Благодаря трассировке стека вы можете понять цепочку вызовов программы в случае ее сбоя.,Это помогает найти источник проблемы.
Предположим, мысуществоватьcrash
инструментсередина输入bt
Заказ,Вывод может быть следующим:
bash
crash> bt
PID: 1234 TASK: ffff8801184c0000 CPU: 1 COMMAND: "echo"
#0 [ffff8801184c3a68] __wake_up_common at ffffffff810dffef
#1 [ffff8801184c3a98] __wake_up at ffffffff810e0038
#2 [ffff8801184c3ab8] complete at ffffffff810e3f20
#3 [ffff8801184c3ad8] i915_gem_object_set_to_gtt_domain at ffffffffa00c872f [i915]
#4 [ffff8801184c3b08] i915_gem_object_pin_to_display_plane at ffffffffa00c905e [i915]
#5 [ffff8801184c3b48] intel_prepare_plane_fb at ffffffffa00fa98b [i915]
#6 [ffff8801184c3b78] drm_atomic_helper_prepare_planes at ffffffffa003eabc [drm_kms_helper]
#7 [ffff8801184c3ba8] drm_atomic_helper_commit_planes at ffffffffa003eb0f [drm_kms_helper]
#8 [ffff8801184c3bc8] drm_atomic_commit_tail at ffffffffa004049f [drm_kms_helper]
#9 [ffff8801184c3c08] commit_tail at ffffffffa00a4f13 [i915]
#10 [ffff8801184c3c38] intel_atomic_commit at ffffffffa00a5df3 [i915]
#11 [ffff8801184c3c68] drm_atomic_commit at ffffffffa003f0b0 [drm_kms_helper]
#12 [ffff8801184c3c98] drm_atomic_connector_commit_dpms at ffffffffa003c8ec [drm_kms_helper]
#13 [ffff8801184c3cc8] drm_mode_obj_set_property_ioctl at ffffffffa002c518 [drm]
#14 [ffff8801184c3d08] drm_ioctl at ffffffffa00207b0 [drm]
#15 [ffff8801184c3d48] do_vfs_ioctl at ffffffff8121f4a8
#16 [ffff8801184c3db8] sys_ioctl at ffffffff8121f822
#17 [ffff8801184c3e18] system_call_fastpath at ffffffff8168ec19
RIP: 00007f7b59140f07 RSP: 00007ffd4a2e2c38 RFLAGS: 00000246
RAX: 0000000000000010 RBX: 0000000000000000 RCX: ffffffffffffffff
RDX: 00007ffd4a2e2c60 RSI: 00000000400464ab RDI: 0000000000000009
RBP: 00007ffd4a2e2c60 R8: 0000000000000000 R9: 0000000000000000
R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
ORIG_RAX: 0000000000000010 CS: 0033 SS: 002b
#0
:текущая функция__wake_up_common
существоватьадресffffffff810dffef
。#1
:называется__wake_up
функция。#2
:Затемназываетсяcomplete
функция,И так далее.KDUMP широко используется в производственных средах, особенно в системах, требующих высокой доступности и быстрого устранения неполадок. Ниже приведены некоторые практические сценарии применения:
KDUMP — мощный и практичный инструмент в системах Linux, который имеет большое значение для повышения стабильности системы и возможностей устранения неполадок. Правильно настроив и используя KDUMP, системные администраторы и разработчики могут эффективно собирать и анализировать информацию о сбоях ядра, чтобы быстро решать системные проблемы и обеспечивать высокую доступность и надежность системы.