CentOS 7のsystemdでkexecを適切に使用するには?


13

kexecを使用して、CentOS 7マシンの再起動を高速化したい。既存のシャットダウン/リブートsystemdターゲットとうまく統合する方法でそれを行うにはどうすればよいですか?これを行うための適切な(公式の)方法は何ですか?

回答:


11

うまく動作し、grubのデフォルトカーネルをロードする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
驚異的な、私はなぜこれがまだ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"

これらのオプションは、生成されたgrub設定から削除されました。

systemdに魔法をかけるように指示します。

systemctl start kexec.target

またはsystemdの最新バージョンでは:

systemctl kexec

数秒後、新しいカーネルが起動します。


私は最近これを自動化するのに役立つディストリビューションに依存しないスクリプト作成しました(バグレポートを歓迎します)。


--command-line=$(cat /proc/cmdline)うまくいきませんか?
デニスカースメーカー14

1
@DennisKaarsemakerええ、おそらくそうです。しかし、コマンドラインオプションの変更は行われていることの1つである可能性があるため、必ずしもそれを行うとは限りません。
マイケルハンプトン

答えてくれてありがとう。「kexecの準備」を自動化する方法はありますか?systemctlは、「systemctl start kexec.target」を実行したときにkexecを自動的に準備するように構成できますか?
マトリックス

@Matrix良い質問です。そのような方法がある場合、私はそれを認識していません。とにかく、再起動は一般的に考えたいことです。
マイケルハンプトン

--reuse-cmdline短くて読みやすいと思います。残念ながら--reuseinitrd、現在のinitramfsを認識できないため、手動で指定する必要があります。
クバンチク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.