Kernel Crash Dump¶
Kernel Crash Dump, çekirdeğin yürütülmesi kesintiye uğradığında diske kopyalanan geçici bellek (RAM) içeriğinin bir bölümünü ifade eder. Aşağıdaki olaylar bir çekirdek bozulmasına neden olabilir:
- Çekirdek Panik
- Maskelenemez Kesintiler (NMI)
- Makine Kontrolü İstisnaları (MCE)
- Donanım arızası
- Manuel müdahale
Bu olaylardan bazıları (panik, NMI) için çekirdek otomatik olarak tepki verecek ve çökme boşaltma mekanizmasını kexec aracılığıyla tetikleyecektir . Diğer durumlarda hafızayı yakalamak için manuel müdahale gerekir. Yukarıdaki olaylardan biri meydana geldiğinde, tekrar olmasını önlemek için temel nedeni bulmak önemlidir. Nedeni, kopyalanan bellek içerikleri incelenerek belirlenebilir.
Kernel Crash Dump Mekanizması¶
Çekirdek paniği meydana geldiğinde, çekirdek, çekirdeğin yeni bir örneğini, sistem önyüklendiğinde ayrılmış olan önceden ayrılmış bellek bölümünde hızla yeniden başlatmak için kexec mekanizmasına güvenir (aşağıya bakın). Bu, içeriğini güvenli bir şekilde depoya kopyalamak için mevcut bellek alanının dokunulmadan kalmasına izin verir.
Kurulum¶
Çekirdek çökme dökümü yardımcı programı aşağıdaki komutla yüklenir:
sudo apt install linux-crashdump
16.04'ten başlayarak, çekirdek kilitlenme dökümü mekanizması varsayılan olarak etkindir. Kurulum sırasında, aşağıdaki iletişim kutuları ile yönlendirileceksiniz.
|------------------------| Configuring kexec-tools |------------------------|
| |
| |
| If you choose this option, a system reboot will trigger a restart into a |
| kernel loaded by kexec instead of going through the full system boot |
| loader process. |
| |
| Should kexec-tools handle reboots (sysvinit only)? |
| |
| <Yes> <No> |
| |
|---------------------------------------------------------------------------|
kexec-tools
Tüm yeniden başlatmalara bağlanmak için Evet'i seçin .
|------------------------| Configuring kdump-tools |------------------------|
| |
| |
| If you choose this option, the kdump-tools mechanism will be enabled. A |
| reboot is still required in order to enable the crashkernel kernel |
| parameter. |
| |
| Should kdump-tools be enabled be default? |
| |
| <Yes> <No> |
| |
|---------------------------------------------------------------------------|
kdump-tools
etkinleştirilmesi için evet seçilmelidir
İşlevi manuel olarak etkinleştirmeniz gerekirse, dpkg-reconfigure kexec-toolsve
dpkg-reconfigure kdump-tools
komutlarını kullanabilir ve sorulara Evet yanıtı verebilirsiniz.
Ayrıca /etc/default/kexec
parametreleri doğrudan düzenleyebilir ve ayarlayabilirsiniz:
# Load a kexec kernel (true/false)
LOAD_KEXEC=true
Ayrıca /etc/default/kdump-tools
, aşağıdaki satırı ekleyerek kdump'ı etkinleştirmek için düzenleyin:
USE_KDUMP=1
linux-crashdump
Paketin kurulumundan sonra yeniden başlatma yapılmadıysa, crashkernel= boot
parametreyi etkinleştirmek için yeniden başlatma gerekecektir. Yeniden başlatmanın ardından kdump-tools
etkinleştirilecek ve aktif hale gelecektir. Yeniden başlatma sonrasında ek olarak kdump-config load
komutu girilmelidir.
Kdump'ın mevcut durumunu komut aracılığıyla görüntüleyebilirsiniz kdump-config show
. Bu şuna benzer bir şey gösterecek:
DUMP_MODE: kdump
USE_KDUMP: 1
KDUMP_SYSCTL: kernel.panic_on_oops=1
KDUMP_COREDIR: /var/crash
crashkernel addr:
/var/lib/kdump/vmlinuz
kdump initrd:
/var/lib/kdump/initrd.img
current state: ready to kdump
kexec command:
/sbin/kexec -p --command-line="..." --initrd=...
Yapılandırma¶
Yerel dökümün yanı sıra, artık SSH veya NFS protokollerini kullanarak çekirdek kilitlenme dökümünü uzak bir sunucuya göndermek için uzaktan döküm işlevini kullanmak mümkündür.
Yerel Çekirdek Kilitlenme Dökümleri¶
Yerel dökümler otomatik olarak yapılandırılır ve bir uzak protokol seçilmediği sürece kullanımda kalır. Birçok yapılandırma seçeneği mevcuttur ve /etc/default/kdump-tools
dosyada ayrıntılı olarak belgelenmiştir.
SSH protokolünü kullanan Uzak Çekirdek Kilitlenme Dökümleri¶
SSH protokolünü kullanarak uzak dökümleri etkinleştirmek /etc/default/kdump-tools
için aşağıdaki şekilde değiştirilmelidir:
# ---------------------------------------------------------------------------
# Remote dump facilities:
# SSH - username and hostname of the remote server that will receive the dump
# and dmesg files.
# SSH_KEY - Full path of the ssh private key to be used to login to the remote
# server. use kdump-config propagate to send the public key to the
# remote server
# HOSTTAG - Select if hostname of IP address will be used as a prefix to the
# timestamped directory when sending files to the remote server.
# 'ip' is the default.
SSH="[email protected]"
Tanımlanması gereken tek zorunlu değişken SSH'dir. {Kullanıcıadı} @ {uzak sunucu} biçimini kullanarak uzak sunucunun kullanıcı adını ve ana bilgisayar adını içermelidir.
SSH_KEY, kullanılacak mevcut bir özel anahtarı sağlamak için kullanılabilir. Aksi takdirde, kdump-config propagate
komut yeni bir anahtar çifti oluşturacaktır. HOSTTAG değişkeni, sistemin ana bilgisayar adını IP adresi yerine oluşturulacak uzak dizine bir önek olarak kullanmak için kullanılabilir.
Aşağıdaki örnek, kdump-config propagate
yeni bir anahtar çifti oluşturmak ve uzak sunucuya yaymak için nasıl kullanıldığını gösterir:
sudo kdump-config propagate
Need to generate a new ssh key...
The authenticity of host 'kdump-netcrash (192.168.1.74)' can't be established.
ECDSA key fingerprint is SHA256:iMp+5Y28qhbd+tevFCWrEXykDd4dI3yN4OVlu3CBBQ4.
Are you sure you want to continue connecting (yes/no)? yes
[email protected]'s password:
propagated ssh key /root/.ssh/kdump_id_rsa to server [email protected]
Açık anahtarı sunucuya başarılı bir şekilde göndermek için uzak sunucuda kullanılan hesabın şifresi gerekli olacaktır.
kdump-config show
Komut kdump doğru SSH protokolünü kullanmak için yapılandırılmış olduğunu onaylayın:
kdump-config show
DUMP_MODE: kdump
USE_KDUMP: 1
KDUMP_SYSCTL: kernel.panic_on_oops=1
KDUMP_COREDIR: /var/crash
crashkernel addr: 0x2c000000
/var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinuz-4.4.0-10-generic
kdump initrd:
/var/lib/kdump/initrd.img: symbolic link to /var/lib/kdump/initrd.img-4.4.0-10-generic
SSH: [email protected]
SSH_KEY: /root/.ssh/kdump_id_rsa
HOSTTAG: ip
current state: ready to kdump
Doğrulama¶
Çekirdek dökümü mekanizmasının etkinleştirildiğini doğrulamak için doğrulanması gereken birkaç şey var. Öncelikle, crashkernel önyükleme parametresinin mevcut olduğunu doğrulayın (not: Aşağıdaki satır, bu belgenin formatına uyması için ikiye bölünmüştür:
cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.2.0-17-server root=/dev/mapper/PreciseS-root ro
crashkernel=384M-2G:64M,2G-:128M
Crashkernel parametre yapısı aşağıdaki gibidir:
crashkernel=<range1>:<size1>[,<range2>:<size2>,...][@offset]
range=start-[end] 'start' is inclusive and 'end' is exclusive.
Dolayısıyla, içinde bulunan crashkernel parametresi /proc/cmdline
için:
crashkernel=384M-2G:64M,2G-:128M
Yukarıdaki değer şu anlama gelir:
-
RAM 384M'den küçükse, hiçbir şey ayırmayın (bu "kurtarma" durumudur)
-
RAM boyutu 386M ile 2G (özel) arasındaysa, 64M ayırın
-
RAM boyutu 2G'den büyükse, 128M ayırın
İkinci olarak, aşağıdakileri yaparak çekirdeğin kdump çekirdeği için istenen bellek alanını ayırdığını doğrulayın:
dmesg | grep -i crash
...
[ 0.000000] Reserving 64MB of memory at 800MB for crashkernel (System RAM: 1023MB)
Son olarak, daha önce görüldüğü gibi, kdump-config show
komut kdump-tools yapılandırmasının mevcut durumunu görüntüler:
kdump-config show
DUMP_MODE: kdump
USE_KDUMP: 1
KDUMP_SYSCTL: kernel.panic_on_oops=1
KDUMP_COREDIR: /var/crash
crashkernel addr: 0x2c000000
/var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinuz-4.4.0-10-generic
kdump initrd:
/var/lib/kdump/initrd.img: symbolic link to /var/lib/kdump/initrd.img-4.4.0-10-generic
current state: ready to kdump
kexec command:
/sbin/kexec -p --command-line="BOOT_IMAGE=/vmlinuz-4.4.0-10-generic root=/dev/mapper/VividS--vg-root ro debug break=init console=ttyS0,115200 irqpoll maxcpus=1 nousb systemd.unit=kdump-tools.service" --initrd=/var/lib/kdump/initrd.img /var/lib/kdump/vmlinuz
Crash Dump Mekanizmasının Test Edilmesi¶
Warning
Crash Dump Mekanizmasının test edilmesi sistemin yeniden başlatılmasına neden olacaktır . Belirli durumlarda, sistem ağır yük altındaysa bu veri kaybına neden olabilir. Mekanizmayı test etmek istiyorsanız, sistemin boşta veya çok hafif yük altında olduğundan emin olun.
Kernel parametresinin değerine bakarak SysRQ mekanizmasının etkinleştirildiğini doğrulayın /proc/sys/kernel/sysrq:
cat /proc/sys/kernel/sysrq
Değer 0 çıkıyorsa yeniden başlatma özelliği devre dışı bırakılmıştır. Değer bir ise sysrq özellikleri bir alt kümesi etkin olduğunu gösterir.
Dökümü etkinleştirin ve ardından aşağıdaki komutla testi yeniden başlatın:
sudo sysctl -w kernel.sysrq=1
Bunu yaptıktan sonra sudo kullanmak yeterli olmayacaktır. Root olmanız gerekir.
echo c > /proc/sysrq-trigger
Bir ağ bağlantısı kullanıyorsanız, sistemle bağlantınızı kaybedersiniz. Bu nedenle, testi sistem konsoluna bağlıyken yapmak daha iyidir. Bu, çekirdek dökümü işlemini görünür kılma avantajına sahiptir.
Tipik bir test çıktısı aşağıdaki gibi görünmelidir:
sudo -s
[sudo] password for ubuntu:
# echo c > /proc/sysrq-trigger
[ 31.659002] SysRq : Trigger a crash
[ 31.659749] BUG: unable to handle kernel NULL pointer dereference at (null)
[ 31.662668] IP: [<ffffffff8139f166>] sysrq_handle_crash+0x16/0x20
[ 31.662668] PGD 3bfb9067 PUD 368a7067 PMD 0
[ 31.662668] Oops: 0002 [#1] SMP
[ 31.662668] CPU 1
....
Çıktının geri kalanı kesildi, ancak sistemin yeniden başlatıldığını görmelisiniz ve günlükte bir yerde aşağıdaki satırı göreceksiniz:
Begin: Saving vmcore from kernel crash ...
Tamamlandığında, sistem normal çalışma moduna yeniden başlayacaktır. Ardından, Kernel Crash Dump dosyasını ve ilgili alt dizinleri dizinde bulacaksınız /var/crash
:
ls /var/crash
201809240744 kexec_cmd linux-image-4.15.0-34-generic-201809240744.crash
OOM (Bellek Yetersiz) hatası nedeniyle döküm çalışmazsa, düzenleyerek ayrılmış bellek miktarını artırmayı deneyin /etc/default/grub.d/kdump-tools.cfg. Örneğin, 512 megabayt ayırmak için:
GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT crashkernel=384M-:512M"
çalıştırın sudo update-grubve ardından yeniden başlatın ve ardından tekrar test edin.