我期待着下载一个 Linux 内核来了解如何修改它以及如何编译它。
我正在使用 Debian 发行版,并且我对 Debian 修改版 Linux 内核感兴趣,而不是普通内核形式内核.org。
经过一些研究,我发现主要有两种方法可以实现这一目的:
- 安装源码包(即apt-get安装linux-源-3.19)
- 从二进制包下载源代码(即 apt-get来源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 命令的报告)。但是,在比较来自 apt-get 的解压源时,diff 命令报告了差异安装使用来自 apt-get 的解压源来源(对于修补和未修补的代码)。
比较 apt-get 时安装与 apt-get来源:
$ 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
当比较 apt-get 时安装与 apt-get源码(+补丁):
$ 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
我发现了一些链接,其中提到了这两种方法,但我无法从中得到任何明确的信息:
https://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-common-official https://help.ubuntu.com/community/Kernel/Compile(选项 B 与替代选项 B)
如果有人能告诉我其中的差异并建议我哪个是首选,我将非常感激。谢谢。
答案1
用 Debian 术语来说,当你运行
apt-get source linux-image-3.19.0-trunk-amd64
(或等效的apt-get source linux
),您实际上正在下载并解压源码包。其中包含上游代码(从 kernel.org 下载的内核源代码)和所有 Debian 打包,包括 Debian 内核团队添加到内核的补丁。
当你跑步时
apt-get install linux-source-3.19
你实际上正在安装一个二进制包,它恰好包含应用了 Debian 补丁的 Linux 内核的源代码,但没有任何 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
运行时只是下载到当前目录中。
就文档而言,我会遵循 Debian 文档内核手册(第 4.5 节)。如您链接到的第 4.2 节中所述,重建完整的 Debian 内核需要很长时间,因为它构建了许多变体。