本文已参加“新人创作盛典”活动,共同开启鹈鹕创作之路。
1.内核编译的基本流程,有需要的话改一下;;; 【根据release版本生成对应的源码包】;。
步骤是必需的,[]是可选步骤。 如果不使用release版本的源码包管理系统,则无需执行步骤4。如果想使用源码包管理系统安装,可以使用各版本的源码包创建系统分配。 在这些情况下,步骤 3 和 4 的操作会结合起来。
2. 打算工作 2.1 工具安装源码包名称备注
ncurses-开发
基于控制台(文本界面)设置所需
qt开发
基于窗口(图形界面)设置所需
qt3开发
基于窗口(图形界面)设置所需
gcc-c++
基于窗口(图形界面)设置所需
rpm 构建
生成rpm包需要
源码包名备注
libncurses5-dev
基于控制台(文本界面)设置所需
qt3-开发工具
基于窗口(图形界面)设置所需
克++
基于窗口(图形界面)设置所需
内核包
生成deb包时需要
假根
生成deb包时需要
dpkg-dev
生成deb包时需要
2.2 获取源码
别说了。 参考:一篇文章了解Linux系统内核升级并下载当前内核源代码这里假设源代码(linux2.6)已经下载到当前主目录~/linux-2.6/。
3. 配置
源代码树附带了帮助设置的工具。 这个工具包称为 kconfig。 设置工具有两种类型:基于控制台(文本界面)和基于窗口(图形界面)。 这里主要以控制台方式的工具为例进行介绍,前面仅对窗口方式的工具进行简单介绍。
1. 选择目标机器的架构并进行默认配置。 在源码树中,为每个架构准备了一个默认的.config文件,位于arch//configs/*_defconfig,执行以下命令:
$ make defconfig
2. 根据需要更改内核配置 要启动基于控制台的配置工具,请在源代码树的根目录下执行以下命令:
$ make menuconfig
[y]键:完成左侧的选择显示。 这意味着该项目已编译并静态添加到内核中。 [m]键,显示完成。 此时,该项目将被编译为模块。 使用此功能时,模块会根据需要动态添加到内核中。 [n]键,它会被破坏,并且这个函数不会被编译。
大致完成您想要的设置后,您可以在菜单底部选择屏幕上的操作菜单,或者按两次[Esc]键完成设置,并在“是否要保存新的设置”中选择“是”设置?” 出现的对话框 按 键将设置保存到 .config 文件。 至此,内核编译设置完成。
4. 编译 4.1 直线编译
当运行编译内核的目标机是本地时,只需要在源码树的根目录下执行:
$ make
编译时间与机器性能关系较大,少则几分钟,多则几个小时。 那么有什么办法可以节省编译时间呢?
在内核的配置中,将目标环境中不需要的驱动设置为无效,只使用必要的函数或模块作为编译对象。 编译选项上的-j选项用于指定make的并发度。 当机器是多处理器时,可以根据处理器的数量来指定该值,这样就可以实现快速编译。 机器性能方面,采用高性能主机进行内核编译。 4.2 交叉编译变量说明
拱
目标机框架
交叉编译
指定交叉编译器的前缀
$ make ARCH=arm CROSS_COMPILE=armv5tel-linux- uImage
$ make ARCH=arm CROSS_COMPILE=armv5tel-linux- modules
$ make ARCH=arm CROSS_COMPILE=armv5tel-linux- INSTALL_MOD_PATH=~/armroot-2.6.38 modules_install
4.3 自定义模块编译
有时,不仅仅是嵌入式模块,我们更多地需要编译可加载模块,其源代码和内核源代码树并不在同一目录树中,而是单独提供。 在这些情况下,就需要正确编译驱动源代码的Makefilelinux 源码包编译,并按照以下方法编译安装:
$ make –C /lib/modules/$(uname -r)/build M=$PWD
$ make –C /lib/modules/$(uname -r)/build M=$PWD modules_install
-C 选项:到内核源目录的符号链接。 -M 选项:告诉 Linux 内核的构建操作正在源代码树之外执行构建操作。
5. 安装 5.1 本地安装
安装分三个阶段进行。 第一阶段是模块的安装。 在编译后的源码树根目录下执行命令:
$ sudo make modules_install
此时编译好的模块安装在/lib/modules下。 第二阶段是安装内核的双补码镜像文件,生成并安装引导初始化文件系统镜像文件。 同样在源码树的根目录下执行以下命令:
$ sudo make install
此时,内核镜像文件安装在/boot下。
下表是内核安装生成的文件和目录列表:
文件名或目录名内容
/lib/modules/<内核版本>
模块安装目录
/boot/vmlinuz-<内核版本>
内核映像文件
/boot/initramfs-<内核版本> 或 /boot/initrd.img-<内核版本>
引导初始化文件系统映像
/boot/Systemmap-<内核版本>
地址信息文件
第三阶段更改启动文件。 在某些系统设置下,可能需要自动配置 GRUB 以便能够从当前安装的内核引导。 在这些情况下,请适当编辑 /boot/grub/menu.lst 或执行 update-grub 命令。 此时请重新启动机器,确认新内核是否仍能正常运行。
注意:内核镜像的文件名和模块目录名是根据内核版本命名的。 因此,当重新编译安装已安装版本的内核时,之前安装的内核和模块将被覆盖。 为了避免这些情况,可以在内核配置选项CONFIG_LOCALVERSION中添加字符,该字符将成为内核版本的一部分,从而避免被覆盖。
进行对象描述
干净的
将源树恢复到编译前状态。 obj文件被删除,.config或者编译时手动生成的一些文件不会被删除
正确先生
将源码树完全恢复到发布时的状态。发布时源码树中不存在的所有文件都将被删除,包括.config文件
帮助
显示可用的 make 对象
标签
生成标签文件。有了标签文件linux 源码包编译,就可以使用Emacs等编辑器的tagjump功能跳转到函数定义,可以高效浏览源码
范围
生成与 cscope 一起使用的索引文件。 cscope是一个基于控制台(文本界面)的源代码浏览器
盟友配置
生成一个 .config 文件,其中所有设置项均设置为有效并静态添加到内核
全部无配置
生成使允许范围内的设置项无效的.config文件
全部修改配置
生成一个 .config 文件,启用所有可设置为模块的项目并将其设置为模块
/.o
仅执行生成指定目标文件所需的编译。仅指定时,目录中的所有目标文件均从 .config 文件生成
/.ko
只生成指定的模块
进行选项描述
V=0|1|2
设置编译时控制台显示的详细程度。 默认只显示摘要,设置为0。设置为1时,显示更详细的信息。 设置为2时,不仅会显示摘要,还会显示编译原因(大部分原因是“因为没有对象”)
奥=
将编译生成的所有文件输出到. 它在严格禁止写入源代码树的情况下非常有用。
5.2 借助包管理工具安装
要将内核镜像纳入包管理范围,需要生成相应的源码包。
$ make rpm-pkg
执行该命令后,将创建源代码包(SRPM)和补码代码包(RPM)。 两者的补码代码包存放在~/rpmbuild/rpms下,源代码包存放在~/rpmbuild/SRPMS下。 如果您有 SRPM 提取的发行版内核的源代码,请使用 rpmbuild 创建源代码包。 如果内核的SRPM解压到~/rpmbuild,则执行以下命令创建源码包:
$ rpmbuild –ba ~/rpmbuild/SPECS/kernel.spec
创建的源码包存放目录与之前相同。 该源码包与普通源码包相同,可以使用rpm命令进行安装和卸载。
$ make deb-pkg
创建的源码包存放在源码树的根目录下。 将生成多个源包,包括包含内核映像和模块的 linux-image-<kernel version>.deb 文件。 该源码包的操作与常见的deb源码包文件的操作相同,使用dpkg即可安装。
据悉,Ubuntu还在kernel-package包中包含了makekpkg命令来辅助创建内核包。 该工具可以通过命令选项来设置创建操作,您也可以根据自己的需要使用该工具。
6. 卸载
注意:卸载内核时请慎重考虑。 另外,请务必做好修改GRUB设置等工作。