Я хочу использовать kexec для ускорения перезагрузки моей машины CentOS 7. Как я могу сделать это таким образом, чтобы он хорошо интегрировался с существующими целями отключения / перезагрузки systemd? Какой правильный (официальный) способ сделать это?
Я нашел способ создать сценарий загрузки 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
Это довольно просто.
На первом этапе загружаемое ядро:
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
Через несколько секунд вы окажетесь в новом ядре.
Я недавно написал сценарий, не зависящий от распространения чтобы помочь автоматизировать это (сообщения об ошибках приветствуются).