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ć?
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"
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"
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.
ExecStart=/bin/sh -c "kexec -l $$(grubby --default-kernel) --initrd=$$(grubby --default-kernel | sed 's!vmlinuz!initramfs!;s/$/.img/') --reuse-cmdline"
To jest całkiem proste.
Pierwszy etap do uruchomienia jądra:
Opcje te zostały usunięte z wygenerowanej konfiguracji grub.
Teraz powiedz systemdowi, aby wykonał swoją magię.
Lub w nowszych wersjach systemd:
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).
źródło
--command-line=$(cat /proc/cmdline)
działałoby tak dobrze?--reuse-cmdline
jest krótszy i bardziej czytelny. Niestety--reuseinitrd
odmawia rozpoznania obecnego initramfs, więc muszę go określić ręcznie.