Linux kexec命令介绍
kexec是kernel execute的缩写,类似于Unix/Linux内核的exec系统调用,它是一个可以让你从当前运行的内核直接加载和启动另一个内核的系统调用,绕过BIOS或固件的引导程序。这样可以减少重启所需的时间。kexec的功能相当于在内核中执行了引导加载器的功能。使用kexec的主要区别是,在kexec启动时,硬件初始化通常由BIOS或固件(取决于架构)执行的部分不会执行。要使用kexec,你需要在配置内核时选择CONFIG_KEXEC=y选项,这个选项会启用kexec系统调用。
Linux kexec命令适用的Linux版本
kexec命令适用于大多数Linux发行版,但是有些发行版可能需要安装kexec-tools包才能使用。例如,Arch Linux,CentOS,Ubuntu等发行版都需要安装kexec-tools包。安装命令如下:
# Arch Linux
[linux@bashcommandnotfound.cn ~]$ sudo pacman -S kexec-tools
# CentOS
[linux@bashcommandnotfound.cn ~]$ sudo yum install kexec-tools
# Ubuntu
[linux@bashcommandnotfound.cn ~]$ sudo apt install kexec-tools
Linux kexec命令的基本语法
kexec命令的基本语法如下:
kexec [options] kernel-image
其中,kernel-image是你要重启到的内核文件。你还可以使用一些选项来指定其他参数,例如:
kexec -l kernel-image --append=command-line-options --initrd=initrd-image
这个命令会加载kernel-image,并传递command-line-options作为新内核的命令行参数,以及initrd-image作为新内核的initrd镜像。你可以使用kexec -h
或man kexec
来查看更多的选项和用法。
Linux kexec命令的常用选项或参数说明
kexec命令有很多选项或参数,下面是一些常用的:
选项 | 参数 | 说明 |
---|---|---|
-d | 无 | 启用调试信息 |
-e | 无 | 执行当前加载的内核 |
-f | 无 | 强制立即执行kexec,不调用shutdown |
-h | 无 | 显示帮助信息 |
-l | kernel-image | 加载指定的内核 |
-p | kernel-image | 加载指定的内核作为panic内核 |
-t | type | 指定内核文件的类型 |
-u | 无 | 卸载当前加载的内核 |
--append | command-line-options | 指定新内核的命令行参数 |
--initrd | initrd-image | 指定新内核的initrd镜像 |
--mem-min | addr | 指定内存的最小地址 |
--mem-max | addr | 指定内存的最大地址 |
Linux kexec命令的实例
下面是一些使用kexec命令的实例,你可以根据你的需要修改参数和选项。
实例1:加载并执行一个新内核
假设你要重启到的内核文件是/boot/vmlinuz-linux,当前内核的命令行参数是root=/dev/sda1,initrd镜像是/boot/initramfs-linux.img,那么你可以使用以下命令来加载并执行新内核:
[linux@bashcommandnotfound.cn ~]$ sudo kexec -l /boot/vmlinuz-linux --append=root=/dev/sda1 --initrd=/boot/initramfs-linux.img
[linux@bashcommandnotfound.cn ~]$ sudo kexec -e
注意:直接执行kexec -e
命令不会优雅地卸载活动的文件系统或终止运行的服务,可能会导致数据丢失或损坏。建议你在执行前先关闭所有的程序和服务,或者使用systemctl kexec
命令来让systemd处理服务的关闭和kexec的执行。
实例2:加载一个新内核并让systemd执行kexec
如果你不想直接执行kexec,而是想让systemd在关闭服务后执行kexec,你可以使用以下命令来加载一个新内核,并让systemd在重启时执行kexec:
[linux@bashcommandnotfound.cn ~]$ sudo kexec -l /boot/vmlinuz-linux --append=root=/dev/sda1 --initrd=/boot/initramfs-linux.img
[linux@bashcommandnotfound.cn ~]$ sudo systemctl kexec
这样,systemd会在关闭服务后执行kexec,重启到新内核。如果你使用的是systemd-boot引导程序,并且没有手动加载任何内核,systemd会默认加载引导程序中指定的默认内核。
实例3:加载一个panic内核
如果你想在系统发生内核崩溃时自动重启到另一个内核,你可以使用kexec来加载一个panic内核,这样可以避免重新引导的开销,也可以保留崩溃时的内核信息。你可以使用以下命令来加载一个panic内核:
[linux@bashcommandnotfound.cn ~]$ sudo kexec -p /boot/vmlinuz-linux --append=root=/dev/sda1 --initrd=/boot/initramfs-linux.img
然后,你需要在当前内核的命令行参数中添加crashkernel=auto
或crashkernel=size
,其中size是你要为panic内核分配的内存大小,例如crashkernel=128M
。你可以使用grub-mkconfig
或其他工具来修改当前内核的命令行参数,或者手动编辑引导程序的配置文件。你还需要在当前内核中启用CONFIG_KEXEC_AUTO_RESERVE
和CONFIG_KEXEC_FILE
选项,以及CONFIG_RELOCATABLE
和CONFIG_CRASH_DUMP
选项。这样,当系统发生内核崩溃时,它会自动执行panic内核,而不是重新引导。
Linux kexec命令的注意事项
使用kexec命令时,有以下几点需要注意:
- kexec可能不适用于一些特殊的硬件或驱动,因为它们可能需要BIOS或固件的初始化才能正常工作。如果你遇到了这种情况,你可以尝试使用
--reset-vga
或--console-vga
选项来解决显示问题,或者使用--reuse-cmdline
选项来保留当前内核的命令行参数。 - kexec可能与一些安全机制不兼容,例如SELinux或Secure Boot,因为它们可能会阻止非签名的内核的加载或执行。如果你遇到了这种情况,你可以尝试关闭或绕过这些安全机制,或者使用签名的内核。
- kexec可能与一些内核特性不兼容,例如hibernation或kdump,因为它们可能会占用或修改内存中的内核信息。如果你遇到了这种情况,你可以尝试关闭或禁用这些特性,或者使用不同的内核。
- 如果你使用kexec加载了一个内核,但是没有执行它,你可以使用
kexec -u
命令来卸载它,这样就可以恢复正常的重启过程。 - 如果你在执行kexec时遇到了
bash: kexec: command not found
的错误,说明你没有安装kexec-tools包,参考上面安装。
Linux kexec相关命令
下面是一些与kexec相关的命令,你可以点击链接查看更多的介绍和用法。
评论区