前言
Linux内核是操作系统的核心,也是操作系统最基本的部分。
Linux内核的体积结构是单内核的,但是它充分采用了微内核的设计思想、使得虽然是单内核,但工作在模块化的方式下,并且这个模块可以动态装载或卸载;Linux负责管理系统的进程、内存管理、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。如果我们在了解Linux内核的基础上根据自己的需要量身定制一个更高效,更稳定的内核,就需要我们手动去编译和配置内核里的各项相关的参数和信息了。
注意:如果两个内核模块的版本不完全相同是不可以跨版本使用的
正文
首先我们要去获得Linux内核的源码文件,获得的路径很多了,最直接的就是去内核官网获得了(www.kernel.org),也可以到各镜像站上去下载。
注意:/usr/src;一般而言,我们制作Linux内核的时候把解压缩之后的源码文件放置这个目录下,但需要在此目录下创建一个叫linux的软链接指向解压缩后的内核源码目录。
编译内核前提
(1)准备好开发环境
(2)获取目标主机上硬件设备的相关信息
(3)获取目标主机系统功能的相关信息,例如要启用的文件系统
(4)获取内核源码包:www.kernel.org
准备开发环境
Centos 6
安装包组:
Development Tools
Server Platform Development
Centos 7
安装包组:
Development Tools
Server Platform Development
包:ncurses-devel
获取目标主机上硬件设备的相关信息
CPU:
# cat /proc/cpuinfo
# lscpu
x86info -a
PCI设备:
# lspci
-v,-vv
# lsusb
-v,-vv
# lsblk
内核编译过程
步骤:
(1)# tar -xf linux-3.10.67.tar.xz -C /usr/src #将linux-3.10.67.tar.xz源码包解压至/usr/src目录下
(2)cd /usr/src #cd到/usr/src目录下
(3)ln linu-3.10.67 linux #创建一个名为linux的软链接至linux-3.10.67
(4)cd linux #cd到linux软链接目录中
(5)make menuconfig #配置内核选项
(6)make [-j #] #编译内核,可使用-j指定编译线程数量
(7)make modules_install #安装内核模块
(8)make install #安装内核
重启系统,选择使用新内核
注意:如果编译是在远程连接上的话,如果因为网络抖动make会出现问题的,如果远程连接断开的话那运行的进程也就断开了,这么make的过程一定是当前系统上运行的子进程,有些一旦父进程挂了,子进程也将不复存在,俗话说:皮之不存毛将焉附,就是这个道理吧
所以我们使用一个叫screen命令来操作,没安装自己安装就是了,可以在一个窗口上启动n个虚拟的桌面,即使退出了也会保留之前的内容。
screen命令
打开一个screen:# screen
拆除一个screen:# Ctrl+a,d
列出screen:# screen -ls
连接至screen:# screen -r SCREEN
关闭screen:# exit 或 Ctrl+d
过程详细说明
(1)配置内核选项
支持"更新"模式进行配置;子啊已有的.config文件的基础上进行"修改"配置
配置内核方法很多,主要有如下几种:
(a)make config:基于命令行以遍历的方式去配置内核中可配置的每个选项(不推荐使用)
(b)make menuconfig:基于ncurse库编制的图形工具界面
(c)make gconfig:基于GTK开发环境的窗口界面;“桌面平台开发包组”
(d)make xconfig:基于X11开发环境的窗口界面
由于对Linux还处在初学阶段,所以选择了简单的配置内核方法,即make menuconfig。在/usr/src/linux目录下在终端上输入make menuconfig,等待几秒后,终端变成图形化的内核配置界面。进行配置时,大部分选项使用其缺省值,只有一小部分需要根据不同的需要选择。
对每一个配置选项,用户有三种选择,它们分别代表的含义如下:
<*>或[*] #将该功能编译进内核
[ ] #不将该功能编译进内核
[M] #将该功能编译成可以在需要时动态装载到内核中的代码
(2)编译
(a)多线程编译:make [-j #]
(b)编译内核中的一部分代码:
(1)只编译某子目录中的相关代码
# cd /usr/src/linux
# make path/to/dir/
(2)只编译一个特定的模块
# cd /usr/src/linux
# make path/to/dir/file.ko
(c)如何交叉编译:
编译的目标平台与当前编译操作所在的平台不同
# make ARCH=arch_name
获取特定目标平台的使用帮助
# make ARCH=arch_name help
(3)如何在执行过编译操作的内核源码树上做重新编译
事先清理操作
# make clean:清理编译生成的绝大多数文件,但会保留config,以编译外部模块所需要的文件
# make mrproper:清理编译生成的所有文件,包括配置生成的config文件及某些备份文件
# make distclean:相当于mrproper,额外清理各种patches以及编辑器备份文件