彼岸船夫

我是一只菜鸟,在繁华城市独自飞翔,为生活有时候很迷茫,苦苦坚持在无烟沙场,期待渡船远方

Linux内核编译

内核可以简单理解为一个程序,只不过是直接在硬件上运行,编译内核根编译程序过程基本一致。为什么要编译内核?比如说新的内核提供了对新的文件系统格式的支持,或者提供了新的硬件驱动。下载内核源码中包含各种各样功能的源码,但并不是所有功能我们都需要,为了精简内核或者当前内核无法驱动现有硬件设备,所以编译前选择我们需要的功能选项(像硬盘驱动,硬盘接口有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以及编辑器备份文件

posted on 2017-04-09 11:55  彼岸船夫  阅读(222)  评论(0编辑  收藏  举报

导航