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

use*_*992 49 compiling kernel

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

我发现这个 wiki 页面基本上是这个博客的镜像,并且有很多步骤(git等)对我来说毫无用处。

在早期版本/发行版中,我曾经创建一个.config文件并Makefile根据需要修改一个文件,然后运行即可make完成。

在 Ubuntu 下有没有一种简单的方法可以做到这一点?

ish*_*ish 41

1.apt-get source用于下载Ubuntu版本的内核

apt-get source linux-image-$(uname -r)
Run Code Online (Sandbox Code Playgroud)

给出一个文件夹,例如:

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

粗体差异包括所有 Ubuntu/Debian 自定义。

2. 要使用您自己的内核构建库存内核,请.config使用“老式”Debianmake-kpkg方法

这是维基中描述的另一种老式方法

sudo apt-get install kernel-package
Run Code Online (Sandbox Code Playgroud)

如果您是第一次编译内核:

sudo apt-get build-dep linux-image-$(uname -r)
Run Code Online (Sandbox Code Playgroud)

然后cd进入源目录(此处为linux-3.2.0),然后运行make oldconfig.config使用正在运行的内核的配置创建文件,或者将第三方复制.config到此目录。

根据您想要文本还是图形配置,安装:

(文本)

sudo apt-get install libncurses5 libncurses5-dev
Run Code Online (Sandbox Code Playgroud)

(图形)

sudo apt-get install qt3-dev-tools libqt3-mt-dev
Run Code Online (Sandbox Code Playgroud)

然后运行:

(文本)

make menuconfig
Run Code Online (Sandbox Code Playgroud)

(图形)

make xconfig
Run Code Online (Sandbox Code Playgroud)

完成后,只需运行:

fakeroot make-kpkg -j N --initrd --append-to-version=my-very-own-kernel kernel-image kernel-headers
Run Code Online (Sandbox Code Playgroud)

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

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

  • **没有必要**应用差异;`apt-get source ...` 已经为你做到了! (2认同)
  • -1 你说它“过时”,我说它过时了。`fakeroot debian/rules editconfigs`、`fakeroot debian/rules clean`、`fakeroot debian/rules binary` 是正确的、没有问题的方法。 (2认同)

Nov*_*ice 21

以下是步骤。此过程基于nixCraftHow to: Compile Linux kernel 2.6 -- 但相当现代化。

下载并解压缩您要构建的内核的源代码。

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

内核源代码目前以 . 焦油xz档案,所以点击你想要的任何版本的“tar.xz”链接:

来自 kernel.org 的屏幕截图,显示了可供下载的内核源档案

进入cd下载存档的目录后,您可以使用tar以下命令将其解压缩:

tar xf linux-3.16.1.tar.xz
Run Code Online (Sandbox Code Playgroud)

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

要获得 Ubuntu 的工具链gcc、、make等等),请安装build-essential安装 build-essential 元包:

sudo apt-get update
sudo apt-get install build-essential
Run Code Online (Sandbox Code Playgroud)

两个合理人性化的方式来配置什么进入你的内核是由提供make目标xconfigmenuconfig

xconfig运行图形配置实用程序,而menuconfig基于文本(即,其界面完全显示在您的终端中)。每个都需要一些由build-essential提供的额外软件安装 build-essential.

要以图形方式配置,请安装libqt4-dev安装 libqt4-devpkg-config安装 pkg-config并运行make xconfig

sudo apt-get install libqt4-dev pkg-config
make xconfig
Run Code Online (Sandbox Code Playgroud)

要在终端中进行配置,请安装libncurses5-dev(感谢Hannu提供此信息)并运行make menuconfig

sudo apt-get install libncurses5-dev
make menuconfig
Run Code Online (Sandbox Code Playgroud)

构建配置的内核。

首先运行它来编译内核并创建vmlinuz

make
Run Code Online (Sandbox Code Playgroud)

vmlinuz是“内核”。具体来说,内核映像将被GRUB或您使用的任何其他引导加载程序解压缩并加载到内存中。

然后构建可加载的内核模块

make modules
Run Code Online (Sandbox Code Playgroud)

安装新构建的内核。

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

sudo make modules_install
Run Code Online (Sandbox Code Playgroud)

然后安装内核本身:

sudo make install
Run Code Online (Sandbox Code Playgroud)

vmlinuz-3.16.1(的副本vmlinuz)、config-3.16.1(存储内核配置参数的文本文件)和System.map-3.16.1内核符号查找表)放入/boot. 有关更多详细信息,请参阅Hadronman installkernel.

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

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

有了现在需要的内核,它需要:

生成您的initramfsmkinitramfs

cd /boot
sudo mkinitramfs -ko initrd.img-3.16.1 3.16.1
Run Code Online (Sandbox Code Playgroud)

当您更新 GRUB2 引导加载程序的配置时(自 9.10 以来一直是 Ubuntu 中的默认设置)应自动检测新内核并添加一个选项以从中引导。

sudo update-grub
Run Code Online (Sandbox Code Playgroud)

试试你的内核。

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

要使您的内核(或其他内核)成为默认内核,请参阅如何更改 GRUB 引导顺序?

  • -1 这不会产生 _Ubuntu_ 内核。它甚至不生成 .deb 文件。这是解决问题的秘诀。 (2认同)