Làm cách nào để sử dụng đúng kexec với systemd trên CentOS 7?


13

Tôi muốn sử dụng kexec để tăng tốc độ khởi động lại máy CentOS 7 của mình. Làm thế nào tôi có thể làm điều đó theo cách tích hợp độc đáo với các mục tiêu hệ thống tắt / khởi động lại hiện có? Cách thích hợp (chính thức) để làm điều này là gì?

Câu trả lời:


11

Tôi đã tìm ra một cách để tạo một tập lệnh tải kexec hoạt động tốt và sẽ tải kernel mặc định trong grub, nghĩa là nó sẽ tải kernel mới sau khi cập nhật kernel.

Tệp: / 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"

Tệp: /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
Thật kỳ diệu, tôi hoàn toàn không hiểu tại sao điều này vẫn chưa có 289 lượt nâng cấp ...
kubanchot

3
Để đơn giản, tôi loại bỏ tệp tập lệnh và thay vào đó tôi sử dụngExecStart=/bin/sh -c "kexec -l $$(grubby --default-kernel) --initrd=$$(grubby --default-kernel | sed 's!vmlinuz!initramfs!;s/$/.img/') --reuse-cmdline"
kubanchot

7

Việc này thật thẳng thắn.

Giai đoạn đầu tiên kernel được khởi động:

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"

Các tùy chọn này đã bị xóa khỏi cấu hình grub được tạo.

Bây giờ nói với systemd để làm phép thuật của nó.

systemctl start kexec.target

Hoặc trên các phiên bản gần đây hơn của systemd:

systemctl kexec

Một vài giây sau, bạn sẽ có trong kernel mới của mình.


Gần đây tôi đã viết một kịch bản không biết phân phối để giúp tự động hóa điều này (báo cáo lỗi được chào đón).


Sẽ không --command-line=$(cat /proc/cmdline)làm việc tốt chứ?
Dennis Kaarsemaker

1
@DennisKaarsemaker Vâng, có lẽ vậy. Nhưng thay đổi các tùy chọn dòng lệnh có thể là một trong những điều đang được thực hiện, vì vậy tôi không nhất thiết phải luôn luôn làm điều đó.
Michael Hampton

Cảm ơn bạn đã trả lời. Có cách nào để tự động hóa "chuẩn bị kexec" không? Systemd có thể được cấu hình để tự động chuẩn bị kexec khi tôi thực hiện "systemctl start kexec.target" không?
Ma trận

@Matrix Câu hỏi hay. Nếu có một cách như vậy, tôi không nhận thức được nó. Và dù sao, khởi động lại là một cái gì đó bạn thường muốn nghĩ về.
Michael Hampton

Tôi nghĩ --reuse-cmdlinelà ngắn hơn và dễ đọc hơn. Thật không may --reuseinitrdtừ chối nhận ra một initramfs hiện tại, vì vậy tôi cần chỉ định nó bằng tay.
kubanchot
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.