Увімкнення Kdump у Linux: дамп ядра при kernel panic
Рівень: Середній / Старший
Орієнтовний час: ~30 хвилин
Мета: Налаштувати захоплення дампів пам'яті kdump для kernel panic, що дозволяє надійний пост-мортем аналіз збоїв на продакшені. Цей посібник пояснює, як увімкнути kdump у Linux, охоплюючи повне налаштування linux crash dump від резервування пам'яті до аналізу vmcore.
Вступ
Kernel panic зупиняє систему, і без crash dump ви не маєте жодних даних для роботи. Kdump — стандартний фреймворк дампів пам'яті (crash dump) ядра Linux — вирішує це: він попередньо завантажує ядро захоплення (capture kernel) у зарезервовану пам'ять, і коли основне ядро зазнає паніки, kexec завантажує це ядро захоплення для запису повного образу пам'яті (vmcore) на диск. У цьому посібнику ви дізнаєтесь, як увімкнути kdump у Linux для захоплення dump під час linux kernel panic на системах Ubuntu, Debian та RHEL. Ми покажемо вам точно, як увімкнути kdump на системах Linux, включаючи кроки пост-мортем аналізу vmcore в Linux.
Що таке Kdump?
Kdump — це механізм створення дампів пам'яті ядра під час збоїв, який використовує kexec для завантаження вторинного ядра захоплення із зарезервованої області пам'яті, коли основне ядро зазнає паніки. Ядро захоплення працює з обмеженою пам'яттю (встановленою параметром завантаження crashkernel) і записує образ пам'яті ядра, що зазнало збою, на диск як vmcore — повний файл дампу пам'яті, який можна проаналізувати за допомогою утиліти crash або gdb. Служба kdump (kdump.service на RHEL або kdump-tools.service на системах Debian) керує завантаженням ядра захоплення під час завантаження системи.
Основні компоненти:
- Kexec — системний виклик та інструмент користувацького простору, який завантажує ядро захоплення в зарезервовану пам'ять.
- Crashkernel — параметр завантаження, який повідомляє основному ядру, скільки оперативної пам'яті зарезервувати для роботи kdump (наприклад,
crashkernel=256M). - Vmcore — вихідний файл, що містить повний дамп пам'яті, який за замовчуванням записується в
/var/crash. - /var/crash — каталог за замовчуванням, де kdump зберігає файли vmcore після паніки ядра.
Вимоги
Перед початком переконайтеся, що виконані такі умови:
- Операційна система: Ubuntu 22.04/24.04 LTS, Debian 12/13, або RHEL/CentOS/AlmaLinux 9/10 (Протестовано та перевірено на Ubuntu 24.04, Debian 13 та AlmaLinux 10).
- Доступ:
sudoабо root доступ до сервера. - RAM: Мінімум 2 ГБ загальної пам'яті. Kdump резервує частину системної пам'яті (зазвичай 256 МБ) для ядра захоплення — системам з малим обсягом пам'яті може не вистачити запасу.
- Дисковий простір: Щонайменше стільки ж вільного місця у
/var/crash, скільки у вашій системі оперативної пам'яті (vmcore може бути розміром із фізичну пам'ять). - Необхідні знання: впевнене використання командного рядка Linux, базове редагування файлів та знайомство з параметрами завантаження GRUB.
- Вікно для перезавантаження: Налаштування параметра
crashkernelвимагає перезавантаження для набуття чинності.
Крок 1: Встановлення пакетів kdump та kexec
Kdump покладається на kexec-tools (компонент kexec kdump користувацького простору) та специфічні для дистрибутива допоміжні утиліти.
Ubuntu/Debian:
sudo apt update && sudo apt install kdump-tools kexec-tools crash -y
Під час інтерактивного встановлення на Ubuntu може з'явитися запит debconf з проханням автоматично налаштувати параметр crashkernel. Виберіть Так, якщо запитають. Якщо запит не з'являється (наприклад, у неінтерактивному режимі), crashkernel налаштовується автоматично через drop-in файл. Якщо вам потрібно пізніше налаштувати значення, Крок 2 охоплює ручне налаштування.
RHEL/CentOS/AlmaLinux:
sudo dnf install kexec-tools crash -y
На системах на базі RHEL пакет kexec-tools надає все необхідне: бінарний файл kexec, службу kdump та файли конфігурації за замовчуванням.
На сучасних версіях, таких як AlmaLinux 9 і 10, kexec-tools зазвичай попередньо встановлено, а служба kdump.service вже активна за замовчуванням. Ви можете перевірити це, запустивши cat /sys/kernel/kexec_crash_loaded — якщо він повертає 1, Кроки 2 і 4 можна безпечно пропустити.
Пакет crash є стандартним інструментом Linux для аналізу vmcore. Його встановлення зараз заощадить час, коли вам дійсно знадобиться перевірити дамп.
Крок 2: Налаштування параметра завантаження crashkernel
Параметр crashkernel повідомляє ядру, скільки пам'яті потрібно зарезервувати для kdump під час завантаження. Без цього резервування ядро захоплення не матиме де працювати. Розуміння того, як правильно налаштувати значення параметра crashkernel, є важливим — занадто мало, і ядро захоплення не завантажиться; занадто багато, і ви змарнуєте оперативну пам'ять продакшену.
2.1 Перевірка поточної конфігурації
Спочатку перевірте, чи вже встановлено crashkernel:
cat /proc/cmdline | grep crashkernel
Якщо вивід містить запис crashkernel=, параметр уже налаштовано. Ви можете перевірити зарезервований обсяг і перейти до Кроку 3, якщо він відповідає вашим потребам.
2.2 Налаштування параметра crashkernel на системах з GRUB
Ubuntu/Debian:
Перш ніж змінювати основну конфігурацію GRUB, перевірте, чи вже існує drop-in файл:
cat /etc/default/grub.d/kdump-tools.cfg
Якщо пакет вже налаштував crashkernel тут, змініть цей файл, щоб запобігти дублюванню записів у grub.cfg. В іншому випадку відкрийте основний файл за замовчуванням GRUB:
sudo nano /etc/default/grub
Знайдіть рядок GRUB_CMDLINE_LINUX_DEFAULT і додайте параметр crashkernel. Для більшості продакшен-серверів з 4 ГБ або більше оперативної пам'яті 256 МБ достатньо для резервування пам'яті для kdump у Linux:
GRUB_CMDLINE_LINUX_DEFAULT="quiet crashkernel=256M"
Якщо в рядку вже є інші параметри, додайте crashkernel=256M після пробілу — не замінюйте існуючі значення.
Для серверів з менш ніж 4 ГБ оперативної пам'яті використовуйте crashkernel=128M. Для систем з 64 ГБ або більше розгляньте crashkernel=512M. Ви також можете використовувати синтаксис автоматичного масштабування crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M для динамічного налаштування значень параметра crashkernel на основі встановленої оперативної пам'яті.
Збережіть і закрийте файл, потім згенеруйте конфігурацію GRUB:
sudo update-grub
RHEL/CentOS/AlmaLinux:
Для RHEL/AlmaLinux 8+ параметр crashkernel знаходиться в GRUB_CMDLINE_LINUX (без _DEFAULT). Однак на сучасних системах, що використовують BLS (Boot Loader Specification), найбезпечнішим і рекомендованим способом оновлення командного рядка ядра є використання grubby замість прямого редагування /etc/default/grub:
sudo grubby --update-kernel=ALL --args="crashkernel=256M"
Якщо вам обов'язково потрібно змінити його вручну через конфігурації GRUB, відредагуйте /etc/default/grub і оновіть GRUB_CMDLINE_LINUX. Потім згенеруйте конфігурацію (шляхи відрізняються залежно від режиму завантаження):
# Для застарілих систем BIOS: sudo grub2-mkconfig -o /boot/grub2/grub.cfg # Для систем UEFI (наприклад, AlmaLinux): sudo grub2-mkconfig -o /boot/efi/EFI/almalinux/grub.cfg
Неправильна конфігурація GRUB може зробити систему незавантажуваною. Двічі перевірте свої записи. Якщо у вас є доступ до консолі (IPMI/KVM), тримайте його готовим.
2.3 Перезавантаження для застосування резервування crashkernel
Резервування пам'яті crashkernel набуває чинності лише після перезавантаження:
sudo reboot
Після того, як система знову запрацює, переконайтеся, що резервування активне:
cat /proc/cmdline | grep crashkernel
Очікуваний вивід включає:
crashkernel=256M
Також підтвердіть, що пам'ять була дійсно зарезервована:
sudo dmesg | grep -i "crashkernel reserved"
Ви повинні побачити рядок на зразок:
crashkernel reserved: 0x... - 0x... (NNN MB)
Якщо резервування не вдалося (повідомлення говорить "crashkernel reservation failed"), вам може знадобитися збільшити або зменшити значення. Це поширений крок у вирішенні проблем (troubleshooting) паніки ядра Linux — ядро не змогло знайти безперервний блок запитаного розміру.
Крок 3: Налаштування служби kdump
Маючи зарезервовану пам'ять, налаштуйте, де і як kdump зберігає vmcore.
3.1 Конфігурація RHEL/CentOS/AlmaLinux
Основний файл конфігурації — /etc/kdump.conf. Відкрийте його:
sudo nano /etc/kdump.conf
Критичні директиви:
path /var/crash core_collector makedumpfile -l --message-level 7 -d 31
path /var/crash— встановлює цільовий каталог для vmcore. Всі дампи збоїв потрапляють сюди.core_collector makedumpfile— стискає дамп і фільтрує непотрібні сторінки. Прапорець-d 31виключає нульові сторінки, кеш, дані користувачів та вільні сторінки — зазвичай зменшуючи vmcore до 10-20% загальної оперативної пам'яті.
Шлях за замовчуванням /var/crash є відносним до кореневої файлової системи. Якщо ваша коренева розділ мала, розгляньте можливість вказати це на виділений розділ або зовнішнє монтування з достатнім простором.
3.2 Конфігурація Ubuntu/Debian
На системах на базі Debian конфігурація kdump-tools знаходиться у /etc/default/kdump-tools. Відкрийте його:
sudo nano /etc/default/kdump-tools
Переконайтеся, що встановлені такі рядки:
USE_KDUMP=1 KDUMP_COREDIR="/var/crash" KDUMP_CORE_COLLECTOR="makedumpfile -l --message-level 7 -d 31"
USE_KDUMP=1 вмикає службу kdump. Без цього ядро захоплення не буде завантажено під час запуску системи.
Крок 4: Увімкнення та запуск служби kdump
Це останній крок у тому, як увімкнути kdump в Linux. Увімкніть службу kdump, щоб ядро захоплення завантажувалося автоматично під час кожного запуску, завершуючи налаштування kexec kdump у Linux.
Ubuntu/Debian:
sudo systemctl enable kdump-tools sudo systemctl start kdump-tools
RHEL/CentOS/AlmaLinux:
sudo systemctl enable kdump sudo systemctl start kdump
Перевірте, чи працює служба:
Ubuntu/Debian:
sudo systemctl status kdump-tools
RHEL/CentOS/AlmaLinux:
sudo systemctl status kdump
Очікуваний вивід включає:
Active: active (exited)
Стан "exited" є нормальним — служба kdump завантажує ядро захоплення в зарезервовану пам'ять і потім завершує роботу. Вона не працює як постійний демон.
Якщо служба не запускається, запустіть journalctl -xeu kdump (або kdump-tools на системах на базі Debian), щоб дізнатися причину. Найпоширенішою причиною є відсутнє або недостатнє резервування crashkernel — поверніться до Кроку 2.
Крок 5: Перевірка та тестування
5.1 Перевірка готовності kdump
Переконайтеся, що ядро захоплення завантажено та готове спрацювати при kernel panic:
cat /sys/kernel/kexec_crash_loaded
Очікуваний вивід:
1
Значення 1 означає, що ядро захоплення завантажено. Значення 0 означає, що kdump не працює — поверніться і перевірте стан служби та резервування crashkernel.
Ви також можете перевірити, скільки пам'яті було виділено для резервування пам'яті для kdump у Linux:
cat /sys/kernel/kexec_crash_size
Це повертає резервування в байтах.
5.2 Виклик тестового збою
Наступна команда викликає миттєву паніку ядра. Система зруйнується, захопить vmcore і перезавантажиться. Ніколи не виконуйте це на продакшен-сервері під час робочих годин без вікна обслуговування. Переконайтеся, що всі критичні служби або виведені з ладу, або сервер виведено з ротації балансувальника навантаження.
Увімкніть тригери SysRq, потім викличте збій:
echo 1 | sudo tee /proc/sys/kernel/sysrq echo c | sudo tee /proc/sysrq-trigger
Система зазнає паніки. Якщо kdump налаштовано правильно, ядро захоплення завантажується, записує vmcore в /var/crash, і система автоматично перезавантажується.
Ваша сесія SSH миттєво перерветься. Зачекайте 3–5 хвилин, поки дамп буде записано, а система повністю перезавантажиться, перш ніж намагатися підключитися знову.
5.3 Підтвердження захоплення vmcore
Після перезавантаження перевірте /var/crash на наявність дампу:
ls -lh /var/crash/
Очікуваний вивід (формат залежить від дистрибутива):
Сімейство RHEL (AlmaLinux/CentOS):
drwxr-xr-x 2 root root 4.0K May 23 14:00 127.0.0.1-2026-05-23-14:00:01/
Всередині цього каталогу з часовою міткою ви знайдете vmcore (дамп пам'яті) та vmcore-dmesg.txt (журнал ядра).
Сімейство Debian (Ubuntu/Debian):
drwxr-xr-x 2 root root 4.0K May 23 14:00 202605231400/
Всередині цього каталогу файли зазвичай називаються dump.<timestamp> та dmesg.<timestamp>.
Перевірте всередині каталогу:
ls -lh /var/crash/*/
Наявність цих файлів підтверджує, що ваш конвеєр дампів пам'яті ядра Linux повністю працездатний.
Крок 6: Аналіз файлу vmcore
Захоплення дампу збою корисне лише в тому випадку, якщо ви можете його прочитати. Утиліта crash — це стандартний інструмент для аналізу vmcore, на який покладаються адміністратори Linux для вирішення проблем (troubleshooting) паніки ядра Linux.
6.1 Встановлення debug ядра
Інструмент crash вимагає символів налагодження (debug symbols) для тієї самої версії ядра, яка зазнала паніки.
Ubuntu:
echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ddebs.list sudo apt install ubuntu-dbgsym-keyring sudo apt update sudo apt install linux-image-unsigned-$(uname -r)-dbgsym
Для підписаних ядер символи налагодження знаходяться в пакеті unsigned.
Debian:
echo "deb http://deb.debian.org/debian-debug/ $(lsb_release -cs)-debug main" | sudo tee /etc/apt/sources.list.d/debian-debug.list sudo apt update sudo apt install linux-image-$(uname -r)-dbg
Ви повинні встановити точну збірку символів налагодження. Якщо пакет не знайдено, оновіть ядро до останньої доступної версії та перезавантажте систему.
RHEL/CentOS/AlmaLinux:
sudo dnf --enablerepo='*-debuginfo' install -y kernel-debuginfo-$(uname -r)
Альтернативно, ви можете використати sudo dnf debuginfo-install -y kernel-$(uname -r), якщо доступний плагін debuginfo-install.
6.2 Відкриття vmcore за допомогою crash
Перед запуском crash перевірте наявність файлу vmlinux, щоб не запускати команду наосліп і одразу бачити, чи збігаються символи:
# RHEL/Debian: ls -lh /usr/lib/debug/lib/modules/$(uname -r)/vmlinux # Ubuntu: ls -lh /usr/lib/debug/boot/vmlinux-$(uname -r)
Перейдіть до каталогу дампу збою та відкрийте vmcore (точна команда залежить від ОС):
RHEL/CentOS/AlmaLinux:
sudo crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/crash/*/vmcore
Debian:
sudo crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/crash/*/dump.*
Ubuntu:
sudo crash /usr/lib/debug/boot/vmlinux-$(uname -r) /var/crash/*/dump.*
Утиліта crash завантажується і переводить вас в інтерактивну оболонку. Основні команди для початкового сортування (triage):
bt # backtrace завдання, що спричинило паніку log # буфер журналу ядра (те саме, що dmesg на момент паніки) ps # список процесів на момент збою mod # завантажені модулі ядра sys # системна інформація
Введіть exit або quit, щоб вийти з оболонки crash.
Почніть з bt, щоб побачити точний стек викликів, який спровокував паніку. У більшості випадків це одразу вказує на проблемний модуль або драйвер ядра — найпряміша доступна техніка вирішення проблем паніки ядра Linux.
Відкат змін
Щоб скасувати налаштування kdump та звільнити зарезервовану пам'ять:
1. Зупиніть та вимкніть службу kdump:
Ubuntu/Debian:
sudo systemctl disable --now kdump-tools
RHEL/CentOS/AlmaLinux:
sudo systemctl disable --now kdump
2. Видаліть параметр crashkernel:
Ubuntu/Debian:
Відкрийте drop-in конфігураційний файл:
sudo nano /etc/default/grub.d/kdump-tools.cfg
Видаліть параметр crashkernel (якщо ви додавали його до /etc/default/grub вручну, відредагуйте той файл).
RHEL/CentOS/AlmaLinux:
Відкрийте файл GRUB за замовчуванням:
sudo nano /etc/default/grub
Видаліть crashkernel=256M з рядка GRUB_CMDLINE_LINUX або GRUB_CMDLINE_LINUX_DEFAULT.
Згенеруйте GRUB:
Ubuntu/Debian:
sudo update-grub
RHEL/CentOS/AlmaLinux:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
3. Перезавантажте, щоб звільнити зарезервовану пам'ять:
sudo reboot
4. Видаліть пакети (необов'язково):
Ubuntu/Debian:
sudo apt remove --purge kdump-tools kexec-tools crash -y
RHEL/CentOS/AlmaLinux:
sudo dnf remove kexec-tools crash -y
Видалення kdump означає, що система більше не буде захоплювати дампи збоїв під час паніки ядра. Будь-які існуючі файли vmcore у /var/crash не видаляються — архівуйте або видаляйте їх вручну, якщо вам потрібен дисковий простір.
Вирішення проблем
Служба kdump не запускається
Перевірте журнал, щоб дізнатися причину:
journalctl -xeu kdump
Поширені причини:
- Немає резервування crashkernel. Перевірте за допомогою
cat /proc/cmdline | grep crashkernel. Якщо відсутнє, повторіть Крок 2. - Недостатньо зарезервованої пам'яті. Ядру захоплення потрібно достатньо оперативної пам'яті для ініціалізації та запису дампу. Спробуйте збільшити значення (наприклад,
crashkernel=512M). - Конфлікт Secure Boot. Деякі конфігурації Secure Boot не дозволяють kexec завантажувати непідписані ядра. Або підпишіть ядро захоплення, або вимкніть Secure Boot в BIOS.
Vmcore не записується після паніки
- Дисковий простір. Переконайтеся, що
/var/crashмає достатньо вільного місця. Vmcore може наближатися до розміру фізичної оперативної пам'яті (до стисненняmakedumpfile). - Неправильний шлях. Переконайтеся, що
pathу/etc/kdump.conf(абоKDUMP_COREDIRу/etc/default/kdump-tools) вказує на доступну для запису, змонтовану файлову систему. - Відмова SELinux. На системах RHEL перевірте
ausearch -m avc -ts recentна наявність відмов, пов'язаних з kdump.
Система зависає замість захоплення дампу
Це зазвичай вказує на проблему з обладнанням або драйвером, яка запобігає переходу kexec kdump у Linux. Спробуйте додати irqpoll nr_cpus=1 reset_devices до командного рядка ядра kdump у /etc/sysconfig/kdump (RHEL) або /etc/default/kdump-tools (Debian) як KDUMP_CMDLINE_APPEND.
Висновок
Ось і все. Crashkernel резервує пам'ять, служба kdump завантажує ядро захоплення під час запуску системи, і під час дампу паніки ядра Linux vmcore опиняється в /var/crash — готовій до роботи конфігурації linux crash dump, якій ви можете довіряти. Тепер ви маєте робочу систему для автоматичного увімкнення захоплення дампів збоїв kdump у Linux; для глибшого вирішення проблем паніки ядра Linux передайте vmcore до crash і почніть з backtrace.
Версія документу: 1.0
Останнє оновлення: Травень 2026
Власник: Команда технічної документації