几天前脱袜子大叔放出了 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
会酱紫
是不是很神奇能在终端里画出这么漂亮的界面?ncurses 啦
为了防止它没加载我们刚刚复制过来的旧内核配置文件,我们选择 Load - ok 手动加载下。
之后导航到 Kernel Hacking - Compile-time checks and compiler options,按 N 取消对 Compile the kernel with debug info 的勾选
剩下的一些配置就看个人需求啦,比如说我需要编译 BBR 并使它成为默认的 TCP 拥塞算法,那就酱紫
你需要支持 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
我就 make -j4 啦
- 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-版本号
等移除旧版本的内核
后记
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.
make -j 64
,编译完了再弄成一核心的。当然是可以的了