登录
  • 人们都希望被别人需要 却往往事与愿违
  • 人们总以为自己生活的时代糟糕透顶, 总是向往过去的黄金时代。但在我们如今认为是身处黄金年代的那些人看来, 他们当时所处的世界同样是苍白无力的 @伍迪. 艾伦

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

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

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

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

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

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

前置条件

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

  1. sudo apt update
  2. sudo apt upgrade

解决依赖

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

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

准备目录

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

下载、准备内核源码

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

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

配置内核

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

使用你原来内核的 config

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

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

  1. make defconfig

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

或者干脆来一句

  1. make localmodconfig

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

  1. 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 核心的。(我这货是双核四线程)

 

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

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

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

那么,果断的敲

  1. make

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

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

那么就

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

我就 make -j4

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

 

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

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

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

安装内核和模块

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

  1. sudo make modules_install install

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

  1. 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://dmesg.app/compile-kernel.html
喜欢 (2)
分享:-)
关于作者:
If you have any further questions, feel free to contact me in English or Chinese.
发表我的评论
取消评论

                     

去你妹的实名制!

  • 昵称 (必填)
  • 邮箱 (必填,不要邮件提醒可以随便写)
  • 网址 (选填)
(11) 个小伙伴在吐槽
  1. 小土豆 >_<, 突然搜到你的博客,很喜欢,也喜欢这个打字放烟花的特效!! 用阿里云编译 linux,我在想能不能用它的弹性伸缩在编译时更快的得到结果呢,编译时动态的扩充资源,因为之前编译也被那太长的时间搞得非常头痛。
    bud2018-10-24 17:29 回复
    • 欢迎下,打字特效可以去看这里。编译之前弄成 64 核的至强,然后make -j 64,编译完了再弄成一核心的。当然是可以的了
      Benny 小土豆 2018-10-24 17:47 回复
      • 好,谢谢呀
        bud2018-10-24 17:49 回复
  2. 最近阿里云的丑闻那么多,从阿里云的镜像下载完不校验一下吗?
    lmath2017-06-13 00:05 回复
    • 这个问题不太大,如果他们真的敢在 ISO 中动手脚的话,那么就可以彻底告别开源镜像站了? 当然稳妥起见,检验下还是可以的
      Benny 小土豆 2017-06-13 08:07 回复
  3. 話說 make oldconfig 會把之前保存的 .config 給覆蓋掉的說。 還有,泥這樣編譯內核會把一大堆用不着的東西也編譯了。一般食用 make localmodconfig 生成配置文件,只選擇正在使用的選項。這樣編譯起來會快點兒(話說泥那個方法編譯,目測花了半個多小時才編譯好 233333
    2333332016-12-24 09:39 回复
    • 感谢大手子指教 /(ㄒ o ㄒ)/~~ 我一会再编辑下。那天本来想看你的 “内核裁剪” 的。不巧的是,挂了。
      Benny 小土豆 2016-12-24 09:44 回复
  4. 前两天五黄鼠写了篇关于这玩意的博客,哈哈
    音業 2016-12-16 18:04 回复
    • Hi 音業, 我就是看到他的博客才想起来 Linux 中国推送的 4.9 LTS 新闻,然后就想自己编译内核玩玩,没想到就挖到了点经验;-)
      Benny 小土豆 2016-12-16 18:06 回复
  5. 占楼
    붉은 노을2016-12-15 23:26 回复
    • 卖瓜子矿泉水火腿肠面包啦?
      Benny 小土豆 2016-12-15 23:53 回复
您直接访问了本站! 莫非您记住了我的域名. 厉害~ 我倍感荣幸啊 嘿嘿