Kernel:编译、安装内核详解教程
一、生成配置文件(自己配置可以省略此步骤)
方法一:复制现有配置文件
$ 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工具
installkernel在mkinitrd包中,如果没有请先安装。
在有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