如何构建主线内核源代码包?

Ubuntu内核PPA只提供linux-headers*.deb和linux-image*.deb软件包。我该如何构建相应的linux-source*.deb软件包?

背景:

我目前正在运行Ubuntu 11.10,使用主线内核(3.2 rc6现在),以获得对我的sandybridge IGP(Dell E6420笔记本电脑,搭载intel i5-2520M CPU)更好的支持。

看起来,我想安装这个触摸板驱动程序,因为ALPS触摸板的支持很差(请参阅上述链接的错误报告),同时等待内核版本3.3中的上游支持

问题是,DKMS一直抱怨找不到完整的内核源代码:

Module build for the currently running kernel was skipped since the
kernel source for this kernel does not seem to be installed.

看起来我可能不需要完整的源代码,但我仍然想尝试安装它,看看是否能解决我的问题。 我尝试过的:/usr/src/中解压kernel.org源代码存档。但是DKMS依然报错。 手动使用uupdate和主线源代码包更新内核源代码包,像这里所解释的。但没有成功。 按照@roadmr和@elmicha的指示手动构建linux-source包。最终我成功构建了它,但DKMS仍然抱怨缺少源代码。 最后我注意到了一个错误,在重新安装内核头文件时我没有注意到。似乎我下载的.deb文件可能已损坏,重新下载解决了问题 :) 遗憾的是,虽然DKMS同意编译模块,但我遇到了下面的错误,似乎已经有人报告过。这个问题还没有解决,但我不会再尝试了,因为最后我决定通过xorg-edgers ppa来测试确切的内核版本3.2-rc6,它似乎已经正确修补:它工作了。
然而,了解如何构建主线Linux源代码包可能仍然具有一定的兴趣,因为Ubuntu内核团队并未提供此功能。更不用说在这个过程中我学到了很多东西^^

有主线内核源代码包存储库吗?没有。你从搜索“kernel mainline ppa”得到的结果就是你所能获得的。 - Uri Herrera
请注意,Ubuntu 上的主线内核是使用较旧的工具链构建的,这意味着您使用 DKMS 构建的任何内核模块在会话中无法卸载,并将显示为 "/proc/modules" 中的 "module-name [permanent]"。 - Lekensteyn
6个回答

看起来你很勇敢 :) 你可以尝试按照这些说明创建自己的 .deb 包,从 mainline 内核开始。

先阅读这份通用文档:

https://help.ubuntu.com/community/Kernel/Compile

以下是关于如何为11.10编译内核的具体说明(尽管您将从3.2源代码树进行操作,因此可能会有一些不同之处)。

http://blog.avirtualhome.com/2011/10/28/how-to-compile-a-new-ubuntu-11-10-oneiric-kernel/

现在,这些说明的问题是它们假设有一个带有debian/目录的源代码树,其中包含让您构建软件包的控制文件。不过这并不是个大问题;很容易获得一个可打包的源代码树:
  1. 获取主线内核树

    git clone https://github.com/torvalds/linux.git
    
  2. 查看最新的主线内核(截至今天 http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.2-rc6-precise/)。有三个补丁文件(0001-base-packaging.patch,0002-debian-changelog.patch,0003-default-configs.patch)。下载这三个文件。

  3. 切换到您的全新 Linux 源代码目录,并按顺序应用所有 3 个补丁:

    patch -p1 <0001-base-packaging.patch
    
    patch -p1 <0002-debian-changelog.patch
    
    patch -p1 <0003-default-configs.patch
    
现在你将拥有一个带有打包信息的漂亮的debian/目录。然后,你可以按照我上面提到的两个URL中的说明来配置和构建内核包。希望这也能创建一个内核源代码包。

我试了一下,遇到了一个非常类似的错误:http://askubuntu.com/q/27963/7567 但是在不应用补丁的情况下,我成功构建了linux-source软件包。不太清楚这样做有什么变化...另外,不要花太多时间在这上面,因为对我来说现在更多是出于教育兴趣,因为在解决我的初始问题的过程中我已经成功了 :) 谢谢! - Maxime R.
在更现代的内核上,我在这里找到了我需要的信息: https://wiki.ubuntu.com/KernelTeam/GitKernelBuild 简而言之,您可以解压缩一个原始内核,将 .config 文件放置在内核源代码目录中(如果您想要一个类似于现有内核的配置,可以从/boot/config-xxxx文件中获取),使用"make oldconfig"命令更新配置,使用"make menuconfig"命令进行任何更改,然后使用"make -j4 deb pkg LOCALVERSION=-custom"命令,它将为您构建一些 .deb 文件,包括源代码和可安装的 .deb 包。 - undefined

应该可以构建上游内核源代码。如果您已经解压到 /usr/src/linux-X.Y:
cd /usr/src/linux-X.Y
# copy the configuration of the running kernel:
cp /boot/config-$(uname -r) .config
make oldconfig
fakeroot make-kpkg --initrd --append-to-version=-custom kernel-image kernel-headers
cd ..
ls -lrt *-custom*deb
# only install the latest *-custom*deb here:
sudo dpkg -i *-custom*deb

我经常使用它,虽然我安装了一些DKMS包,但它们没有抱怨。


请指定kernel-source目标以获取linux-source*.deb文件。 - Maxime R.

你可以从kernel.org下载源代码。 ppa中的主线内核未打补丁。
根据定义,主线内核构建是基于原始未修改的主线内核源代码进行的,因此不应包含任何Ubuntu的补丁或驱动程序。 Ubuntu wiki MainlineBuilds

我知道这一点,但kernel.org提供的是一个压缩的存档文件,而我想知道是否有一个已经打包好的.deb文件。这样就可以避免我手动安装/重新安装/删除我的设置中的东西的麻烦。 - Maxime R.
1我找不到一个。我建议你给内核团队发邮件,问他们是否愿意提供一个.deb文件。 - Panther
好主意,我在IRC上询问了信息,如果有任何更新,我会发布的。 - Maxime R.

要为Ubuntu编译主线内核,您可以按照我在下面的博客中发布的说明进行操作: 为Ubuntu编译主线Linux内核:一篇详细的、逐步的文章,介绍了如何为Ubuntu(Precise)编译和安装自己的主线内核版本(v3.3)。 在Ubuntu上使用Linux内核3.6:一篇详细的、逐步的文章,介绍了如何为Ubuntu编译和安装自己的主线3.6内核版本。它依赖于上述文章中的步骤。


我通过运行以下命令解决了这个问题:
sudo apt-get install linux-headers-3.5.0-17-generic

当然,你得使用虚拟机安装程序所寻找的内核版本进行替换。

1请检查您的答案,如果需要可以进行研究,但在给出答案时要准确无误。 - Ringtail