问题描述
我有兴趣在Ubuntu 12.04 x86 64位下编译新内核。
我发现this wiki page基本上是this blog的镜像,并且有很多步骤(git等)对我来说似乎没用。
使用早期的发行版/发行版,我曾经创建了一个.config
文件并在需要时修改了Makefile
,然后运行make
就完成了。
在Ubuntu下有一个简单的方法吗?
最佳解决方法
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
粗体差异包括所有Ubuntu /Debian自定义。
2.要使用您自己的.config
构建库存内核,请使用”old-fashioned” Debian make-kpkg
方法
这是wiki中描述的alternate old-fashioned way:
sudo apt-get install kernel-package
如果您是第一次编译内核:
sudo apt-get build-dep linux-image-$(uname -r)
然后将cd
放入源目录(此处为linux-3.2.0
),并运行make oldconfig
以使用正在运行的内核配置创建.config
文件,或将third-part .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
是用于标识此版本的自定义字符串。
完成后,内核映像和头文件将作为父目录中的deb准备好;您可以使用sudo dpkg -i
安装它们,它还将负责添加GRUB条目等。
次佳解决方法
这是步骤。此程序基于nixCraft的How to: Compile Linux kernel 2.6 – 但现代化程度很高。
下载并解压缩您要构建的内核的源代码。
您可以在kernel.org获取upstream内核源代码。版本3.16.1(撰写本文时的最新稳定内核)将在此处使用。因此,如果您使用的是其他版本,则可能需要修改这些命令。
目前提供内核源代码。 tar。 xz归档,所以无论你想要什么版本点击”tar.xz”链接:
在cd
到您下载存档的目录后,您可以使用tar
提取它:
tar xf linux-3.16.1.tar.xz
安装必要的构建工具并执行内核配置。
要获得Ubuntu的toolchain(gcc
,make
等),请安装build-essential元数据包:
sudo apt-get update
sudo apt-get install build-essential
make
目标xconfig
和menuconfig
提供了两种合理的user-friendly配置内核的方法。
xconfig
运行图形配置实用程序,而menuconfig
是text-based(即,其界面完全显示在您的终端内)。每个都需要一些build-essential不提供的附加软件。
要以图形方式配置,请安装libqt4-dev和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或您使用的任何其他boot loader解压缩并加载到内存中。
make modules
安装新构建的内核。
假设这些make
命令成功完成,则需要安装新内核。首先安装模块:
sudo make modules_install
然后安装内核本身:
sudo make install
这将vmlinuz-3.16.1(vmlinuz的副本),config-3.16.1(存储内核配置参数的文本文件)和/boot中的System.map-3.16.1(kernel symbol lookup table)放在一起。有关更多详细信息,请参阅this comp.os.linux.misc post by Hadron和man installkernel。
最终设置,因此可以启动内核并启动系统:
本节部分基于Kernel/Compile中的信息。
现在内核需要它,它需要:
-
boot loader配置中的条目,因此您可以选择并从中启动。
-
一个initial RAM filesystem,内核从中加载驱动程序并安装
/
文件系统的环境。 (如果您正在安装旧内核或已配置内核to use devfs instead of the newer udev,则可能需要或希望设置initial ramdisk。如果您知道需要,请参阅man initrd
。)
使用mkinitramfs
生成initramfs:
cd /boot
sudo mkinitramfs -ko initrd.img-3.16.1 3.16.1
更新GRUB2引导加载程序的配置时 – 自9.10– should automatically detect the new kernel以来一直是the default in Ubuntu并添加一个从中引导的选项。
sudo update-grub
试试你的内核。
现在您可以重新启动以测试新内核。您可能需要在引导期间按住Shift
或按Esc
以查看GRUB引导菜单,您可以在其中选择已安装的不同内核。
要使您的内核(或其他内核)成为默认值,请参阅我如何更改GRUB引导顺序?
第三种解决方法
可以在此处找到构建Ubuntu内核(而不是vanilla)的快速说明:https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel。
我不会复制整个wiki,但是我将列出编译当前安装的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
参考资料