कैसे ठीक से CentOS 7 पर systemd के साथ kexec का उपयोग करने के लिए?


13

मैं अपने CentOS 7 मशीन के रिबूट को तेज करने के लिए kexec का उपयोग करना चाहता हूं। मैं उस तरह से कैसे कर सकता हूं जो मौजूदा शटडाउन / रिबूट सिस्टमड लक्ष्य के साथ अच्छी तरह से एकीकृत करता है? ऐसा करने का उचित (आधिकारिक) तरीका क्या है?

जवाबों:


11

मुझे लगा कि 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

1
अद्भुत, मुझे समझ में नहीं आता है कि यह 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"

ये विकल्प उत्पन्न किए गए ग्रब कॉन्फ़िगरेशन से स्वाइप किए गए हैं।

अब सिस्टमड को इसका जादू करने के लिए कहें।

systemctl start kexec.target

या सिस्टमड के अधिक हाल के संस्करणों पर:

systemctl kexec

कुछ सेकंड बाद, आप अपने नए कर्नेल में आ जाएंगे।


मैंने हाल ही में इस (बग रिपोर्ट का स्वागत) को स्वचालित करने में मदद करने के लिए एक वितरण-अज्ञेय स्क्रिप्ट लिखी है।


के --command-line=$(cat /proc/cmdline)रूप में अच्छी तरह से काम नहीं करेगा ?
डेनिस करसेमेकर

1
@DennisKaarsemaker हाँ, शायद। लेकिन कमांड लाइन के विकल्प को बदलना चीजों में से एक हो सकता है, इसलिए मैं हमेशा ऐसा नहीं करूंगा ।
माइकल हैम्पटन

जवाब के लिए धन्यवाद। क्या "केक्सेक तैयारी" को स्वचालित करने का एक तरीका है? जब मैं "systemctl start kexec.target" एक्सपेक्ट करता हूं, तो क्या सिस्टम को स्वतः ही kexec तैयार करने के लिए कॉन्फ़िगर किया जा सकता है?
मैट्रिक्स

@ मेट्रिक्स अच्छा सवाल। अगर ऐसा कोई रास्ता है, तो मुझे इसकी जानकारी नहीं है। और वैसे भी, रिबूटिंग एक ऐसी चीज है जिसके बारे में आप आमतौर पर सोचना चाहते हैं।
माइकल हैम्पटन

मुझे लगता --reuse-cmdlineहै कि यह छोटा और अधिक पठनीय है। दुर्भाग्य से --reuseinitrdएक चालू initramfs को पहचानने से इनकार करता है, इसलिए मुझे इसे मैन्युअल रूप से निर्दिष्ट करने की आवश्यकता है।
कुबंझक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.