00 kdump nedir — kexec ve /proc/vmcore
kdump, kernel panik anında sistemin bellek içeriğini diske yazan bir crash dump mekanizmasıdır. Bunu mümkün kılan kexec, normal boot sürecini atlayarak çalışmakta olan kernel'ın yerine yeni bir kernel yükler.
Çalışma akışı
Boot sırasında:
┌──────────────────────────────────────────────────────┐
│ 1. Birincil kernel boot eder │
│ 2. crashkernel= parametresiyle ayrılan RAM bölgesi │
│ ikincil (crash) kernel için rezerve edilir │
│ 3. kexec-tools crash kernel'ı bu bölgeye yükler │
└──────────────────────────────────────────────────────┘
Panik anında:
┌──────────────────────────────────────────────────────┐
│ 4. Birincil kernel panik atar │
│ 5. kexec mekanizması crash kernel'a geçiş yapar │
│ (normal boot değil — direkt çekirdek geçişi) │
│ 6. Crash kernel çalışır, /proc/vmcore oluşturur │
│ 7. makedumpfile ile vmcore diske yazılır │
│ 8. Sistem yeniden başlatılabilir │
└──────────────────────────────────────────────────────┘
Analiz:
┌──────────────────────────────────────────────────────┐
│ 9. crash vmlinux vmcore.dmp │
│ 10. Post-mortem analiz: bt, log, ps, vm │
└──────────────────────────────────────────────────────┘
/proc/vmcore
Crash kernel çalışırken, birincil kernel'ın fiziksel belleği /proc/vmcore üzerinden ELF format olarak erişilebilir hale gelir. Bu dosya okunduğunda birincil kernel'ın RAM içeriği döndürülür — sürücülerin, yığın izlerinin ve global değişkenlerin anlık görüntüsü.
Gerekli kernel konfigürasyonu
CONFIG_KEXEC=y
CONFIG_CRASH_DUMP=y
CONFIG_PROC_VMCORE=y
CONFIG_DEBUG_INFO=y # crash analizi için DWARF bilgisi
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
01 kdump kurulumu
kdump kurulumu üç adımdan oluşur: kexec-tools paketi, crashkernel boot parametresi ve kdump servisinin yapılandırılması.
Kurulum
# kexec-tools paketini kur
apt install kexec-tools kdump-tools
# servis durumunu kontrol et
systemctl status kdump-tools
# veya
systemctl status kdump
crashkernel boot parametresi
# /etc/default/grub dosyasını düzenle
GRUB_CMDLINE_LINUX="crashkernel=256M"
# GRUB'u güncelle
update-grub
# Yeniden başlat
reboot
# Rezerve edilen belleği doğrula
cat /proc/iomem | grep 'Crash kernel'
# 08000000-0fffffff : Crash kernel (128 MB @ 128 MB fiziksel adres)
crashkernel değeri seçimi
kdump yapılandırması
# Dump dosyasının yazılacağı yer
path /var/crash
# Kullanılacak sıkıştırma seviyesi
core_collector makedumpfile -l --message-level 1 -d 31
# Dump tamamlandıktan sonra ne yapılacak
default reboot
# kdump servisini etkinleştir ve başlat
systemctl enable kdump
systemctl start kdump
# Crash kernel yüklendi mi?
cat /sys/kernel/kexec_crash_loaded
# 1 (1 = yüklendi, 0 = yüklenmedi)
02 makedumpfile — vmcore'u küçült
Ham vmcore dosyası, sistemin tüm fiziksel belleğinin kopyasıdır — 16 GB RAM'li bir sistemde 16 GB'a kadar büyüyebilir. makedumpfile, analiz için gerekli olmayan bellek sayfalarını ayıklayarak dosyayı küçültür.
Dump seviyeleri (-d)
Kullanım örnekleri
# Crash kernel içinde /proc/vmcore'dan dump al
makedumpfile -l -d 31 -x /boot/vmlinux-$(uname -r) /proc/vmcore /var/crash/vmcore.dmp
# -l = LZO sıkıştırma
# -d 31 = yalnızca kernel sayfaları
# -x = debug info için vmlinux
# Alternatif sıkıştırma seçenekleri
makedumpfile -c -d 31 /proc/vmcore vmcore.dmp # zlib
makedumpfile -z -d 31 /proc/vmcore vmcore.dmp # snappy (en hızlı)
# İnsan okunabilir boyut karşılaştırması
ls -lh /proc/vmcore # ham büyüklük: ~8 GB
ls -lh /var/crash/vmcore.dmp # sıkıştırılmış: ~80 MB
-d 31 ile userspace bellek (process heap/stack, shared libraries) dump'a dahil edilmez. Bu yeterlidir çünkü kernel panic analizi için kernel veri yapıları, slab tahsisleri ve kernel stack izleri gereklidir — userspace sayfaları değil.
03 crash utility — post-mortem analiz
crash utility, vmcore dosyasını GDB benzeri etkileşimli bir oturumda inceler. Kernel'ın debug sembollerini içeren vmlinux dosyasıyla birlikte kullanılır.
Kurulum
# Debian/Ubuntu
apt install crash
# RHEL/CentOS
yum install crash
crash oturumu başlatma
# Temel kullanım
crash /boot/vmlinux-6.6.0 /var/crash/vmcore.dmp
# Debug paketinden vmlinux (önerilen)
apt install linux-image-$(uname -r)-dbg
crash /usr/lib/debug/boot/vmlinux-$(uname -r) vmcore.dmp
# Çapraz platform analiz (ARM64 dump'ı x86 makinede analiz et)
crash --target aarch64 /path/to/aarch64-vmlinux vmcore.dmp
crash başlangıç ekranı
KERNEL: /boot/vmlinux-6.6.0
DUMPFILE: /var/crash/vmcore.dmp [PARTIAL DUMP]
CPUS: 4
DATE: Sat Apr 12 14:32:18 2026
UPTIME: 02:15:43
LOAD AVERAGE: 0.45, 0.32, 0.28
TASKS: 247
NODENAME: embedded-target
RELEASE: 6.6.0-rc4
VERSION: #1 SMP Sat Apr 5 10:00:00 UTC 2026
MACHINE: aarch64 (2800 Mhz)
MEMORY: 4 GB
PANIC: "Kernel panic - not syncing: sysrq triggered crash"
PID: 1234
COMMAND: "bash"
TASK: ffff000012345678
CPU: 0
STATE: TASK_RUNNING (PANIC)
crash>
04 crash komutları — bt, log, ps, vm, kmem
crash utility, kernel veri yapılarını sorgulayan onlarca komut sunar. En sık kullanılan komutları bilerek başla.
bt — backtrace (yığın izi)
crash> bt
PID: 1234 TASK: ffff000012345678 CPU: 0 COMMAND: "bash"
#0 [ffff0000123f7e20] machine_kexec at ffff8000101234ab
#1 [ffff0000123f7e80] __crash_kexec at ffff800010234567
#2 [ffff0000123f7f00] panic at ffff800010345678
#3 [ffff0000123f7f80] sysrq_handle_crash at ffff800012345678
#4 [ffff0000123f7fa0] __handle_sysrq at ffff800012345abc
#5 [ffff0000123f7fc0] write_sysrq_trigger at ffff800012345def
crash> bt 456 # belirli PID'in yığın izi
crash> foreach bt # tüm görevlerin yığın izi
log — kernel ring buffer
crash> log
[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[ 0.000000] Linux version 6.6.0 (gcc version 12.2.0)
...
[ 135.123456] my_driver: başlatıldı
[ 135.234567] BUG: KASAN: slab-out-of-bounds in my_driver_write
[ 135.234890] Kernel panic - not syncing: sysrq triggered crash
crash> log | tail -20 # son 20 satır
ps — süreç listesi
crash> ps
PID PPID CPU TASK ST %MEM VSZ RSS COMM
0 0 0 ffff000010a RU 0.0 0 0 [swapper/0]
1 0 0 ffff0000123 IN 0.1 1234 456 systemd
234 1 1 ffff0000456 IN 0.2 5678 789 kworker/1:2
1234 456 0 ffff0000789 RU 0.5 12345 2345 bash ← panik görevi
crash> ps bash # bash süreçlerini filtrele
files — açık dosyalar
crash> files 1234
PID: 1234 TASK: ffff000012345678 COMMAND: "bash"
ROOT: / CWD: /home/user
FD FILE DENTRY INODE TYPE PATH
0 ffff000011111 ffff000022 ffff000033 CHR /dev/tty1
1 ffff000044444 ffff000055 ffff000066 CHR /dev/tty1
2 ffff000077777 ffff000088 ffff000099 CHR /dev/tty1
vm — sanal bellek
crash> vm 1234
PID: 1234 TASK: ffff000012345678 COMMAND: "bash"
MM PGD RSS TOTAL_VM
ffff000123 ffff000456 2345 kB 12345 kB
VMA START END FLAGS FILE
ffff000789 00400000 00500000 r-x-- /bin/bash
ffff000abc 00700000 00800000 rw--- /bin/bash
ffff000def 7ffe000000 7fff000000 rwx-- [stack]
kmem — kernel bellek kullanımı
crash> kmem -i
PAGES TOTAL PERCENTAGE
TOTAL MEM 1048576 4096 MB ----
FREE 524288 2048 MB 50% of TOTAL MEM
USED 524288 2048 MB 50% of TOTAL MEM
SHARED 32768 128 MB 3% of TOTAL MEM
crash> kmem -s kmalloc-64 # belirli slab cache istatistikleri
crash> rd ffff000012345678 # ham bellek okuma (read data)
crash> struct task_struct ffff000012345678 # struct göster
05 Kernel oops vs panic — BUG_ON ve WARN_ON
Kernel, hata durumlarında farklı şiddet seviyelerinde tepki verir. Oops kurtarılabilir bir hatayı temsil ederken, panic sistemi durdurur.
Oops
Kernel oops, kernel'ın kurtarılabilir gördüğü bir hata durumunda oluşur. Hatalı görev sonlandırılır ama sistem çalışmaya devam eder. NULL pointer dereference, geçersiz opcode, oops'u tetikler.
[ 1234.567890] BUG: kernel NULL pointer dereference, address: 0000000000000008
[ 1234.567900] #PF: supervisor write access in kernel mode
[ 1234.567910] #PF: error_code(0x0002) - not-present page
[ 1234.567920] PGD 0 P4D 0
[ 1234.567930] Oops: 0002 [#1] PREEMPT SMP KASAN
[ 1234.567940] CPU: 0 PID: 1234 Comm: my_app Not tainted 6.6.0
[ 1234.567950] RIP: 0010:my_driver_write+0x30/0x80 [my_driver]
[ 1234.567960] Call Trace:
[ 1234.567970] vfs_write+0x100/0x200
[ 1234.567980] ksys_write+0x68/0xe0
BUG_ON ve WARN_ON
#include <linux/bug.h>
/* BUG() — panic'e eşdeğer, koşulsuz */
if (catastrophic_error)
BUG();
/* BUG_ON — koşullu panic */
BUG_ON(ptr == NULL); /* ptr NULL ise kernel panic */
BUG_ON(len > MAX_LEN); /* len aşılırsa kernel panic */
/* WARN() — oops benzeri, ama sistem çalışmaya devam eder */
if (suspicious_condition)
WARN(1, "beklenmedik durum: val=%d\n", val);
/* WARN_ON — koşullu uyarı */
WARN_ON(atomic_read(&ref) < 0); /* negatif referans sayısı şüpheli */
/* WARN_ON_ONCE — yalnızca ilk kez uyarı ver */
WARN_ON_ONCE(deprecated_api_called);
panic_on_oops
# Oops oluşunca sistem panic atsın (kdump için gerekli)
echo 1 > /proc/sys/kernel/panic_on_oops
# Kalıcı ayar
echo 'kernel.panic_on_oops = 1' >> /etc/sysctl.conf
# Panic sonrası otomatik yeniden başlat (saniye)
echo 10 > /proc/sys/kernel/panic
# Boot parametresiyle
# cmdline: panic=10 oops=panic
06 kdump gömülü sistemlerde
Gömülü sistemlerde kısıtlı flash ve RAM, standart kdump kurulumunu zorlaştırır. Alternatif yaklaşımlar ve optimizasyonlar gereklidir.
Zorluklar ve çözümler
| Zorluk | Çözüm |
|---|---|
| Küçük flash (32 MB) | makedumpfile -d 31 ile sadece kernel sayfaları, ağ üzerinden dump |
| Az RAM (128 MB) | crashkernel=32M ile minimal crash kernel, stripped-down crash kernel config |
| Systemd yok | Script tabanlı init'e kdump hook ekle, /etc/init.d/kdump |
| Uzak analiz | netdump veya SSH ile vmcore'u geliştirme makinesine aktar |
Minimal crash kernel konfigürasyonu
CONFIG_CRASH_DUMP=y
CONFIG_PROC_VMCORE=y
# Sürücü desteğini minimize et — sadece storage/ağ için gereken
CONFIG_BLK_DEV_SD=y # SCSI disk (vmcore yazmak için)
CONFIG_EXT4_FS=y # rootfs için
# Gereksiz olanları kapat
# CONFIG_INPUT_KEYBOARD is not set
# CONFIG_USB_SUPPORT is not set
# CONFIG_SOUND is not set
Network dump — netdump alternatifi
#!/bin/sh
# Crash kernel'da çalışan minimal init scripti
# Ağ arayüzünü başlat
ip link set eth0 up
ip addr add 192.168.1.100/24 dev eth0
ip route add default via 192.168.1.1
# makedumpfile ile ağ üzerinden dump gönder (SSH)
makedumpfile -c -d 31 /proc/vmcore /tmp/vmcore.dmp
scp /tmp/vmcore.dmp user@192.168.1.200:/var/crash/
# Yeniden başlat
reboot -f
NAND flash tabanlı gömülü sistemlerde, crash dump'ı doğrudan flash'a yazmak wear leveling'i bozabilir ve flash ömrünü kısaltabilir. Bunun yerine RAM disk (tmpfs) veya ağ dump'ı kullanmak tercih edilmelidir.
07 Pratik: intentional panic analizi
Gerçek bir kernel panikini simüle edip crash utility ile analiz edelim. Bu egzersiz, gerçek bir crash durumunda ne yapacağını öğretir.
Adım 1 — Kasıtlı kernel panic tetikle
# SysRq mekanizmasıyla kernel panic tetikle
# (kdump servisi çalışıyor olmalı)
echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger # 'c' = crash
# Alternatif: Python'dan
python3 -c "
import ctypes
libc = ctypes.CDLL(None)
# Bu yalnızca test ortamında çalıştır!
"
# Veya kernel modülü ile
cat > panic_module.c << 'EOF'
#include <linux/module.h>
static int __init panic_init(void)
{
panic("test panic: intentional crash for kdump demo\n");
return 0;
}
module_init(panic_init);
MODULE_LICENSE("GPL");
EOF
Adım 2 — Dump dosyasını bul
# Dump dosyasını bul
ls -lh /var/crash/
# drwxr-xr-x 2 root root 4.0K Apr 12 14:32 2026-04-12-14:32:18/
ls -lh /var/crash/2026-04-12-14\:32\:18/
# -rw-r--r-- 1 root root 82M Apr 12 14:32 vmcore
# -rw-r--r-- 1 root root 1.2K Apr 12 14:32 kexec-dmesg.log
Adım 3 — crash ile analiz et
$ crash /boot/vmlinux-6.6.0 /var/crash/2026-04-12-14\:32\:18/vmcore
crash> log | grep -A5 'panic'
[ 1234.567] sysrq: SysRq : Trigger a crash
[ 1234.568] Kernel panic - not syncing: sysrq triggered crash
[ 1234.569] CPU: 0 PID: 1234 Comm: bash
[ 1234.570] Hardware name: Raspberry Pi 4 Model B Rev 1.4
crash> bt
#0 machine_kexec
#1 __crash_kexec
#2 panic
#3 sysrq_handle_crash
#4 __handle_sysrq
#5 write_sysrq_trigger
crash> ps
PID PPID CPU TASK ST COMM
0 0 0 ... RU [swapper/0]
1234 890 0 ffff... RU bash ← panik görevi
crash> kmem -i
# Bellek kullanım istatistikleri...
crash> quit
kexec-dmesg.log
# Crash öncesi son kernel mesajları
cat /var/crash/*/kexec-dmesg.log | tail -20
# Panic mesajı ve son log satırları burada —
# crash utility'siz hızlı bir ilk bakış için ideal
Hatırlanacaklar
- kdump = kexec + crash kernel + makedumpfile — panik anında belleği yakala
crashkernel=256Mboot parametresi +systemctl enable kdump— kurulum iki adımmakedumpfile -d 31 -l— yalnızca kernel sayfaları, LZO sıkıştırmalıcrash vmlinux vmcore→bt,log,ps— ilk üç komut- Gömülü: crashkernel=32M, minimal crash kernel config, network dump
BUG_ON()panik atar,WARN_ON()uyarır ama devam eder
Bir sonraki adım: lockdep rehberi — deadlock ve kilit sıralama ihlali tespiti.