Як правильно використовувати kexec з системою на CentOS 7?


13

Я хочу використовувати kexec для прискорення перезавантаження моєї машини CentOS 7. Як я можу це зробити таким чином, що добре інтегрується до існуючих системних цілей відключення / перезавантаження? Який належний (офіційний) спосіб зробити це?

Відповіді:


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"
kubanczyk

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 Так, напевно, так. Але зміна параметрів командного рядка може бути однією з речей, тому я не обов'язково завжди робити це.
Майкл Хемптон

Дякую за відповідь. Чи є спосіб автоматизувати "приготування кексека"? Чи можна налаштувати systemd, щоб автоматично готувати kexec, коли я виконую "systemctl start kexec.target"?
Матриця

@Matrix Добре запитання. Якщо є такий спосіб, я цього не знаю. І все одно, перезавантаження - це те, про що ти загалом хочеш подумати.
Майкл Хемптон

Я думаю --reuse-cmdline, що коротше і читабельніше. На жаль, --reuseinitrdвідмовляється розпізнавати поточний initramfs, тому мені потрібно вказати його вручну.
kubanczyk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.