Linux下的快速重启

systemd的特殊重启方式

Posted by wszqkzqk on August 19, 2023
本文字数:835

前言

Linux下有很多可以用于重启的命令,例如rebootshutdown -rsudo systemctl reboot等。然而,前面列出的这些命令都是执行完整重启的命令,会关闭所有的进程,然后从UEFI引导程序重新启动系统,重启耗时较长。

本文简单介绍在Linux下快速重启的方案。

kexec

首先是较为知名的kexeckexec是一个用于加载内核镜像的命令,可以在绕过UEFI引导程序的情况下直接由原内核加载新内核,从而实现快速重启。

安装

在Arch Linux下,可以用以下命令安装kexec-tools

sudo pacman -S kexec-tools

使用

如果没有使用systemd-boot引导或使用了systemd-boot但有多个启动条目,使用kexec重启前需要先指定切换内核镜像路径,例如:

sudo kexec -l /boot/vmlinuz-linux-zen --initrd=/boot/initramfs-linux-zen.img --reuse-cmdline

然后使用kexec重启:

sudo systemctl kexec

kexec重启过程较为完整,包含了内核加载过程,可以用于更换新的内核。然而,在某些固件下,kexec可能会因为兼容性问题而引发某些Bug,比如在笔者的设备上,UEFI固件升级以后使用kexec重启会导致核显出现问题,GUI无法正常显示(透明度和鼠标的光标有Bug),但是笔者切换到Wayland后这一Bug消失了。

systemd的软重启支持

systemd从版本254开始支持软重启,可以在不重新加载内核的情况下重启系统,从而实现快速重启。软重启只需要执行:

systemctl soft-reboot

软重启显著较其他重启方式快,它在关闭所有用户态进程后,直接将新的根文件系统挂载到/run/nextroot/,然后在新的根文件系统中启动systemd,从而实现快速重启。但是,这种重启方式不会重新加载固件和内核,在某些情况下可能会引发问题。