Ana içeriğe geç

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.