獲取核心原始碼:apt-get install vs apt-get source
我期待著下載一個 Linux Kernel 來了解如何修改它以及如何編譯它。
我正在使用 Debian 發行版,我對 Debian 修改的 Linux 核心感興趣,而不是對原版核心形式kernel.org感興趣。
做了一些研究,我發現主要有兩種方法可以實現這一目的:
- 安裝源碼包(即apt-get install linux-source-3.19)
- 從二進制包下載源碼(即apt-get source linux-image-3.19.0-trunk-amd64)
第一個選項將下載原始碼壓縮包到 /usr/src/linux-source-3.19.tar.xz,後者將下載原始碼壓縮包 (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
在比較 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
我找到了一些連結,其中提到了這兩種方法,但我無法從中得到任何明確的資訊:
https://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-common-official https://help.ubuntu.com/community/Kernel/Compile(選項 B 與備用選項 B)
如果有人能告訴我這些差異並告訴我哪個是首選選項,我將不勝感激。謝謝你。
在 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
您正在實際安裝一個二進制包,該包恰好包含 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
執行時剛剛下載到目前目錄的源包。就文件而言,我會遵循核心手冊中的 Debian 文件(第 4.5 節)。如您連結到的第 4.2 節中所述,重建完整的 Debian 核心需要很長時間,因為它建構了許多變體。