Как правильно использовать kexec с systemd на CentOS 7?
13
Я хочу использовать 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"
Чудесно, я не совсем понимаю, почему это еще не получило 289 голосов ...
kubanczyk
3
Чтобы было проще, я избавляюсь от файла скрипта и использую вместо негоExecStart=/bin/sh -c "kexec -l $$(grubby --default-kernel) --initrd=$$(grubby --default-kernel | sed 's!vmlinuz!initramfs!;s/$/.img/') --reuse-cmdline"
@DennisKaarsemaker Да, наверное так. Но изменение параметров командной строки может быть одной из задач, поэтому я не всегда буду делать это.
Майкл Хэмптон
Спасибо за ответ. Есть ли способ автоматизировать «подготовку кексека»? Можно ли настроить systemd для автоматической подготовки kexec, когда я запускаю команду «systemctl start kexec.target»?
Матрица
@Matrix Хороший вопрос. Если есть такой способ, я не знаю об этом. И вообще, перезагрузка - это то, о чем вы обычно хотите думать.
Майкл Хэмптон
Я думаю, что --reuse-cmdlineкороче и более читабельным. К сожалению, --reuseinitrdотказывается распознавать текущие initramfs, поэтому мне нужно указать это вручную.
ExecStart=/bin/sh -c "kexec -l $$(grubby --default-kernel) --initrd=$$(grubby --default-kernel | sed 's!vmlinuz!initramfs!;s/$/.img/') --reuse-cmdline"
Это довольно просто.
Первый этап загрузки ядра:
Эти параметры были удалены из сгенерированной конфигурации grub.
Теперь скажите systemd, чтобы он сделал свою магию.
Или на более поздних версиях systemd:
Через несколько секунд вы будете в новом ядре.
Недавно я написал скрипт, не зависящий от дистрибутива, чтобы помочь автоматизировать это (приветствуются сообщения об ошибках).
источник
--command-line=$(cat /proc/cmdline)
сработает?--reuse-cmdline
короче и более читабельным. К сожалению,--reuseinitrd
отказывается распознавать текущие initramfs, поэтому мне нужно указать это вручную.