Câu trả lời:
Tôi đã tìm ra một cách để tạo một tập lệnh tải kexec hoạt động tốt và sẽ tải kernel mặc định trong grub, nghĩa là nó sẽ tải kernel mới sau khi cập nhật kernel.
Tệp: / 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"
Tệp: /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
ExecStart=/bin/sh -c "kexec -l $$(grubby --default-kernel) --initrd=$$(grubby --default-kernel | sed 's!vmlinuz!initramfs!;s/$/.img/') --reuse-cmdline"
Việc này thật thẳng thắn.
Giai đoạn đầu tiên kernel được khởi động:
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"
Các tùy chọn này đã bị xóa khỏi cấu hình grub được tạo.
Bây giờ nói với systemd để làm phép thuật của nó.
systemctl start kexec.target
Hoặc trên các phiên bản gần đây hơn của systemd:
systemctl kexec
Một vài giây sau, bạn sẽ có trong kernel mới của mình.
Gần đây tôi đã viết một kịch bản không biết phân phối để giúp tự động hóa điều này (báo cáo lỗi được chào đón).
--command-line=$(cat /proc/cmdline)
làm việc tốt chứ?
--reuse-cmdline
là ngắn hơn và dễ đọc hơn. Thật không may --reuseinitrd
từ chối nhận ra một initramfs hiện tại, vì vậy tôi cần chỉ định nó bằng tay.