CentOS 7에서 systemd와 함께 kexec를 올바르게 사용하는 방법은 무엇입니까?


13

CentOS 7 컴퓨터의 재부팅 속도를 높이기 위해 kexec를 사용하고 싶습니다. 기존 종료 / 재부팅 시스템 대상과 원활하게 통합되는 방법으로 어떻게 할 수 있습니까? 이 작업을 수행하는 올바른 (공식) 방법은 무엇입니까?

답변:


11

kexec 로딩 스크립트가 제대로 작동하고 grub에서 기본 커널을로드하는 방법을 알아 냈습니다. 즉, 커널 업데이트 후에 새 커널을로드해야합니다.

파일 : / 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
Marvellous, 나는 이것이 왜 289 개의
공감대를 얻지

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)작동 하지 않습니까?
Dennis Kaarsemaker

1
@DennisKaarmaker 예, 아마도 그렇습니다. 그러나 명령 행 옵션을 변경하는 것이 수행되는 작업 중 하나 일 수 있으므로 항상 그렇게하는 것은 아닙니다 .
Michael Hampton

답변 감사합니다. "kexec 준비"를 자동화하는 방법이 있습니까? "systemctl start kexec.target"을 예상 할 때 kexec를 자동으로 준비하도록 systemd를 구성 할 수 있습니까?
Matrix

@Matrix 좋은 질문입니다. 그런 방법이 있다면, 나는 그것을 모른다. 어쨌든 재부팅은 일반적으로 생각하고 싶은 것입니다.
Michael Hampton

나는 --reuse-cmdline더 짧고 읽기 쉽다고 생각 합니다. 불행히도 --reuseinitrd현재 initramfs 인식을 거부하므로 수동으로 지정해야합니다.
kubanczyk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.