一、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