如何在CentOS 7上的systemd中正确使用kexec?


13

我想使用kexec加快CentOS 7计算机的重启速度。我该如何与现有的关闭/重新引导systemd目标很好地集成在一起?什么是正确的(官方)方法?

Answers:


11

我想出了一种制作kexec加载脚本的方法,该脚本可以很好地运行并将在grub中加载默认内核,这意味着它应在内核更新后加载新内核。

文件:/ usr / bin / kexec-load

#!/usr/bin/env bash

GRUBBY_FILE="/var/log/grubby"
TMP=$(mktemp)

#  Command "grubby --default-kernel" has a bug/feature that fsyncs
#  after writting each line to a debug log file, making it slow (several seconds).
#  Workaround is to write to /dev/null instead.
if [ -e $GRUBBY_FILE ]
        then rm -f $GRUBBY_FILE
fi
ln -s /dev/null $GRUBBY_FILE
KERNEL_IMG=$(grubby --default-kernel)
unlink $GRUBBY_FILE

#  Get the detailed information of the default kernel (as seen by grub)
#  This will create a temporary file in /tmp
grubby --info=$KERNEL_IMG | grep -v title > $TMP
source $TMP
rm $TMP

#  Simple log to see if this script gets executed
date --rfc-3339=seconds >> /var/log/kexec

#  Load (prepare) the kernel for execution
kexec -l $kernel --initrd=$initrd --command-line="root=$root $args"

文件:/etc/systemd/system/kexec-load.service

[Unit]
Description=loads the kernel
Documentation=man:kexec(8)
DefaultDependencies=no
Before=shutdown.target umount.target final.target

[Service]
Type=oneshot
ExecStart=/usr/bin/kexec-load

[Install]
WantedBy=kexec.target 

$ chmod +x /usr/bin/kexec-load
$ systemctl enable kexec-load.service
$ systemctl kexec

1
惊奇,我不太明白为什么还没有289次投票……
kubanczyk

3
为简单ExecStart=/bin/sh -c "kexec -l $$(grubby --default-kernel) --initrd=$$(grubby --default-kernel | sed 's!vmlinuz!initramfs!;s/$/.img/') --reuse-cmdline"
起见

7

这很简单。

第一阶段要引导的内核:

kexec -l /boot/vmlinuz-3.10.0-123.6.3.el7.x86_64 \
--initrd=/boot/initramfs-3.10.0-123.6.3.el7.x86_64.img \
--command-line="root=/dev/mapper/centos-root ro rd.lvm.lv=centos/swap vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos/root crashkernel=auto  vconsole.keymap=us rhgb quiet LANG=en_US.UTF-8"

这些选项已从生成的grub配置中清除。

现在告诉systemd进行魔术。

systemctl start kexec.target

或在较新的systemd版本上:

systemctl kexec

几秒钟后,您将进入新内核。


我最近写了一个与发行版无关的脚本来帮助实现此自动化(欢迎报告错误)。


也不能--command-line=$(cat /proc/cmdline)正常工作吗?
丹尼斯·考斯玛克

1
@DennisKaarsemaker是的,也许是。但是更改命令行选项可能是要做的事情之一,因此我不一定总是这样做。
迈克尔·汉普顿

谢谢你的回答。有没有办法自动执行“ kexec准备”?我执行“ systemctl start kexec.target”时,可以将systemd配置为自动准备kexec吗?
Matrix

@Matrix好问题。如果有这种方法,我不知道。无论如何,重新启动通常是您要考虑的事情。
迈克尔·汉普顿

我认为--reuse-cmdline它更短,更易读。不幸的是--reuseinitrd拒绝识别当前的initramfs,因此我需要手动指定它。
kubanczyk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.