Linux: глубокое погружение в KDUMP, мощный инструмент отладки сбоев ядра
Linux: глубокое погружение в KDUMP, мощный инструмент отладки сбоев ядра

KDUMP — это ключевая функция ядра Linux, которая используется для создания дампов памяти (дампов ядра) при сбое системы. Это очень важно для системных администраторов и разработчиков для анализа и устранения проблем, связанных с сбоями системы. В этой статье подробно описаны принцип работы, метод настройки и применение KDUMP в реальных операциях.

1. Как работает KDUMP

KDUMP использует механизм kexec, который позволяет загружать и запускать новое ядро ​​сразу после сбоя ядра без необходимости перезагрузки системы через BIOS или прошивку. Основные этапы KDUMP следующие:

  1. сбой предварительной конфигурации ядра (сбой ядро): Когда система работает нормально, часть памяти заранее выделяется на случай сбоя Ядро.
  2. Включение Ядро при сбое: когда основной Ядро выходит из строя, Ядро до сбоя загружается и запускается через механизм kexec.
  3. Генерация дампа памяти: сбой Ядро после запуска,Используйте инструмент kdump для создания файла дампа памяти.,Сохраните его в предварительно установленном месте (например, на локальном диске, в общем ресурсе NFS или на удаленном сервере).

2. Конфигурация KDUMP

Настройка KDUMP в основном включает в себя следующие шаги:

1. Установите инструмент KDUMP.

В большинстве дистрибутивов Linux инструмент KDUMP можно установить через менеджер пакетов, например в CentOS или RHEL:

Язык кода:javascript
копировать

bash
sudo yum install kexec-tools
2. Настройте параметры ядра

Редактировать файлы конфигурации GRUB,добавить вcrashkernelпараметры для резервирования памяти。Например,существовать/etc/default/grubв файле:

Язык кода:javascript
копировать

bash
GRUB_CMDLINE_LINUX="crashkernel=128M"

Обновите конфигурацию GRUB:

Язык кода:javascript
копировать

bash
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
3. Настройте службу KDUMP.

редактироватьKDUMPКонфигурациядокумент/etc/kdump.conf,Укажите место сохранения файла дампа памяти:

Язык кода:javascript
копировать

bash
path /var/crash

Запустите и включите службу KDUMP:

Язык кода:javascript
копировать

bash
sudo systemctl start kdump
sudo systemctl enable kdump

3. Проверьте конфигурацию KDUMP.

Чтобы убедиться, что KDUMP настроен правильно, вы можете вручную вызвать сбой системы:

Язык кода:javascript
копировать

bash
echo c > /proc/sysrq-trigger

Система выйдет из строя и перезагрузится, а служба KDUMP создаст файл дампа памяти. Созданный файл дампа можно просмотреть в настроенном месте сохранения.

4. Анализ файлов дампа памяти

Сгенерированный дамп памятидокумент Можетиспользоватьcrashинструменты для анализа。crashИнструмент предоставляет интерактивный интерфейс командной строки.,Используется для просмотра структуры данных Ядро, трассировки стека и другой информации.

Установитьcrashинструмент:

Язык кода:javascript
копировать

bash
sudo yum install crash

использоватьcrashинструмент Загрузить дамп памятидокументиотлаживатьсимволдокумент:

Язык кода:javascript
копировать

bash
sudo crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/crash/2023-06-24-10\:00/vmcore

существоватьcrashинструментсередина,Для просмотра сведений о файле дампа памяти можно использовать различные команды.

logиbtКоманды — две очень важные команды。logкоманда для просмотра Ядробревно,иbtКоманда для просмотра информации трассировки стека при сбое。Ниже приводится подробное описание и примеры этих двух команд.。

4.1 logЗаказ

logЗаказдля показа Ядроизбревноинформация,В этих журналах фиксируются различные события, происходящие во время работы системы.,Включает ошибки, предупреждения и информационные сообщения. Просмотр журнала Ядро может помочь нам понять, какие важные события произошли до сбоя системы.

4.1.1 Пример:

Предположим, мысуществоватьcrashинструментсередина输入logЗаказ,Вывод может быть следующим:

Язык кода:javascript
копировать

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 ]---
4.1.2 Пояснение:
  • Инициализация журнала Ядро: В начале журнала записывается процесс инициализации подсистемы Ядро.
  • Информация SELinux: средняя часть записывает изменения статуса SELinux и соответствующие системные сообщения.
  • Сообщение об ошибке: критическая часть журнала находится в последних нескольких строках.,Записал подробную информацию об ОШИБКЕ в систему.,Включает необработанную ошибку ссылки на нулевой указатель.(unable to handle kernel NULL pointer dereference)、связанный IP-адрес、Информация о модуле и т. д.
  • Ядростек вызовов:бревносередина还包含了错误发生时из Ядростек вызововинформация(RIPRSPждать),Эта информация очень полезна для определения источника ошибки.
4.2 btЗаказ

btЗаказдля показа崩溃时из栈跟踪(Backtrace)информация,Благодаря трассировке стека вы можете понять цепочку вызовов программы в случае ее сбоя.,Это помогает найти источник проблемы.

4.2.1 Пример:

Предположим, мысуществоватьcrashинструментсередина输入btЗаказ,Вывод может быть следующим:

Язык кода:javascript
копировать

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
4.2.2 Пояснение:
  • Информация о задаче: отображает идентификатор процесса (PID), адрес структуры задачи (TASK), номер ЦП и имя процесса (КОМАНДА).
  • Информация стека вызовов: каждая строка представляет вызов функции.,Снизу вверх — порядок вызовов текущей функции к исходной функции.。например:
    • #0:текущая функция__wake_up_commonсуществоватьадресffffffff810dffef
    • #1:называется__wake_upфункция。
    • #2:Затемназываетсяcompleteфункция,И так далее.
  • Информация о регистре: внизу отображается информация быстрого пути для системных вызовов.,Включая значение каждого регистра (например, RIP, RSP, RAX и т. д.),Эта информация очень важна для отлаживать.

5. Практическое применение КДУМП.

KDUMP широко используется в производственных средах, особенно в системах, требующих высокой доступности и быстрого устранения неполадок. Ниже приведены некоторые практические сценарии применения:

  1. Кластер серверов: В кластере серверов.,KDUMP может помочь быстро обнаружить и решить проблемы сбоя Ядро.,Сократите время простоя.
  2. встроеннаясистема: во встраиваемых устройствах,KDUMP можно использовать для регистрации и анализа случайных сбоев Ядро.,Помогите улучшить стабильность системы.
  3. Среды разработки и тестирования: В средах разработки и тестирования.,KDUMP помогает разработчикам отлаживать Ядро модулей и драйверов,Быстро находите и устраняйте проблемы.

6. Заключение

KDUMP — мощный и практичный инструмент в системах Linux, который имеет большое значение для повышения стабильности системы и возможностей устранения неполадок. Правильно настроив и используя KDUMP, системные администраторы и разработчики могут эффективно собирать и анализировать информацию о сбоях ядра, чтобы быстро решать системные проблемы и обеспечивать высокую доступность и надежность системы.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose