获取内核源代码:apt-get install 与 apt-get 源代码

poi*_*inu 6 linux source kernel debian apt

我期待着下载一个 Linux 内核来了解如何修改它以及如何编译它。

我正在使用 Debian 发行版,并且我对 Debian 修改的 Linux 内核感兴趣,而不是对 vanilla 内核形式kernel.org感兴趣。

做了一些研究,我发现主要有两种方法可以达到这个目的:

  • 安装源码包(即apt-get install linux-source-3.19)
  • 从二进制包下载源码(即apt-get source linux-image-3.19.0-trunk-amd64)

第一个选项将下载源 tarball 到 /usr/src/linux-source-3.19.tar.xz 中,后者将下载源 tarball (linux_3.19.1.orig.tar.xz),一个补丁 (linux_3.19.1- 1~exp1.debian.tar.xz)和一个描述文件(linux_3.19.1-1~exp1.dsc)。后者还将解压缩所有内容并将其解压缩到“linux-3.19.1”目录中。

起初我认为这两个版本会产生相同的代码,因为它们具有相同的内核版本和补丁级别(基于 apt-cache 命令的报告)。但是,diff 命令在比较来自 apt-get install的解压源与来自 apt-get的解压(对于打补丁和未打补丁的代码)时会报告差异。

将 apt-get install与 apt-get source 进行比较时

$ diff -rq apt-get-install/ apt-get-source/ | wc -l
253

$ diff -rq apt-get-install/ apt-get-source/ | grep "Only in"
Only in apt-get-install/arch/arm/boot/dts: sun7i-a20-bananapro.dts
Only in apt-get-install/arch/s390/include/asm: cmb.h.1
Only in apt-get-install/drivers/dma-buf: reservation.c.1
Only in apt-get-install/drivers/dma-buf: seqno-fence.c.1
Only in apt-get-install/drivers/gpu/drm/i915: i915_irq.c.1
Only in apt-get-install/drivers/scsi: constants.c.1
Only in apt-get-install/drivers/usb/gadget/function: f_acm.c.1
Only in apt-get-install/drivers/usb/gadget/function: f_ecm.c.1
Only in apt-get-install/drivers/usb/gadget/function: f_obex.c.1
Only in apt-get-install/drivers/usb/gadget/function: f_serial.c.1
Only in apt-get-install/drivers/usb/gadget/function: f_subset.c.1
Only in apt-get-install/include/linux: reservation.h.1
Only in apt-get-install/kernel: sys.c.1
Only in apt-get-install/lib: crc32.c.1
Only in apt-get-install/sound/soc: soc-cache.c.1
Run Code Online (Sandbox Code Playgroud)

将 apt-get install与 apt-get source (+ patch) 进行比较时

$ diff -rq apt-get-install/ apt-get-source+patch/
Only in apt-get-install/arch/s390/include/asm: cmb.h.1
Only in apt-get-source+patch/: debian
Only in apt-get-install/drivers/dma-buf: reservation.c.1
Only in apt-get-install/drivers/dma-buf: seqno-fence.c.1
Only in apt-get-install/drivers/gpu/drm/i915: i915_irq.c.1
Only in apt-get-install/drivers/scsi: constants.c.1
Only in apt-get-install/drivers/usb/gadget/function: f_acm.c.1
Only in apt-get-install/drivers/usb/gadget/function: f_ecm.c.1
Only in apt-get-install/drivers/usb/gadget/function: f_obex.c.1
Only in apt-get-install/drivers/usb/gadget/function: f_serial.c.1
Only in apt-get-install/drivers/usb/gadget/function: f_subset.c.1
Only in apt-get-install/include/linux: reservation.h.1
Only in apt-get-install/kernel: sys.c.1
Only in apt-get-install/lib: crc32.c.1
Only in apt-get-source+patch/: .pc
Only in apt-get-install/sound/soc: soc-cache.c.1
Run Code Online (Sandbox Code Playgroud)

我找到了一些提到这两种方法的链接,但我无法从这些链接中得到任何信息:

https://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-common-official https://help.ubuntu.com/community/Kernel/Compile(选项 B 与替代选项 B)

如果有人能告诉我差异并告诉我哪个是首选,我将不胜感激。谢谢你。

Ste*_*itt 8

在 Debian 术语中,当您运行

apt-get source linux-image-3.19.0-trunk-amd64
Run Code Online (Sandbox Code Playgroud)

(或等价物apt-get source linux),您实际上是在下载和解压源包。这包含上游代码(从 kernel.org 下载的内核源代码)和所有 Debian 包,包括由 Debian 内核团队添加到内核的补丁。

当你跑

apt-get install linux-source-3.19
Run Code Online (Sandbox Code Playgroud)

你实际上是在安装一个二进制包,它恰好包含 Linux 内核的源代码,应用了 Debian 补丁,但没有任何 Debian 打包基础设施。

源包的名称只是linux; apt-get source将把它给定的任何二进制包名转换成相应的源包名。

顺便说一下,由于experimental软件包不会自动升级,您应该确保linux-source-3.19在比较之前更新并重新提取了它的副本;.dts您在您的文件中看到的文件diff是在最新更新中引入的。当前存档中的包都包含此文件。

剩下的差异就很正常了:如评论中所指出的,debian包含所有的包并且仅在源包中,.pc用于quilt跟踪补丁修改的原始文件,并且也仅在源包中,并且这些.1文件是生成的联机帮助页,可能是内核构建的副作用,因此只出现在二进制包中(但它们不应该真的存在)。

参考包是源码包,通过apt-get source. 这将构建所有内核二进制包,包括linux-source-3.19您使用apt-get install. 后者是为了方便其他可能需要内核源的软件包;保证一直在同一个地方,不像源码包在apt-get source运行的时候刚下载到当前目录下。

就文档而言,我会遵循内核手册(第 4.5 节)中的 Debian 文档。如第 4.2 节所述,重建完整的 Debian 内核需要很长时间,因为它构建了许多变体。