Kernel:编译、安装内核详解教程

作者: lesca 分类: GRUB2,Kernel,Tutorials 发布时间: 2012-02-16 16:54

一、生成配置文件(自己配置可以省略此步骤)

方法一:复制现有配置文件

$ cp /boot/config-$current_version-general ./.config

方法二:生成默认配置文件

$ make defconfig

方法三:使用图形界面

终端字符环境:

$ make menuconfig

X环境:

$ make xconfig

GTK环境:

$ make gconfig

menuconfig为例:

$ make menuconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/docproc
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/kxgettext.o
 *** Unable to find the ncurses libraries or the
 *** required header files.
 *** 'make menuconfig' requires the ncurses libraries.
 *** 
 *** Install ncurses (ncurses-devel) and try again.
 *** 
make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
make: *** [menuconfig] Error 2

Aho! 遇到错误,我们缺少 ncurses-dev这个包:

$ sudo apt-get update
$ sudo apt-get install ncurses-dev

再来一次:

$ make menuconfig

成功了,看看有啥要改的,没有直接退出保存即可。

二、编译内核

$ make [-j2]

其中-j2可以省略,如果是双核处理器请加上此选项提速,四核或者更多核心请改变数字。

编译、安装模块

UPDATE:自2.6开始不需要此步骤

$ make modules 
... # 这里要很长时间,中间编译的过程略去了
$ sudo make modules_install # 将模块相关的文件复制到/lib/modules/目录下的$version目录

清理(如果需要重新配置或者编译)

$ make clean

想要彻底清除包括config配置文件在内的文件:

$ make distclean

三、安装内核

方法一:利用installkernel工具

installkernelmkinitrd包中,如果没有请先安装。
在有installkernel的系统上,安装内核非常简单:

# make modules_install
# make install

/!\注意:需要root权限
make modules_install将编译好的模块复制到/lib/modules/目录下
make install会做以下事情:
1.检查内核是否已经正确编译
2.将bzImage, System.map复制到/boot目录下,并以当前内核版本命名
3.根据modules_install创建的模块,创建所需的initrd.img镜像(初始化内存虚拟磁盘映像)文件
4.修改bootloader(如GRUB2),增加新内核的启动项

方法二:手动安装

主要思路见如下脚本(请以root权限运行):

#!/bin/sh
#
# installs a kernel
#
make modules_install

# find out what kernel version this is
SRC_RELEASE=`make kernelversion`

# assume your architecture is x86
ARCH=x86

# 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"

生成ramdisk

如果你是根据方法一来安装内核的,请跳过此步骤!你还需要确定系统是否需要ramdisk,你可以查看/boot目录下有没有initrd.img文件。如果没有,请跳过此步骤。

$ mkinitrd initrd-$version $version

/!\注意: $version 一定要是make modules_install在/lib/modules/下创建的
如果机器上没有mkinitrd这条命令,请尝试mkinitramfs

$ mkinitramfs -v $version -o initrd-$version

{i}:您可以直接cd /boot后以root权限此命令,可以省去复制的步骤 

修改bootloader配置文件

如果你是根据方法一来安装内核的,请跳过此步骤!
下面以两种bootloader为例进行介绍:

GRUB

编辑/boot/grub/menu.lst文件:

title 2.6.16
	root (hd0,0)
	kernel /bzImage-2.6.16 root=/dev/sda2 vga=0x0305

# 根据之前的配置(如上面三行),更改版本号即可
title 3.2.5
	root (hd0,0)
	kernel /bzImage-3.2.5 root=/dev/sda2 vga=0x0305

GRUB2

/!\:请以root权限运行

# update-grub2

重启系统

到此为止,新内核安装成功,可以放心重启。
如果新内核加载失败,仍然可以选择旧版本的内核引导系统。

四、小结

下面对几个文件进行说明:

.config

编译内核前所生成的配置文件,用来告诉make需要编译哪些东西

bzImage, vmlinuz

bzImage是使用的make命令一起生成的。想要单独生成bzImage,请输入

# make bzImage

bzImage, vmlinuz是完全一样的东西,只是习惯将bzImage放到/boot目录下时重名名为vmlinuz

bzImage, zImage

bzImage是指:big zImage(compressed kernel image)
zImage和bzImage都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。
内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个640K), bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage 或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。

vmlinux, vmlinuz

vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。

make modules_install

安装模块,其实就是讲编译的模块复制到/lib/modules/$version/目录下,$version是当前内核的版本号

GRUB, GRUB2

GRUB2是GRUB的升级版本,详见:GRUB, GRUB2: 区别、比较一文。
更多关于GRUB2的文章及配置,请搜索本站或者查看“相关文章”。

initrd.img

initrd.img 指initial ramdisk image它提供系统初始化的临时文件,这些文件让内核挂载真正的文件系统,然后引导。
如果你在建立内核时加入了真正的文件系统(如ext3),就不需要initrd了。
有关ramdisk的更多信息,请参见本文:什么是initrd, initrd原理, 创建initrd, 手动创建initrd

System.map

内核符号表(Kernel Symbol Table)之一(另一个是/proc/ksyms)
System.map是文件系统上的一个真实文件。当你编译一个新内核时,你原来的System.map中的符号信息就不正确了。随着每次内核的编译,就会产生一个新的 System.map文件,并且需要用该文件取代原来的文件。 /proc/ksyms 是一个 “proc文件” 并且是在内核启动时创建的。实际上它不是一个真实的文件;它只是内核数据的简单表示形式,呈现出象一个磁盘文件似的。
System.map的作用:
1.Linux使用了的klogd(内核日志后台程序)可以进行名字-地址之间的解析。一旦klogd开始转换内核消息,它就使用手头的记录器,将整个系统的消息记录下来,通常是使用syslogd记录器。为了进行名字-地址解析,klogd就要用到System.map文件
2.有一些驱动程序将使用System.map来解析符号(因为它们与内核头连接而非glibc库等),如果没有System.map文件,它们将不能正确地工作。

References:
[1] bzImage or vmlinuz? kernel compilation doubts
[2] System.map文件的作用

版权声明

本文出自 Lesca 技术宅,转载时请注明出处及相应链接。

本文永久链接: https://www.lesca.cn/archives/config-and-install-kernel.html

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!