重新编译内核有什么简单的方法?

我对在Ubuntu 12.04 x86 64位系统下编译新内核很感兴趣。

我找到了这个维基页面,基本上是这个博客的一个镜像,里面有很多步骤(git等),对我来说似乎是多余的。

在之前的版本/发行版中,我通常会创建一个.config文件,并修改一个Makefile,然后只需运行make就可以完成了。

在Ubuntu下有没有简单的方法来做到这一点呢?


1值得一看:https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel - Colin Ian King
看起来今天构建的正确方法是使用标签从git检出,然后运行fakeroot debian/rules ...命令。请参阅@Pilot6在链接问题中的回答。或者我漏掉了什么吗? - minghua
为什么标题是关于重新编译内核的? - Roi
4个回答

1. 使用apt-get source命令下载Ubuntu内核的版本。
apt-get source linux-image-$(uname -r)

给出一个包含以下内容的文件夹,例如: linux-3.2.0 linux_3.2.0-26.41.dsc linux_3.2.0-26.41.diff.gz linux_3.2.0.orig.tar.gz
粗体的diff文件包含了所有Ubuntu/Debian的定制内容。
2. 如果要使用自己的.config构建原始内核,请使用“老式”的Debian make-kpkg方法。
这是在维基中描述的另一种老式方式
sudo apt-get install kernel-package

如果您是第一次编译内核:
sudo apt-get build-dep linux-image-$(uname -r)

然后进入源目录(这里是linux-3.2.0),并运行make oldconfig命令来创建一个包含当前内核配置的.config文件,或者将第三方的.config文件复制到该目录中。
根据您想要的是文本还是图形配置,安装相应的软件:
(文本)
sudo apt-get install libncurses5 libncurses5-dev

(图形)
sudo apt-get install qt3-dev-tools libqt3-mt-dev

然后运行:

(文本)

make menuconfig

(图形)
make xconfig

完成后,只需运行:
fakeroot make-kpkg -j N --initrd --append-to-version=my-very-own-kernel kernel-image kernel-headers

其中N是并行运行的作业数量(通常是您拥有的CPU数量),而my-very-own-kernel是用于标识此构建的自定义字符串。

完成后,内核映像和头文件将准备好作为debs文件在父目录中;您可以使用sudo dpkg -i安装它们,这也会处理添加GRUB条目等操作。


为什么他们对这个差异一无所知,对我来说,一个差异就是一个差异,它可以包含一切。 - user827992
我不知道,你得问他们(谷歌的Canonical Kernel Team)。我只告诉了你如何构建它 ;) - ish
1好的,最后一个问题,如何应用这个压缩的差异文件呢?😄 我需要进入linux-3.2.0目录并运行patch -p1 <../patch.diff是吗? - user827992
2不需要应用diff;apt-get source ...已经为您做了这个! - ish
对不起,但是我对内核编译还不熟悉:当你说“然后进入源代码目录(这里是linux-3.2.0)”时,那个目录应该在哪里?对于这个例子,应该是/usr/src/linux-headers-3.2.0吗? - Sopalajo de Arrierez
有帮助的回答。唯一遗憾的是我错过了make nconfig - Ray
1这似乎不再起作用,如果不使用fakeroot调用make-kpkg。在“安装”deb时出现错误。正在编辑答案... - tudor -Reinstate Monica-
2你称之为“老式”,我称之为过时。fakeroot debian/rules editconfigsfakeroot debian/rules cleanfakeroot debian/rules binary是正确、无问题的方法。 - Aleksandr Dubinsky
这在Ubuntu 18.04+上不再适用。请尝试使用apt-get source linux-source,然后按照克隆git仓库的说明进行操作。 - rustyx
@rustyx也不起作用,我得到的是:“您必须在您的sources.list中添加一些'deb-src' URIs”。 - Nulik

这里是步骤。这个过程基于nixCraft如何:编译Linux内核2.6,但进行了大量现代化改进。

下载并提取您希望构建的内核的源代码。

您可以在kernel.org获取上游内核源代码。在撰写本文时,使用的是版本3.16.1(最新稳定内核)。因此,如果您使用不同版本,可能需要修改这些命令。

内核源代码目前以 .tar.xz 归档文件形式提供,因此请点击您所需版本的 "tar.xz" 链接:

screenshot from kernel.org, showing kernel source archives available for download

在你下载的存档所在目录中,使用cd命令切换到该目录,然后可以使用tar命令解压缩它。
tar xf linux-3.16.1.tar.xz

安装必要的构建工具并进行内核配置。

为了获取Ubuntu的工具链gccmake等),请安装build-essential 安装build-essential元包:

sudo apt-get update
sudo apt-get install build-essential

有两种相对用户友好的方法可以配置内核,它们是通过make目标xconfigmenuconfig提供的。

xconfig运行一个图形化配置工具,而menuconfig是基于文本的(即其界面完全出现在终端中)。每个都需要一些额外的软件,这些软件不是由build-essential Install build-essential提供。

要进行图形化配置,请安装libqt4-dev Install libqt4-devpkg-config Install pkg-config,然后运行make xconfig

sudo apt-get install libqt4-dev pkg-config
make xconfig

在终端中进行配置,安装libncurses5-dev(感谢Hannu提供的信息),然后运行make menuconfig命令。
sudo apt-get install libncurses5-dev
make menuconfig

构建配置的内核。

首先运行以下命令编译内核并创建vmlinuz

make

vmlinuz 是指“内核”。具体而言,它是将由GRUB或你所使用的任何其他引导加载器解压缩和载入到内存中的内核映像。

然后构建可加载内核模块

make modules

安装您新构建的内核。

假设那些make命令成功完成,现在是时候安装新内核了。首先安装模块:

sudo make modules_install

然后安装内核本身:
sudo make install

这将把vmlinuz-3.16.1vmlinuz的副本)、config-3.16.1(存储内核配置参数的文本文件)和System.map-3.16.1内核符号查找表)放在/boot中。有关更多详细信息,请参见Hadron在comp.os.linux.misc上发布的帖子man installkernel

最终设置,以便启动内核并引导系统:

本节部分基于Kernel/Compile中的信息。

现在内核已经到达需要的位置,它需要:

使用mkinitramfs生成您的initramfs:
cd /boot
sudo mkinitramfs -ko initrd.img-3.16.1 3.16.1

当您更新GRUB2引导加载程序的配置时--自9.10版起已成为Ubuntu默认配置--它应该自动检测到新内核并添加一个从中引导的选项。
sudo update-grub

试试你的内核。

现在你可以重新启动来测试你的新内核。在启动过程中,你可能需要按住Shift键或者按下Esc键,以便看到GRUB引导菜单,你可以在其中选择安装的不同内核。

要将你的内核(或其他内核)设置为默认内核,请参阅如何更改GRUB引导顺序?


1第三步,make menuconfig需要先执行apt get install libncurses5-dev命令。 - Hannu
@Hannu 谢谢,我刚刚完全忘了提到这一点。64位系统的用户可能还需要安装“ia32-libs”来支持运行32位程序。 - Novice
找一个与版本无关的软件包可能会更好...虽然我不确定是否有这样的软件包。 - Hannu
@EliahKagan 谢谢。现在可以了吗,还是我应该完全删除它?我没有任何问题这样做。 - Novice
@新手 你减少了从源文本中复制的材料,这很有帮助。但是仍然有一些复制的文本与你自己的文本混合在一起,并且在其他方面非常相似。当主要依赖于一个来源时,最好创作出受其启发或教育的作品,而不是它的一个版本。你应该理解为什么你所说的是正确的,避免一些源文本的缺点,并创作出适合你的受众(在这里是Ubuntu用户)的内容。我认为我们会从一个“传统”的内核编译指南中受益,所以我试图进一步改进这个。如果你愿意,可以继续编辑。 - Eliah Kagan
@EliahKagan 非常感谢你,下次我会注意的。 - Novice
2这不会生成Ubuntu内核。它甚至不会生成.deb文件。这是一个问题的源头。 - Aleksandr Dubinsky
这不是我第一次回到这个答案了。对我的Ubuntu Odroids非常有用,谢谢你。 - Xunnamius
抱歉,我本来以为已经添加了这个链接(对于odroids很有用):https://wiki.odroid.com/odroid-xu4/software/building_kernel - Xunnamius

快速构建Ubuntu内核的简要说明(而非原始版本)可以在此处找到:https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel
我不会复制整个维基页面,但是我将列出编译当前已安装的Ubuntu内核版本的最小步骤。(要获取最新版本,请克隆即将发布的Ubuntu内核git存储库。)在Ubuntu 16.04上经过测试。
# Get source code
apt-get source linux-image-$(uname -r)

# Install dependencies
sudo apt-get build-dep linux-image-$(uname -r)

# Compile
cd linux-4.4.0
fakeroot debian/rules clean
fakeroot debian/rules binary

# Install (obviously the versions will be different)
cd ..
sudo dpkg -i linux-image-4.4.0-38-generic_4.4.0-38.57_amd64.deb linux-headers-4.4.0-38_4.4.0-38.57_all.deb linux-headers-4.4.0-38-generic_4.4.0-38.57_amd64.deb

Ubuntu git内核仓库

根据https://help.ubuntu.com/community/Kernel/Compile的想法,并更清楚地解释为什么我认为配置看起来正确,可以在Where can I get the 11.04 kernel .config file?找到更多信息:

git clone git://kernel.ubuntu.com/ubuntu/ubuntu-bionic.git linux
cd linux
git checkout Ubuntu-4.15.0-36.39
fakeroot debian/rules clean
debian/rules updateconfigs
fakeroot debian/rules build-generic
cp debian/build/build-generic/.config .
make -j `nproc`

在Ubuntu 18.04中进行了测试。