উত্তর:
আমি একটি কেক্সেক লোডিং স্ক্রিপ্ট তৈরি করার একটি উপায় খুঁজে পেয়েছি যা ভালভাবে কাজ করে এবং গ্রাবের মধ্যে ডিফল্ট কার্নেলটি লোড করবে, এর অর্থ এটি কার্নেল আপডেটের পরে নতুন কার্নেলটি লোড করা উচিত।
ফাইল: / usr / বিন / কেক্সেক-লোড
#!/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
একটি বর্তমান থ্রিমারফগুলি স্বীকৃতি দিতে অস্বীকার করেছে, সুতরাং আমার এটি ম্যানুয়ালি নির্দিষ্ট করা দরকার।