几乎所有的发行版都提供了installkernel脚本,这样就不需要开发者做任何额外的工作,内核编译系统就可以通过它把内核自动安装到正确的位置并修改bootloader。
如果你已经构建好了一些模块并想使用这种方法安装内核,首先输入:
# make modules_install
以上命令将安装所有构建好的模块,并将其置于文件系统中新内核能够找到的合适位置。模块置于"/lib/modules/[kernel_version]"目录内,[kernel_version]是新内核的版本号。
成功安装模块后,应当安装主内核映像:
# make install
以上命令将会执行如下步骤:
1. 内核编译系统将会验证内核是够成功编译。
2. 编译系统会把内核静态部分安装到/boot目录,并以所编译的内核版本号命名此可执行文件。
3. 内核编译系统将使用编译好的模块自动创建启动阶段需要使用的初始ramdisk映像。
4. 通知引导程序(bootloader)添加新内核,新内核将被加入到适当的菜单中,以便用户在下次启动中选择。
5. 完成这些之后,内核就安装成功了,你可以安全的重启并尝试使用新的内核映像。请注意此安装不会覆盖任何旧的内核映像,因此如果新内核映像出现了问题,可以选择从旧内核启动。
如果你的发行版没有installkernel命令,或者你希望手动安装以理解有关步骤,方法如下:
首先,必须安装模块:
# make modules_install
静态内核映像必须被复制到/boot目录内。对于基于i386的内核,执行以下操作:
# make kernelversion
2.6.28
注意这个内核版本号很有可能和你的不同。用这个值来替换下面步骤中的KERNEL_VERSION文本。
# cp arch/i386/boot/bzImage /boot/bzImage-KERNEL_VERSION
# cp System.map /boot/System.map-KERNEL_VERSION
修改bootloader使其识别新内核。此步骤需要修改bootloader的配置文件,这部分内容在后续"为新内核修改bootloader"小节中说明(包括GRUB和LILO引导程序)。
如果启动过程不能正常进行,通常是因为需要初始ramdisk映像。要正确的创建这个映像,请使用前面介绍的自动安装内核中的步骤,因为发行版的安装脚本知道怎样使用其它脚本和工具来正确地创建初始ramdisk映像。
以下是一个方便的脚本,能用于自动安装内核,而不需要每次都键入上述的命令:
#!/bin/sh
#
# installs a kernel
#
make modules_install
# find out what kernel version it is
for TAG in VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION; do
eval `sed -ne "/^$TAG/s/ //gp" Makefile`
done
SRC_RELEASE=$VERSION.$PATCHLEVEL.$SUBLEVEL.$EXTRAVERSION
# figure out the architecture
ARCH=`grep "CONFIG_ARCH" include/linux/autoconf.h | cut -f 2 -d "\""`
# copy the kernel image
cp arch/$ARCH/boot/bzImage /boot/bzImage-"$SRC_RELEASE"
# copy the System.map file
cp System.map /boot/System.map-"$SRC_RELEASE"
echo "Installed $SRC_RELEASE for $ARCH"
查看/boot目录,以确定你的系统所使用的bootloader。如果存在grub子目录:
$ ls -F /boot | grep grub
grub/
那么你的系统就是使用GRUB程序引导的。如果没有此目录,请查找/etc/lilo.conf文件:
$ ls /etc/lilo.conf
/etc/lilo.conf
如果它存在,则系统是使用LILO程序来引导的。
$ info grub
把新内核条目加入/boot/grub/menu.lst文件的最简单方法是复制所有的条目。例如,参考下面这个Gentoo系统中的menu.lst文件:
timeout 300
default 0
splashimage=(hd0,0)/grub/splash.xpm.gz
title 2.6.29.4
root (hd0, 0)
kernel /bzImage-2.6.29.4 root=/dev/sda2 vga=0x0305
title 2.6.29
root (hd0, 0)
kernel /bzImage-2.6.29 root=/dev/sda2 vga=0x0305
内核条目以title开头的行定义菜单条目,因此这个文件包含两个条目。我们只需复制以title开头的一段文字,例如:
title 2.6.29.4
root (hd0, 0)
kernel /bzImage-2.6.29.4 root=/dev/sda2 vga=0x0305
然后将这段文字添加到文件的末尾。在这个例子中,我们安装了2.6.28的内核,所以最终的文件如下所示:
timeout 300
default 0
splashimage=(hd0,0)/grub/splash.xpm.gz
title 2.6.29.4
root (hd0, 0)
kernel /bzImage-2.6.29.4 root=/dev/sda2 vga=0x0305
title 2.6.29
root (hd0, 0)
kernel /bzImage-2.6.29 root=/dev/sda2 vga=0x0305
title 2.6.28
root (hd0, 0)
kernel /bzImage-2.6.28 root=/dev/sda2 vga=0x0305
保存文件之后,重新启动系统并确认新内核映像标题出现在引导菜单中。移动光标选择新内核版本,按下回车键引导新内核映像。
要让LILO知道有了一个新内核,你需要修改/etc/lilo.conf配置文件后运行LILO命令以应用配置文件中的修改。
向/etc/lilo.conf中添加新内核条目的最简单的方法是复制一个现有条目。例如,参考下面来自Gentoo系统的LILO配置文件:
boot=/dev/hda
prompt
timeout=50
default=2.6.29
image=/boot/bzImage-2.6.29
label=2.6.29
read-only
root=/dev/hda2
image=/boot/bzImage-2.6.30
label=2.6.30
read-only
root=/dev/hda2
在这个例子中,我们安装了,所以最终的文件如下:
boot=/dev/hda
prompt
timeout=50
default=2.6.29
image=/boot/bzImage-2.6.29
label=2.6.29
read-only
root=/dev/hda2
image=/boot/bzImage-2.6.30
label=2.6.30
read-only
root=/dev/hda2
image=/boot/bzImage-2.6.28
label=2.6.28
read-only
root=/dev/hda2
保存文件之后,运行程序将修改后的配置文件写入磁盘的引导区。
# /sbin/lilo
重新启动系统并确认新内核映像标题出现在引导菜单中。移动光标选择新内核版本,按下回车键引导新内核映像。