Bagaimana cara menggunakan kexec dengan systemd di CentOS 7 dengan benar?
13
Saya ingin menggunakan kexec untuk mempercepat reboot mesin CentOS 7 saya. Bagaimana saya bisa melakukan itu dengan cara yang terintegrasi dengan baik dengan target shutdown / reboot systemd yang ada? Apa cara (resmi) yang tepat untuk melakukan ini?
Saya menemukan cara untuk membuat skrip pemuatan kexec yang berfungsi dengan baik dan akan memuat kernel default di grub, artinya harus memuat kernel baru setelah pembaruan kernel.
File: / 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"
Luar biasa, saya tidak begitu mengerti mengapa ini belum mendapatkan 289 upvotes ...
kubanczyk
3
Untuk membuatnya tetap sederhana, saya menyingkirkan file skrip dan saya gunakan sebagai gantinyaExecStart=/bin/sh -c "kexec -l $$(grubby --default-kernel) --initrd=$$(grubby --default-kernel | sed 's!vmlinuz!initramfs!;s/$/.img/') --reuse-cmdline"
Tidak akan --command-line=$(cat /proc/cmdline)bekerja juga?
Dennis Kaarsemaker
1
@ DennisKaarsemaker Ya, mungkin begitu. Tetapi mengubah opsi baris perintah mungkin merupakan salah satu hal yang dilakukan, jadi saya tidak akan selalu melakukan itu.
Michael Hampton
Terima kasih atas jawabannya. Apakah ada cara untuk mengotomatisasi "persiapan kexec"? Dapatkah systemd dikonfigurasi untuk secara otomatis menyiapkan kexec ketika saya mengecek "systemctl start kexec.target"?
Matriks
@ Matrix Pertanyaan yang bagus. Jika ada cara seperti itu, saya tidak menyadarinya. Lagi pula, me-reboot adalah sesuatu yang umumnya ingin Anda pikirkan.
Michael Hampton
Saya pikir --reuse-cmdlinelebih pendek dan lebih mudah dibaca. Sayangnya --reuseinitrdmenolak untuk mengenali initramf saat ini, jadi saya harus menentukannya secara manual.
ExecStart=/bin/sh -c "kexec -l $$(grubby --default-kernel) --initrd=$$(grubby --default-kernel | sed 's!vmlinuz!initramfs!;s/$/.img/') --reuse-cmdline"
Ini sangat mudah.
Tahap pertama kernel yang akan di-boot:
Opsi-opsi ini telah dihapus dari konfigurasi grub yang dihasilkan.
Sekarang beritahu systemd untuk melakukan keajaibannya.
Atau pada versi systemd yang lebih baru:
Beberapa detik kemudian, Anda akan berada di kernel baru.
Saya baru-baru ini menulis skrip distribusi-agnostik untuk membantu mengotomatiskan ini (laporan bug diterima).
sumber
--command-line=$(cat /proc/cmdline)
bekerja juga?--reuse-cmdline
lebih pendek dan lebih mudah dibaca. Sayangnya--reuseinitrd
menolak untuk mengenali initramf saat ini, jadi saya harus menentukannya secara manual.