Jak prawidłowo używać kexec z systemem na CentOS 7?

13

Chcę użyć kexec, aby przyspieszyć restart mojego komputera CentOS 7. Jak mogę to zrobić w sposób, który ładnie integruje się z istniejącymi celami systemowymi zamykania / restartowania? Jaki jest właściwy (oficjalny) sposób, aby to zrobić?

Matryca
źródło

Odpowiedzi:

11

Wymyśliłem sposób, aby skrypt ładujący kexec działał dobrze i ładuje domyślne jądro do gruba, co oznacza, że ​​powinien załadować nowe jądro po aktualizacji jądra.

Plik: / 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"

Plik: /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
Matryca
źródło
1
Cudownie, nie do końca rozumiem, dlaczego nie ma jeszcze 289 głosów pozytywnych ...
kubańczyk 28.10.16
3
Dla uproszczenia pozbywam się pliku skryptu i zamiast tego używamExecStart=/bin/sh -c "kexec -l $$(grubby --default-kernel) --initrd=$$(grubby --default-kernel | sed 's!vmlinuz!initramfs!;s/$/.img/') --reuse-cmdline"
kubańczyk
7

To jest całkiem proste.

Pierwszy etap do uruchomienia jądra:

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"

Opcje te zostały usunięte z wygenerowanej konfiguracji grub.

Teraz powiedz systemdowi, aby wykonał swoją magię.

systemctl start kexec.target

Lub w nowszych wersjach systemd:

systemctl kexec

Kilka sekund później znajdziesz się w swoim nowym jądrze.


Niedawno napisałem skrypt niezależny od dystrybucji, który pomaga to zautomatyzować (mile widziane zgłoszenia błędów).

Michael Hampton
źródło
Nie --command-line=$(cat /proc/cmdline)działałoby tak dobrze?
Dennis Kaarsemaker
1
@DennisKaarsemaker Tak, prawdopodobnie tak. Ale zmiana opcji wiersza poleceń może być jedną z rzeczy, które należy zrobić, więc niekoniecznie zawsze tak robię.
Michael Hampton
Dziękuję za Twoją odpowiedź. Czy istnieje sposób na zautomatyzowanie „przygotowania kexec”? Czy systemd można skonfigurować tak, aby automatycznie przygotowywał kexec, gdy wywołuję „systemctl start kexec.target”?
Matrix
@ Matrix Dobre pytanie. Jeśli istnieje taki sposób, nie jestem tego świadomy. Zresztą zrestartowanie komputera jest czymś, o czym ogólnie chcesz pomyśleć.
Michael Hampton
Myślę, że --reuse-cmdlinejest krótszy i bardziej czytelny. Niestety --reuseinitrdodmawia rozpoznania obecnego initramfs, więc muszę go określić ręcznie.
kubańczyk