Debian 下编译 linux-image 与 linux-headers 的 DEB 包
2016-06-20

2018年2月2日注:其实升级 Debian 内核的最好方法,就是换用 Debian sid...省去了很多麻烦,况且 sid 在稳定性上也不算差。

最近用了几天 win10,结果被恶心到了。具体就不说了,总之就是各种各样的垃圾、各种各样的不和谐。

惹不起惹不起,我还是滚回 Linux 吧。

重新回到熟悉的 Debian+Gnome 环境,突发奇想准备升级一下内核。于是折腾了半天,把内核升级到了 4.6.2。 或许是 Debian 8 的默认内核太古老(3.x)(CentOS 6 表示不服),也可能是心理作用,感觉 4.x 运行起来的确比 3.x 快了不少,于是手贱直接把旧内核 remove 掉了,而且还加了 purge...(+_+)

但没过多长时间,就发现了问题:VirtualBox 无法启动虚拟机...查了一下 log,发现原来是 VirtualBox Kernel Modules 出了问题: VirtualBox Kernel Modules 需要通过 DKMS 使用 linux-headers,而我已经把旧版本的 linux-image 和 linux-headers 都 purge 掉了。然而通过 apt,无论用 testing 源还是 sid(unstable) 源都无法直接安装对应新版本(也就是我装的 4.6.2 版)的 linux-headers 包。

蛋碎一地...Σ(゚Д゚)

通过 Google 到的方法,也就是使用 make headers_install,DKMS 仍然报错... 没办法了,重装 Debian...

顺便发现了一个制作 Debian 安装 U 盘的好方法方法,只需两条命令即可:

$ sudo cat debian.iso > /dev/sdb

$ sudo sync

把这里的 debian.iso 换成安装镜像的名称,保证 /dev/sdb 是你的U盘

新系统装好后没多长时间,手贱又发作了,又把 Kernel 升级到了 4.6.2(我真是没救了)。不过这次吸取了上次的教训,折腾了半天,找到一种直接把 Kernel 源码编译成 linux-image 和 linux-headers 的 DEB 包的方法,使 DKMS 可以正常编译 VirtualBox Kernel Modules。这回能好好玩了

首先安装所需的工具:

$ sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc kernel-package

需要下载 1GB 左右的文件,耐心等吧。

下一步当然是去 kernel.org 下载内核源码,推荐下载最新的 stable 版,下载 .tar.xz 格式的包即可。 当然,国内连接 kernel.org 的速度不敢恭维,可以到中科大的源下载。

然后解压:

$ xz -d ***.tar.xz

$ tar -xvf ***.tar

通过上面的 xz 命令可以把 .tar.xz 解包成常见的 .tar,然后按常规方式解压即可。 之后 cd 进解压后的目录,转到 root 用户 可以按照你的需求改动内核文件。

清理一下之前编译的文件:

# make mrproper

生成 .config 文件:

# make menuconfig

设置好选项,最后选 save。

清理一下:

# make-kpkg clean

下面开始编译 deb:

# fakeroot make-kpkg --initrd --revision=4.6.2-EAimTY kernel_image kernel_headers -j2

在这句命令中: --initrd 表示创建 initrd; --revision=4.6.2-EAimTY 中的 4.6.2-EAimTY 是创建的 deb 包的版本号,可以自行修改; kernel_image 表示编译 linux-image; kernel_headers 表示编译 linux-headers,如果不需要可以去掉; -j2 表示使用两个 CPU 核心,具体视 CPU 参数而定,举个栗子:假如你用的 CPU 是最新的 Intel Xeon E5 2699 v4,也就是说有 22 个核心,就把这个参数换成 -j22(不过貌似这个参数最多支持到 -j9...) 想知道你的 CPU 有几个核心,可以使用 $ cat /proc/cpuinfo | grep "cpu cores" 查看

经过漫长的等待(我双核 i5,4G 内存的笔记本花了一个多小时),linux-image 和 linux-header 的 deb 包就会出现在上层目录中了。用 dpkg -i 安装。

重启后,通过 GRUB 高级选项中就会出现新的内核,进入后,如果有强迫症,可以卸装掉旧的内核:

$ sudo dpkg -l "linux-image*"

$ sudo dpkg -l "linux-headers*"

两条命令会分别列出已安装的 linux-image 和 linux-headers,可以用 apt 删掉。

通过以上方法安装 linux-image 和 linux-headers 后,VirtualBox 仍然可以完美运行,只需要用 DKMS 重新生成一下 VirtualBox Kernel Modules 即可。