一、kexec是什么?
????????kexec 是 Linux 內核提供的一種關鍵技術,允許系統?在不經過完整硬件重啟(BIOS/UEFI 初始化)的情況下,直接從當前正在運行的內核加載并啟動另一個新內核?。以下是其核心要點:
-
?定義與核心機制?
- kexec 是一個系統調用(
kexec_load
)和用戶空間工具(kexec-tools
)的結合。 - 它預先將新內核的鏡像(vmlinuz)和可選的初始 RAM 磁盤(initrd)加載到內存中的特定位置。
- 當觸發執行(例如通過?
kexec -e
?命令)或發生崩潰(用于 kdump)時,系統會立即停止當前內核的執行,將 CPU 控制權直接跳轉到新加載內核的入口點。
- kexec 是一個系統調用(
二、怎么打開kexec?
? ? ? ? 在.config中配置如下的宏
CONFIG_KEXEC=y
CONFIG_RELOCATABLE=n
CONFIG_RANDOMIZE_BASE=n
CONFIG_SECURITY_DMESG_RESTRICT=n
? ? ? ? 編譯kexec工具
cd $KEXEC_TOOLS_DIR
sudo ./bootstrap
sudo LDFLAGS=-static ./configure --prefix= /media/$USER/rootfs/ --host=aarch64-linux-gnu --target=aarch64-linux-gnu
#sudo LDFLAGS=-static ./configure --prefix=/usr/local --host=aarch64-linux-gnu --target=aarch64-linux-gnu
sudo make clean
sudo make
sudo make installcp $KEXEC_TOOLS_DIR/build/sbin/kexec /media/$USER/rootfs/usr/sbin
? ? ? ? 測試kexec:
cmdline="crashkernel=128M console=ttyS2,115200n8 earlycon=ns16550a,mmio32,0x02800000 mtdparts=spi-nand0:512k(ospi_nand.tiboot3),2m(ospi_nand.tispl),4m(ospi_nand.u-boot),256k(ospi_nand.env),256k(ospi_nand.env.backup),98048k@32m(ospi_nand.rootfs),256k@130816k(ospi_nand.phypattern) root=PARTUUID=882b0176-3044-403d-ab87-3d8bafb3d742 rw rootfstype=ext4 rootwait ab_slot=a"kexec -d -l /boot/Image --command-line="$cmdline" --dtb=/boot/dtb/ti/k3-am62-lp-sk-V015.dtbkexec -e
一、什么是kdump
????????kdump 是一種先進的基于 kexec 的內核崩潰轉儲機制,用于在 Linux 系統崩潰、死鎖或死機時捕獲內存中的數據,并生成崩潰轉儲文件,以便分析和診斷系統問題?
- 工作原理:kdump 的核心機制依賴于 kexec,它允許通過已經運行的內核的上下文啟動另一個 Linux 內核,而無需經過 BIOS 重新啟動。當生產內核崩潰時,kdump 使用 kexec 啟動捕獲內核。捕獲內核被引導時會傳遞 ELF 文件頭的地址,通過分析它,捕獲內核可以生成
/proc/vmcore
文件。捕獲內核的 ramdisk 中的腳本可以通過文件讀寫和網絡實現各種轉儲策略,將/proc/vmcore
文件中的數據進行收集和轉存,完成數據收集后,系統通常會自動重啟。
二、怎么打開kdump
? ? ? ? 在.config中打開以下宏:
CONFIG_CRASH_DUMP=y
CONFIG_PROC_VMCORE=y
args_mmc=run finduuid;run findab;setenv bootargs crashkernel=128M@0x90000000 console=${console}
setenv args_mmc "run finduuid;setenv bootargs crashkernel=128M@0x90000000 console=ttyS2,115200n8 root=/dev/mmcblk1p2 rw
/etc/sysconfig/kdump.conf
三、測試kdump?
cmdline="console=ttyS2,115200n8 crashkernel=128M root=/dev/mmcblk0p2 rw rootfste=ext4 rootwait"kexec -p /boot/Image --command-line="$cmdline" --dtb=/boot/dtb/ti/k3-am62-lp-sk-V015.dtbecho c > /proc/sysrq-trigger