内核可以简单理解为一个程序,只不过是直接在硬件上运行,编译内核根编译程序过程基本一致。为什么要编译内核?比如说新的内核提供了对新的文件系统格式的支持,或者提供了新的硬件驱动。下载内核源码中包含各种各样功能的源码,但并不是所有功能我们都需要,为了精简内核或者当前内核无法驱动现有硬件设备,所以编译前选择我们需要的功能选项(像硬盘驱动,硬盘接口有IDE,SCSI,你可以把每一种接口的驱动都编译,也可以只选择现在要用的),而后编译生成内核文件。
基本实现过程:
(1)准备好当前编译环境,获取源代码
(2)获取当前系统硬件设备信息,以编译对应的内核源码。
(3)设置内核编译的功能选项(make menuconfig)
(4)进行编译过程
获取目标主机上硬件设备的相关信息:
三种方式获取CPU:
~]# cat /proc/info
~]# lscpu
~]# x86info –a
PCI设备:
~]# lspci 使用-v 或者-vv查看更详细信息
~]# lsusb
~]# lsblk
了解全部硬件设备信息(类似Windows设备管理器)
~]# hal-device
解压内核文件
~]# tar xf linux-3.10.67.tar.xz -C /usr/src
~]# cd /usr/src
~]# ln -s linux-3.10.67 linux
~]# cd linux
按需选择功能进行编译
~]# make menuconfig 配置内核选项,生成./config(/boot/config-version文件是当前运行内核的配置)
进行编译过程
~]# make [-j #] 编译内核,可使用-j指定编译线程数量
~]# make modules_install 安装内核模块
~]# make install 生成vmlinuz ,生成initramfs,更改grub配置文件
screen命令引入:
为什么需要这个命令?很多程序在附着在终端上启动,当终端关闭的时候,此程序也同时关闭。screen允许我们在终端上打开多个虚拟的屏幕(类似Linux图形界面下打开terminal程序的多个标签,screen相当于在字符界面实现同样功能,实现多窗口操作)。这样即使终端关闭,这些虚拟屏幕依然运行,其中运行的程序也不会被终端关闭所影响。
打开screen: ~]# screen
离开screen: Ctrl+a, d
列出screen: ~]# screen -ls
连接至screen: ~]# screen -r SCREEN_ID
关闭screen: ~]# exit
make的常用选项
使用make help查看所有选项
支持“更新”模式进行配置:在已有的.config文件的基础之上进行“修改”配置;
(a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项;
(b) make menuconfig:基于cureses的文本配置窗口;
(c) make gconfig:基于GTK开发环境的窗口界面(当前桌面是gnome还是kde无关),包组“桌面平台开发”
(d) make xonfig:基于QT开发环境的窗口界面;
支持“全新配置”模式进行配置(不保留之前已配置的):
(a) make defconfig:基于内核为目标平台提供的“默认”配置为模板进行配置;
(b) make allnoconfig:所有选项均为“no”;
编译内核中的一部分代码:
(i) 只编译某子目录中的相关代码:
# cd /usr/src/linux
# make path/to/dir/ 只能基于源码根目录执行make
(ii)只编译一个特定的模块
# cd /usr/src/linux
# make path/to/dir/file.ko 编译完成复制到/lib/modules下即可使用
交叉编译(目标平台与当前编译操作所在的平台不同)
# make ARCH=arch_name
要获取特定目标平台的使用帮助:
# make ARCH=arch_name help
如何在执行过编译操作的内核源码目录上做重新编译:
# make clean:清理编译生成的绝大多数文件,但会保留config,及编译外部模块所需要的文件;
# make mrproper:清理编译生成的所有文件,包括配置生成的config文件及某些备份文件;
# make distclean:相当于mrproper,额外清理各种patches以及编辑器备份文件