जवाबों:
मुझे लगा कि kexec लोडिंग स्क्रिप्ट बनाने का एक तरीका है जो अच्छी तरह से काम करता है और ग्रब में डिफ़ॉल्ट कर्नेल को लोड करेगा, जिसका अर्थ है कि यह कर्नेल अपडेट के बाद नए कर्नेल को लोड करना चाहिए।
फ़ाइल: / usr / बिन / kexec- लोड
#!/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
ExecStart=/bin/sh -c "kexec -l $$(grubby --default-kernel) --initrd=$$(grubby --default-kernel | sed 's!vmlinuz!initramfs!;s/$/.img/') --reuse-cmdline"
यह बहुत सीधा है।
पहले कर्नेल को बूट किया जाए:
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"
ये विकल्प उत्पन्न किए गए ग्रब कॉन्फ़िगरेशन से स्वाइप किए गए हैं।
अब सिस्टमड को इसका जादू करने के लिए कहें।
systemctl start kexec.target
या सिस्टमड के अधिक हाल के संस्करणों पर:
systemctl kexec
कुछ सेकंड बाद, आप अपने नए कर्नेल में आ जाएंगे।
मैंने हाल ही में इस (बग रिपोर्ट का स्वागत) को स्वचालित करने में मदद करने के लिए एक वितरण-अज्ञेय स्क्रिप्ट लिखी है।
--command-line=$(cat /proc/cmdline)
रूप में अच्छी तरह से काम नहीं करेगा ?
--reuse-cmdline
है कि यह छोटा और अधिक पठनीय है। दुर्भाग्य से --reuseinitrd
एक चालू initramfs को पहचानने से इनकार करता है, इसलिए मुझे इसे मैन्युअल रूप से निर्दिष्ट करने की आवश्यकता है।