我正在使用 ssh 远程访问一些机器。这些机器安装了自定义内核(基于 2.6.28 源)。但是,每当我尝试使用 重新启动计算机时sudo reboot
,系统都会使用 kexec 并加载 2.6.28-19-generic 内核,该内核也已安装在计算机上。
那么如何指定重启后加载哪个内核映像呢?
编辑:我的机器上安装了 ubuntu 9.04,带有 grub 1.something。自定义内核基于 2.6.28 源,名称为 2.6.28.10-custom-1.1。另外两个内核安装在机器上:2.6.28-19-generic 和 2.6.28-6-386。我检查过,在调用reboot后,机器实际上并没有重新启动,而是使用kexec加载19通用内核,即使当前内核是自定义内核。
答案1
通常,当您重新启动时,计算机将返回 grub,并允许您通过键盘选择内核,或启动默认配置的内核。但是,如果您安装了 kexec-tools,reboot 命令将短路此行为并直接 kexec 到内核中。您可以通过卸载 kexec 工具或编辑文件来禁用此行为,并在重新启动时返回到 grub
/etc/default/kexec
和设置:
LOAD_KEXEC=false
或者,要保持 kexec 处于活动状态并重新启动到您选择的内核,请尝试使用如下命令行来加载所需的内核:
kexec -l /boot/vmlinux --append=root=/dev/hda1 --initrd=/boot/initrd
然后当稍后运行“kexec -e”时,kexec 行中配置的内核也将运行。因为我相信重新启动脚本最终只会调用“kexec-e”,所以我相信内核更改应该会生效。
答案2
我发现了一个非常漂亮的帖子这里。它包含一个手动调用 kexec 的脚本。在这里重新发布脚本:
UNAMER=`uname -r` # this checks the version of the kernel
#just to save typing
#This just puts all of the parameters for loading in one place
KPARAMS="-l " # tells kexec to load the kernel
# --append tells the kernel all of its parameters
# cat /proc/cmdline gets the current kernel's command line
KPARAMS=$KPARAMS"--append=\"`cat /proc/cmdline`\" "
# this tells the kernel what initrd image to use
KPARAMS=$KPARAMS"--initrd=/boot/initrd.img-$UNAMER "
# this tells the kexec what kernel to load
KPARAMS=$KPARAMS"/boot/vmlinuz-$UNAMER"
# Message should end with a newline since kFreeBSD may
# print more stuff (see #323749)
log_action_msg "Will now restart"
if [ -x `locate kexec | grep sbin` ]; then # check for the kexec executable
kexec $KPARAMS # load the kernel with the correct parameters
sync # sync all of the disks so as not to lose data
umount -a # make sure all disks are unmounted
kexec -e # reboot the kernel
fi
#This next line should never happen.
reboot -d -f -i