จะใช้ kexec กับ systemd บน CentOS 7 ได้อย่างไร?


13

ฉันต้องการใช้ kexec เพื่อเร่งการรีบูตเครื่อง CentOS 7 ของฉัน ฉันจะทำสิ่งนั้นในลักษณะที่รวมเข้ากับเป้าหมายการปิดระบบ / รีบูตที่มีอยู่แล้วได้อย่างไร? วิธีที่เหมาะสม (เป็นทางการ) ในการทำเช่นนี้คืออะไร?

คำตอบ:


11

ฉันหาวิธีสร้างสคริปต์การโหลด kexec ที่ทำงานได้ดีและจะโหลดเคอร์เนลเริ่มต้นในด้วงหมายความว่ามันควรโหลดเคอร์เนลใหม่หลังจากอัปเดตเคอร์เนล

ไฟล์: / 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"

ไฟล์: /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

1
มหัศจรรย์มากฉันยังไม่เข้าใจว่าทำไมสิ่งนี้ถึงไม่มี upvotes 289 ตัว ...
kubanczyk

3
เพื่อให้ง่ายฉันจะกำจัดไฟล์สคริปต์และฉันใช้แทนExecStart=/bin/sh -c "kexec -l $$(grubby --default-kernel) --initrd=$$(grubby --default-kernel | sed 's!vmlinuz!initramfs!;s/$/.img/') --reuse-cmdline"
kubanczyk

7

ตรงนี้ค่อนข้างตรงไปตรงมา

ขั้นแรกให้เคอร์เนลถูกบูท:

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"

ตัวเลือกเหล่านี้ถูกกวาดออกจากการกำหนดค่าด้วงที่สร้างขึ้น

ตอนนี้บอก systemd ให้ทำเวทย์มนตร์ของมัน

systemctl start kexec.target

หรือ systemd รุ่นล่าสุดเพิ่มเติม:

systemctl kexec

ไม่กี่วินาทีต่อมาคุณจะอยู่ในเคอร์เนลใหม่ของคุณ


ฉันเพิ่งเขียนสคริปต์ผู้ไม่เชื่อเรื่องพระเจ้าเพื่อแจกจ่ายสิ่งนี้โดยอัตโนมัติ (ยินดีรับรายงานข้อผิดพลาด)


จะไม่--command-line=$(cat /proc/cmdline)ทำงานเช่นกัน?
Dennis Kaarsemaker

1
@DennisKaarsemaker ใช่อาจเป็นเช่นนั้น แต่การเปลี่ยนตัวเลือกบรรทัดคำสั่งอาจเป็นหนึ่งในสิ่งที่ทำดังนั้นฉันไม่จำเป็นต้องทำเช่นนั้นเสมอไป
Michael Hampton

ขอบคุณสำหรับคำตอบ มีวิธีการ "เตรียม kexec" โดยอัตโนมัติหรือไม่? สามารถกำหนดค่า systemd เพื่อเตรียม kexec โดยอัตโนมัติเมื่อฉัน exectute "systemctl start kexec.target" หรือไม่
เมทริกซ์

@ Matrix เป็นคำถามที่ดี หากมีวิธีดังกล่าวฉันไม่ทราบ และการรีบูตเครื่องเป็นสิ่งที่คุณต้องการคิดถึง
Michael Hampton

ฉันคิดว่า--reuse-cmdlineสั้นกว่าและอ่านได้มากกว่า น่าเสียดายที่--reuseinitrdปฏิเสธที่จะรับรู้ initramfs ปัจจุบันดังนั้นฉันต้องระบุด้วยตนเอง
kubanczyk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.