./ kexec 从当前正在运行的内核引导到一个新内核 补充说明 kexec命令是Linux内核的一个补丁,让您可以从当前正在运行的内核直接引导到一个新内核。 kexec的好处 要求高可用性的系统,以及需要不断重新启动系统的内核开发人员,都将受益于kexec。 因为kexec跳过了系统重新启动过程中最耗时的部分(也就是固件初始化硬件设备的阶段),所以重新启动变得非常快,可用性得到了提高。 语法 kexec(选项) 选项 -l:指定内核映像文件; -e:允许当前被加载的内核; -f:强制立即调用系统调用“kexec”,而不调用“shutdown”; -t:指定新内核的类型; -u:卸载当前的 kexec目标内核。
isa' iobase='0x505'/> </panic> config guest boot arguments and reboot guest : append “crash_kexec_post_notifiers panic on guest : #echo 1 > /proc/sys/kernel/sysrq #echo c > /proc/sysrq-trigger 5,about “crash_kexec_post_notifiers 代码选自linux-4.4,如果没有配置“crash_kexec_post_notifiers”,那么,配置了kdump的情况下,会发生kdump,不会再继续执行到panic_notifier_list 所以,需要在guest的boot args里面配置“crash_kexec_post_notifiers”确保带外可以监控到。
iptables 后,一般不会在意输出信息,不好意思,你错过了重点,输出信息中包含了如下一段内容: 没想到吧.jpg 这里提示我们不仅卸载了 iptables 服务,同时还卸载了15个软件包,这包含了网卡驱动、kexec 1.4 M kbd x86_64 1.15.5-13.el7 @anaconda 1.3 M kexec-tools abrt-addon-vmcore abrt-cli abrt-console-notification dhclient dracut-network firewalld initscripts iproute kbd kexec-tools
如果配置crash_kexec_post_notifiers,那么guest发生了kernel panic之后,会调用pvpanic的callback函数,就会写io port 0x505(默认地址), 所以,解决办法就是在pvpanic中增加新的逻辑: 如果没有加载kexec crash loaded,那么写原来的BIT 0。 如果加载了kexec crash loaded,那么写新定义的BIT 1。 ? 在qemu侧,对于pvpanic设备的BIT 0操作,还是维持原来的逻辑。
fi 原理分析 kexec 实现了crash kernel 的加载。 核心分为两部分: kexec_file_load()/kexec_load() 负责在起始时就把备份的 kernel 和 initrd 加载好到内存。 在 kexec_tools 使用 kexec_file_load() 系统调用加载 crash kernel 时,就顺带把 /proc/vmcore 的 elf header 需要的大部分数据准备好了: kexec_file_load() → kimage_file_alloc_init() → kimage_file_prepare_segments() → arch_kexec_kernel_image_load () → __crash_kexec() → machine_kexec() 接收 elfheadr (运行在 crash kernel) 在 carsh kernel 中首先会接收到 normal kernel
is not set # CONFIG_KEXEC_VERIFY_SIG is not set CONFIG_BLK_DEV_NBD=m 我经常用qemu-nbd修改镜像里内容,nbd模块是必需的。 sig会导致kexec加载内核不成功,我发现sig就是我的克星,不影响功能,懒得研究,一关了之。 kdumpctl: kdump: kexec: failed to load kdump kernel kdumpctl: kdump: Starting kdump: [FAILED] systemd /sbin/kexec -s -d -p '--command-line=BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-80.7.1.el8.x86_64 ro biosdevname el8.x86_64 lzma_decompress_file: read on /boot/vmlinuz-4.18.0-80.7.1.el8.x86_64 of 65536 bytes failed kexec_file_load
is not set # CONFIG_KEXEC_VERIFY_SIG is not set CONFIG_BLK_DEV_NBD=m 我经常用qemu-nbd修改镜像里内容,nbd模块是必需的。 sig会导致kexec加载内核不成功,我发现sig就是我的克星,不影响功能,懒得研究,一关了之。 kdumpctl: kdump: kexec: failed to load kdump kernel kdumpctl: kdump: Starting kdump: [FAILED] systemd /sbin/kexec -s -d -p '--command-line=BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-80.7.1.el8.x86_64 ro biosdevname el8.x86_64 lzma_decompress_file: read on /boot/vmlinuz-4.18.0-80.7.1.el8.x86_64 of 65536 bytes failed kexec_file_load
crash> btPID: 1370 TASK: ffff922804b441c0 CPU: 1 COMMAND: "fdisk" #0 [ffff9226746dbae8] machine_kexec at ffffffffba265b24 #1 [ffff9226746dbb48] __crash_kexec at ffffffffba322342 #2 [ffff9226746dbc18] crash_kexec at ffffffffba322430 #3 [ffff9226746dbc30] oops_end at ffffffffba985798 #4 [ffff9226746dbc58
下面的代码就是在源码kernel/panic.c文件中的panic函数的部分 其实真正的跳转的函数在__crash_kexec里面的,让我们来看看__crash_kexec这个函数的乾坤吧: 在这个函数里面 ,主要讲讲的就是machine_kexec: 进入这个函数,在x86的机器下,会执行一个叫做relocate_kernel的函数,这个函数就是执行一个.S文件 (这是一个汇编代码),在这里完成跳转到crash
crash> btPID: 1370 TASK: ffff922804b441c0 CPU: 1 COMMAND: "fdisk" #0 [ffff9226746dbae8] machine_kexec at ffffffffba265b24 #1 [ffff9226746dbb48] __crash_kexec at ffffffffba322342 #2 [ffff9226746dbc18] crash_kexec at ffffffffba322430 #3 [ffff9226746dbc30] oops_end at ffffffffba985798 #4 [ffff9226746dbc58
环境下的安装首先确认当前系统中是否已经安装过kdump.可以运行如下命令确认kdump服务是否已进有了:systemctl status kdump.service.如果没有,则按照如下步骤安装:1) 安装kexec-tools 执行如下命令:yum install kexec-tools2) 设置crashkernel预留内存大小 vim /etc/default/grub找到“GRUB_CMDLINE_LINUX”这一行,对其中的 如果没有安装,可以参考如下步骤:1) 安装kdump工具sudo apt install linux-crashdump 安装过程中会有一些选项要你确认.2) 修改配置文件修改 /etc/default/kexec ,设置LOAD_KEXEC=true修改/etc/default/kdump-tools,设置USE_KDUMP=13) 验证kdump功能运行如下测试命令验证,同样需要注意的是这将触发重启.sudo
reboot-immediate, poweroff, poweroff-force, poweroff-immediate, exit, exit-force, soft-reboot, soft-reboot-force, kexec , kexec-force, halt, halt-force 和 halt-immediate.
v systemd-reboot.service systemd-poweroff.service systemd-halt.service systemd-kexec.service v reboot.target poweroff.target halt.target kexec.target
kexec 不懂 suspend 待机 hibernate 进入休眠(内存数据存入硬盘,关闭电源) hybrid-sleep 混合睡眠=睡眠+休眠,主要是为台式机设计的,内存和CPU还是活的。
改进一:通过在 hypervisor 中引入必要的静态页面分配,保证 kexec 重启过程中的状态保持。 静态分配主要有用户态和内核态两部分工作。 -device vfio-pci,addr=06.0,host={dev} 然后,通过 cpr-save -> kexec -> 启动 qemu -> restore 的流程来热升级整个 L1。 相比之下,如果用内核和 QEMU 的主线版本来执行上面的流程,可以采用 savevm 到磁盘后 kexec 重启并 loadvm 的步骤。 此外,在 Virtio 设备标准,QEMU 热升级,Linux 启动时间,io_uring,kexec 等方面,团队也进行了深入的研究和优化。我们将会在本文和后续文章中持续分享相关技术和最新进展。
一、KDUMP的工作原理 KDUMP利用了kexec机制,它允许在内核崩溃后直接加载并运行一个新的内核,而无需通过BIOS或固件重新引导系统。 系统崩溃时切换内核:当主内核发生崩溃时,通过kexec机制加载并启动预先配置的崩溃内核。 安装KDUMP工具 在大多数Linux发行版中,KDUMP工具可以通过包管理器安装,例如在CentOS或RHEL中: bash sudo yum install kexec-tools 2.
libpci-dev libsdl-dev python-dev texinfo libc6-dev uuid-dev bison flex fakeroot build-essential crash kexec-tools
libpci-dev libsdl-dev python-dev texinfo libc6-dev uuid-dev bison flex fakeroot build-essential crash kexec-tools
bt PID: 89 TASK: ffff8801745ceeb0 CPU: 3 COMMAND: "khungtaskd" #0 [ffff8807ff4ffcb0] machine_kexec at ffffffff8105c52b #1 [ffff8807ff4ffd98] __crash_kexec at ffffffff81104adf #2 [ffff8807ff4ffea8]
/dev/sdb/install initrd.gz vmlinux "这两个文件是引导文件" ~bash$ cd /var/petitboot/mnt/dev/sdb/install ~bash$ kexec