编译内核

为什么需要编译内核?

     linux发行商为了使其发行版在高低硬件平台“通用”,以较低平台进行了编译。为了发挥硬件平台的新特性,我们需要把新特性加入到内核中。

怎样进行编译呢?

前提:

(1) 准备好开发环境;

(2) 获取目标主机上硬件设备的相关信息;

(3) 获取到目标主机系统功能的相关信息,例如要启用的文件系统; 

(4) 获取内核源代码包:www.kernel.org

准备开发环境:

CentOS 6.7:

包组:Development Tools  、 Server Platform Development 

CentOS 7:

包组:Development Tools  、Server Platform Development 

包:ncurses-devel  基于文本的内核配置窗口包

    为了实现交叉编译需要获取目标主机上硬件设备的相关信息:

CPU:

~]# cat  /proc/info

~]# lscpu

~]# x86info -a

PCI设备:

~]# lspci

-v  详细

-vv  更详细

~]# lsusb

-v 详细

-vv 更详细

~]# lsblk 块设备

了解全部硬件设备信息:以后udev定位某设备的时候可参考

~]# 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       配置内核选项

                          注:menuconfig 是基于文本的内核配置窗口包ncurses-devel 

~]# make  [-j #] 编译内核,可使用-j指定编译线程数量

~]# make modules_install 安装内核模块

~]# make install 安装内核 

             可以试试新内核了,在grub里指向新内核,重启系统,选择使用新内核。

内核编译的拓展说明:

(1)  配置内核选项:支持“更新”模式进行配置:在已有的.config文件的基础之上进行“修改”配置;

(a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项;

(b) make  menuconfig:基于cureses的文本配置窗口;

(c) make  gconfig:基于GTK开发环境的窗口界面。注包组“桌面平台开发”

(d) make  xonfig:基于QT开发环境的窗口界面;注:需要安装KDE开放组件

支持“全新配置”模式进行配置:

(a) make  defconfig:基于内核为目标平台提供的“默认”配置为模板进行配置;

(b) make   allnoconfig:所有选项均为“no”;

(2) 部分编译

 (b) 编译内核中的一部分代码:

     (i) 只编译某子目录中的相关代码:

# cd  /usr/src/linux

# make  path/to/dir/

      (ii)只编译一个特定的模块

# cd  /usr/src/linux

# make  path/to/dir/file.ko

(c) 如何交叉编译:目标平台与当前编译操作所在的平台不同;

  # make  ARCH=arch_name

  要获取特定目标平台的使用帮助# make  ARCH=arch_name help

当前平台的帮助 # make   help

(3) 如何在执行过编译操作的内核源码树上做重新编译:

事先清理操作:

# make clean:清理编译生成的绝大多数文件,但会保留config,及编译外部模块所需要的文件;

# make mrproper:清理编译生成的所有文件,包括配置生成的config文件及某些备份文件;

# make distclean:相当于mrproper,额外清理各种patches以及编辑器备份文件;

为什么用到screen?

screen是为了解决当远程编译内核时候,因为时间过长远程连接断开导致编译失败。它可以打开一个新的界面保存那一刻的状态。

screen命令用法:

打开screen: ~]# screen

拆除screen: Ctrl+a, d

列出screen: ~]# screen  -ls

连接至screen: ~]# screen  -r   SCREEN_ID

关闭screen:  ~]# exit