几天前脱袜子大叔放出了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啦
free确定swap已开启sudo dd if=/dev/zero of=test bs=1M count=128
sudo chmod 600 test
sudo mkswap test
sudo swapon test
为了避免出现权限的问题,就全是用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.
Nothing will ever compare.
make -j 64
,编译完了再弄成一核心的。当然是可以的了