登录
  • 人们都希望被别人需要 却往往事与愿违
  • 最纯粹、最抽象的设计难题就是设计桥梁。你面对的问题是: 如何用最少的材料, 跨越给定的距离@保罗.格雷汉姆 (知名黑客 硅谷牛人)

[备忘录]:Linux4.9内核的正确编译之路

哎?Linux Benny小土豆 1198次浏览 2481字 8个评论
文章目录[显示]
这篇文章在 2016年12月30日22:35:30 更新了哦~

几天前脱袜子大叔放出了LTS版本的Linux Kernel 4.9,听说增加了一个新的TCP拥塞控制算法BBR,想着自己从来没有编译过内核,那就试试嘛,纯当积累经验了。

在这个过程中遇到了一些比较可怕的问题,比如说build出了300M的initrd.img,这……好吧!

我的环境是:Ubuntu 16.04 64位,主要参考教程戳我吧

下面就备忘一下我编译过程的整个经过吧

前置条件

用包管理器把你的系统升级到最新吧,另外,最好别玩跨越太大的升级啊。

sudo apt update
sudo apt upgrade

解决依赖

老生常谈了,该装的都装好吧

sudo apt install libncurses5-dev gcc make git exuberant-ctags bc libssl-dev

准备目录

通常来说我们选择在/usr/src下存放内核源码。实际上这并不是必须的。请注意,编译内核的时候并不需要root权限,安装的时候才需要。为了方便管理、patch内核、保持一致性起见,我们还是老实地用这个目录吧。从现在起就切换到root啦

下载、准备内核源码

在kernel.org下载内核,如果你的速度太慢,可以试试阿里云的源。

#官网
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.tar.xz
#阿里云
wget http://mirrors.aliyun.com/linux-kernel/v4.x/linux-4.9.tar.xz
tar xvf linux-4.9.tar.xz
cd linux-4.9

配置内核

编译内核之前,我们需要创建出来一个.config文件,由这个文件决定编译什么、编译进内核还是模块。通常来说我们有这么几种方式生成这个.config

使用你原来内核的config

cp /boot/config-`uname -r`* .config

使用默认的config(会覆盖已有的.config文件)

make defconfig

我们这里当然要使用原来的内核配置文件啦,所以来一句cp /boot/config-`uname -r`* .config即可。

或者干脆来一句

make localmodconfig

就OK了。假如我们要对内核配置进行微调,那就执行

make menuconfig

会酱紫

[备忘录]:Linux4.9内核的正确编译之路

 

 

 

 

 

 

 

 

 

 

 

是不是很神奇能在终端里画出这么漂亮的界面?ncurses啦

为了防止它没加载我们刚刚复制过来的旧内核配置文件,我们选择 Load - ok手动加载下。

之后导航到Kernel Hacking - Compile-time checks and compiler options,按N取消对Compile the kernel with debug info的勾选

剩下的一些配置就看个人需求啦,比如说我需要编译BBR并使它成为默认的TCP 拥塞算法,那就酱紫

[备忘录]:Linux4.9内核的正确编译之路

 

 

 

 

 

 

 

 

 

 

 

你需要支持XFS,就自己去开启。

全都配置完了之后,导航到save 保存。

下面我们就要准备开始编译啦!

警告
如果你是第一次编译内核,那么就按照上文所述即可。如果你已经编译过了,那么请运行
make clean 来清除编译过程中产生的可能导致编译失败的各种文件
make mrproper
不但会执行make clean的所有操作,还会删除.config文件,请谨慎使用

编译内核

在编译内核之前,建议大家想想以下几个问题:你是给自己电脑编译?还是虚拟机?还是VPS?

你电脑是啥处理器?几个核心几个线程的?

多大物理内存,有没有Swap?

如果是用的虚拟机,那么推荐在虚拟机的界面里开终端而不是通过OpenSSH服务;

如果是VPS,请一定要这样screen -S kernel然后再开始编译,否则SSH连接断开编译也就终止了。

你的内存比较小,比如说只有2G、4G,建议开个swap吧,免得内存耗尽编译失败

如果你自觉内存比较大不会耗尽,那就大胆的进行吧;

如果你不知道自己是啥CPU ,你就lscpu下,CPU(s)写了个4,那你就当成4核心的。(我这货是双核四线程)

 

总之,这些以防万一的准备工作是要做好的,因为编译内核是个比较消耗时间的事情,万一因为些小问题失败了,再重新来太糟心。

嗷对了,如果你是笔记本,请做好散热……

说了这么多,我就当你已经准备好了!

那么,果断的敲

make

编译内核吧!(make会包含make bzImage等操作,详见make help)

但是……忘记了我们上面说的双核四核吗?并行编译不好吗?

那么就

make -jX
X是一个整数,假如你是双核,2和3就是比较好的选择;4核那么4或6就会是比较好的选择。双核四线程请将其视作四核。千万不要尝试双核来个make -j10,这样你的电脑就得比狗还慢啦。

我就make -j4

该约妹子的约妹子,该睡觉的睡觉……

 

小提示:开启Swap的方法(128M的Swap为例)

sudo dd if=/dev/zero of=test bs=1M count=128
sudo chmod 600 test
sudo mkswap test
sudo swapon test

free确定swap已开启
为了避免出现权限的问题,就全是用root啦

安装内核和模块

进过了很长时间,终于编译完啦。那就安装吧,ls -lh一下就会发现vmlinuz其实很小的。

sudo make modules_install install

之后reboot体验新内核吧!
重启之后uname -a即可查看新内核哦,如果旧的内核没有留下来的必要了,那就使用类似

sudo apt remove linux-headers-版本号

等移除旧版本的内核

[备忘录]:Linux4.9内核的正确编译之路

 

服务器上的4.9

后记

Some of us get dipped in flat, some in satin, some in gloss. But every once in a while you find someone who's iridescent, and when you do, nothing will ever compare.

Nothing will ever compare. :oops: 


文章版权归原作者所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://www.bennythink.com/compile-kernel.html
喜欢 (0)
分享:-)
Benny小土豆
关于作者:

If you have any further questions, feel free to contact me in English or Chinese.

发表我的评论
取消评论

表情 代码 加粗 删除线 居中 斜体 链接 换行 签到

去你妹的实名制!

  • 昵称 (必填)
  • 邮箱 (必填,不要邮件提醒可以随便写)
  • 网址 (选填)
(8)个小伙伴在吐槽
  1. 最近阿里云的丑闻那么多,从阿里云的镜像下载完不校验一下吗?
    lmath2017-06-13 00:05 回复
    • Benny小土豆
      这个问题不太大,如果他们真的敢在ISO中动手脚的话,那么就可以彻底告别开源镜像站了🤓当然稳妥起见,检验下还是可以的
      Benny小土豆2017-06-13 08:07 回复
  2. 話說make oldconfig會把之前保存的 .config 給覆蓋掉的說。 還有,泥這樣編譯內核會把一大堆用不着的東西也編譯了。一般食用make localmodconfig生成配置文件,只選擇正在使用的選項。這樣編譯起來會快點兒(話說泥那個方法編譯,目測花了半個多小時才編譯好233333
    2333332016-12-24 09:39 回复
    • Benny小土豆
      感谢大手子指教/(ㄒoㄒ)/~~我一会再编辑下。那天本来想看你的“内核裁剪”的。不巧的是,挂了。
      Benny小土豆2016-12-24 09:44 回复
  3. 前两天五黄鼠写了篇关于这玩意的博客,哈哈
    音業2016-12-16 18:04 回复
    • Benny小土豆
      Hi 音業, 我就是看到他的博客才想起来Linux中国推送的4.9 LTS新闻,然后就想自己编译内核玩玩,没想到就挖到了点经验;-)
      Benny小土豆2016-12-16 18:06 回复
  4. 占楼
    붉은 노을2016-12-15 23:26 回复
    • Benny小土豆
      卖瓜子矿泉水火腿肠面包啦🍞
      Benny小土豆2016-12-15 23:53 回复