kexec

来自 阿尔派 Linux

kexec 是一个系统调用,允许加载并启动到另一个内核。这对于跳过固件初始化过程和引导加载程序的快速重启非常有用。

准备

在 Alpine 3.19 及更高版本中,使用它所需的用户空间工具可以通过以下方式安装

apk add kexec-tools kexec-tools-doc

但请注意,并非所有内核都编译启用了 kexec 系统调用。您应该检查 /boot/config-* 文件中是否有 CONFIG_KEXEC=y

大多数 Alpine 内核都已强化,如果调用 kexec 时未通过内核引导参数解锁,则会返回 kexec_load failed: Operation not permitted

kexec_load_disabled=0.

如果没有它,sysctl 设置 kernel.kexec_load_disabled 默认值为 1,并且无法在运行的内核中关闭,因此您需要将此参数添加到您的引导加载程序配置并重启。

用法

手动

注意: 目前不支持多个 initrd(例如用于加载 CPU 微代码)

在典型的 Alpine 设置中,可以通过以下方式使用

# kexec -l /boot/vmlinuz-edge --initrd \ /boot/initramfs-edge --reuse-cmdline \ && openrc shutdown # kexec -e

每次重启/关机时自动

可以将 kexec 设置为自动运行以实现更快的重启。这在服务器上非常有用。

首先创建两个 openrc 服务,如果未使用默认值,请编辑 BOOTPARTKERNELINITRD 变量

/etc/init.d/kexec-load 的内容

#!/sbin/openrc-run description="kexec for faster reboot" # Define defaults : "${BOOTPART:=/boot}" : "${KERNEL:=vmlinuz-$(uname -r | awk -F \- '{print $NF }')}" : "${INITRD:=initramfs-$(uname -r | awk -F \- '{print $NF}')}" depend() { need localmount } start() { : } stop() { if ! yesno ${RC_GOINGDOWN}; then einfo "kexec-load: Not rebooting or powering off; not loading kernel" exit fi ebegin "kexec-load: loading kernel for faster reboot" kexec -l "${BOOTPART}/${KERNEL}" \ --initrd "${BOOTPART}/${INITRD}" \ --reuse-cmdline ewend $? Failed. }

/etc/init.d/kexec-exec 的内容

#! /sbin/openrc-run description="kexec for faster reboot" depend() { after killprocs savecache mount-ro } start() { ebegin "kexec-exec: Using kexec for faster reboot" kexec -e ewend $? "kexec-exec No kernel loaded." return 0 }

现在给予这些服务执行权限,并将它们分配到适当的运行级别

chmod a+x /etc/init.d/kexec-load chmod a+x /etc/init.d/kexec-exec rc-update add kexec-load default rc-update add kexec-exec shutdown rc-service kexec-load start

kexec 将在您下次 rebootpoweroff 时运行,请享用!

注意: 在启用上述两个服务的情况下,即使您尝试 poweroff,系统也会通过 kexec 重启。要临时恢复默认的 poweroffreboot 行为,只需事先运行 rc-service kexec-load stop

参见