Linux内核编译

在Linux的发行版上如果要及时体验最新的Linux内核,你必须亲自动手去 下载 编译内核,不然就只有等Ubuntu或者Fedora等官网猴年马月地版本迭代更新。

安装依赖

保证安装libncurses5-dev,不然可能报缺少curse.h的错误。还有libssl-dev,如果缺少这个依赖则会报openssl/opensslv.h缺失的错误。

1
[root@linux]$:sudo apt install libncurses5-dev libssl-dev

配置编译信息

下载Linux内核源码包,解压

1
[root@linux]$: sudo tar -xzvf linux-xxx.tar.gz

配置内核信息

1
2
[root@linux]$: sudo make menuconfig
[root@linux]$: sudo make localyesconfig

一些配置信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
* General setup
- Local version - append to kernel release ,可添加本地版本信息
- [ ]Configure standard kernel features (for small systems),特殊内核用到,可以不选,嵌入式linux则必选。
* Enable loadable module support
- [ ]Module versioning suppor,这个功能可以让你使用其它版本的内核模块,除非特殊需要,一般不选。
- [ ]Source checksum for all modules,这个功能是为了防止更改了内核模块的代码但忘记更改版本号而造成版本冲突,现在很少使用,不选。
* Enable the block layer 保持默认
* Networking support
- < > NFC subsystem support ---- NFC通信暂时没必要选
* 其它默认

注意:如果懒得折腾,完全没有必要一一修改,保持默认就行。也可使用make localmodconfig根据当前机器运行中加载的模块定制生成配置文件,然后使用这个配置文件编译内核。
不过,最好的办法直接去/usr/src/linux-xx路径下找到原来的.config文件(推荐),然后使用make oldconfig命令,只根据需要选择是否加入一些新版内核带来的特性。

关于版本信息

在{源码}/scripts/mkcompile_h文件里可修改版本信息,然后再运行make bzImage,其相关信息放在{源码}/include/generated/compile.h里。
如修改UTS_VERSION。

开始编译

剩下的就简单了,按部就班的一一执行吧,具体编译时间视电脑配置而异,编译模块耗时最长,我的电脑要好几个小时(make modules后最好忙别的去吧:-)

  • sudo make bzImage -jN , N为CPU核心数*2,即使用N个线程并行编译
  • sudo make modules, 编译模块,耗时最长,生成的文件占用空间也最大
  • sudo make modules_install,先开始安装模块
  • sudo make install, 然后开始安装内核
  • make headers_install ARCH=i386 INSTALL_HDR_PATH=/usr/include,最后可以选择更新头文件

ARCH为架构,如arm,i386等等。我这儿是32位就填入i386。INSTALL_HDR_PATH指定安装头文件的路径。