CentOS 7 এ সিস্টেমডের সাথে কীভাবে সঠিকভাবে কেক্সেক ব্যবহার করবেন?


13

আমি আমার সেন্টোস 7 মেশিনটির রিবুটগুলি দ্রুত করতে কেক্সেক ব্যবহার করতে চাই। বিদ্যমান শটডাউন / রিবুট সিস্টেমযুক্ত টার্গেটগুলির সাথে সুন্দরভাবে সংহত করার উপায় আমি কীভাবে এটি করতে পারি? এটি করার উপযুক্ত (অফিসিয়াল) উপায় কী?

উত্তর:


11

আমি একটি কেক্সেক লোডিং স্ক্রিপ্ট তৈরি করার একটি উপায় খুঁজে পেয়েছি যা ভালভাবে কাজ করে এবং গ্রাবের মধ্যে ডিফল্ট কার্নেলটি লোড করবে, এর অর্থ এটি কার্নেল আপডেটের পরে নতুন কার্নেলটি লোড করা উচিত।

ফাইল: / 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

1
দুর্দান্ত, আমি এখনও বুঝতে পারি না কেন এটি এখনও ২৮৯ টি উপস্থাপনা পায় নি ...
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
@ ডেনিসকর্সামেকার হ্যাঁ, সম্ভবত তাইও। কমান্ড লাইন বিকল্পগুলি পরিবর্তন করা একটি কাজ হতে পারে, তাই আমি অগত্যা সবসময় এটি করতাম না।
মাইকেল হ্যাম্পটন

উত্তরের জন্য ধন্যবাদ. "কেক্সেক প্রস্তুতি" স্বয়ংক্রিয় করার কোনও উপায় আছে কি? আমি যখন "সিস্টেমেটিএল স্টার্ট কেেক্সেক.টারজেট" উপস্থিত করি তখন কক্সিক স্বয়ংক্রিয়ভাবে প্রস্তুত করার জন্য সিস্টেমড কনফিগার করা যায়?
ম্যাট্রিক্স

@ ম্যাট্রিক্স ভাল প্রশ্ন। যদি এমন উপায় থাকে তবে আমি এটি সম্পর্কে সচেতন নই। এবং যাইহোক, পুনরায় বুট করা এমন একটি জিনিস যা আপনি সাধারণত ভাবেন।
মাইকেল হ্যাম্পটন

আমি মনে করি --reuse-cmdlineসংক্ষিপ্ত এবং আরও পাঠযোগ্য। দুর্ভাগ্যক্রমে --reuseinitrdএকটি বর্তমান থ্রিমারফগুলি স্বীকৃতি দিতে অস্বীকার করেছে, সুতরাং আমার এটি ম্যানুয়ালি নির্দিষ্ট করা দরকার।
kubanczyk
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.