我的 GNU/Linux 作業系統核心自製 Debian 軟體包裹製作程序(The Debian way)
智慧財產授權條款 | Intellectual Property License
文章版本 | Article Version
+09
文章修改紀錄 | Article ChangeLog
- +09
- 增加 ZRAM 的選項
- +08
- 新增 ureadahead 的作業系統核心修正檔(根據 Launchpad.net 704665程式缺陷報告)
- +07
預計要新增 ureadahead 的 kernel patch(在開發者未提供可成功套用差異檔的情況下還是繼續等吧= =)- 測試官方 Linux Bootup logo 選項
- +06
- 修正了更換CPU架構會造成編譯出來的作業系統核心不支援 Physical Address Extension 的問題。
- 文章正式釋出。
- +05
- 解決 make xconfig 之後建構的 linux-headers Debian 軟體包裹依賴 Qt 函式庫的問題
- +04
- 增加了啟用 Intel、AMD IOMMU 的選項
- +03
- 第一次撰寫
文章適用範圍
- 實際測試於 Ubuntu 12.04LTS、12.10 版本
- 理論上適用於 Debian 跟基於 Debian 的 Linux 散佈版本(如 Ubuntu、Linux Mint 等)
文章內容 | Article Content
總之這是我做出 Linux 作業系統核心 Debian 軟體包裹的標準程序。
這裡用的是所謂 The Debian way 的建構方法,可以直接建構並打包成可輕易安裝及移除的 Debian 軟體包
確認建構 Linux 作業系統核心所需要的軟體是否已安裝
- 必要條件
- kernel-package 軟體包
- make-kpkg 命令等
- 待補充
- 選用條件
- Qt 函式庫開發用軟體包
- make xconfig 命令需要用到
- Gtk 函式庫開發用軟體包
- make gconfig 命令需要用到
- 待補充
獲取並建構 Linux 作業系統核心
- 從 www.kernel.org 下載最新穩定版本的 Linux 作業系統核心原始程式碼壓縮封裝檔。
- 在一個 UNIX 檔案系統的磁碟分割區中解壓縮壓縮封裝檔。
- 其他類型的檔案系統我還沒試過…
- 如果可用記憶體空間夠大(6~8GiB)的話可以直接建立跟 RAM 磁碟差不多的 tmpfs 檔案系統並在其中建構
- mount --types tmpfs --options size=8G tmpfs 「要掛載的目錄」
- 掛載選項
- size
- tmpfs 檔案系統最大允許的大小(似乎預設值挺小的)
- 執行終端機(模擬器),變更目前工作目錄(current working directory)至kernel 原始程式碼根目錄內(有 arch、block、kernel、net、drivers 等資料夾的那一層目錄)。
- 執行「make mrproper」。
- 下載並套用合適的版本的 AppArmor 2.4 Capability Patch 跟 ureadahead trace patch (現在暫時用這個)。
patch --strip 1 < 「patch檔案的位址」 - 確定「make gconfig」或「make xconfig」所需的軟體相依性有沒有俱備。
- 執行「make gconfig」或「make xconfig」以建構並執行kernel的設定工具。
- 載入/boot/中Ubuntu官方linux kernel的config開頭的檔案。
- Processor type and features分類中選擇需要的設定
- Processor family
- 說明:編譯器要針對做最佳化的的CPU種類(較新的CPU family效能較好但其他機器相容性較低)
- 影響範圍:效能 或 硬體相容性
- Preemption Model(Preemptible Kernel (Low-Latency Desktop))
- 影響範圍:效能 或 電力消耗
- Timer frequency(1000HZ)
- 影響範圍:效能 或 電力消耗
- 勾選Tickless System (Dynamic Ticks)。
- 影響範圍:效能 或 電力消耗
- High Memory Support勾選64GB
- 影響範圍:可使用可用記憶體空間 或 效能
- Power management and ACPI options分類中選擇需要的設定
- CPU Frequency scaling中選擇需要的Default CPUFreq governor(ondemand)。
- 影響範圍: 效能 或 電力消耗
- 選擇自己感興趣的自訂項目(胡搞亂搞模式啟動!)
- /Security options/Enable Intel(R) Trusted Executaion Technology (Intel(R) TXT)
- /Security options/Integrity Measurement Architecture(IMA)
- /Device Drivers/Staging drivers/Android/
- Enable Intel DMA Remapping Devices by default(INTEL_IOMMU_DEFAULT_ON)
- AMD IOMMU support
- /Processor type and features/Toshiba laptop support
- x32 ABI for 64-bit mode
- EFI stub support
- Enable verbose x86 bootup info messages
- Opportunistic sleep
- User space wakeup sources interface
- Enable frontswap to cache swap pages if them is present
- OTG support
- Enable RCU priority boosting
- Forced module loading/unloading
- 用途 | Usage
主要是用來協助Linux作業系統核心模組(kernel module)開發 - ZSMALLOC & ZRAM支持
- 儲存 kernel 設定之後關閉 kernel設定工具。
- 執行「make clean」(為了要排除掉無用的設定工具的軟體相依性)跟「make-kpkg clean」移除先前可能存在的建構產物
- 編輯「家目錄/.kernel-pkg.conf」的 maintainer、email 選項(可以複製 /etc/kernel-pkg.conf 當作範本)。
- 執行「make-kpkg clean」。
- 執行make-kpkg程式建構Linux Kernel並包成Debian軟體包裹。
執行範例(注意:這只是範例!):
make-kpkg --initrd --rootcmd=fakeroot --jobs 6 --revision=3.4.6+08 --append-to-version=-intelceleronmoptimized-vdragon-mod kernel_headers kernel_image
make-kpkg --initrd --rootcmd=fakeroot --jobs 6 --revision=3.4.5+08 --append-to-version=-intelcore2optimized-uksm-ck-bfq-patched-vdragon-mod kernel_headers kernel_image
執行成功的話目前工作目錄的上一層目錄會出現Debian軟體包裹檔案。 - 如果要建構別的版本
- 執行「make gconfig」或「make xconfig」以建構並執行kernel的設定工具。
- 回到9,如果要更換CPU架構的話回到8。
----第一階段結束 | First Phase Ended---- - 下載並套用合適的版本的UKSM Patch、
Brain Fuck Scheduler(B.F.S.) Patch、-ck Patch、Budget Fair Queuing IO Scheduler Patch。
patch -p1 < 「patch檔案的位址」 - 執行「make gconfig」或「make xconfig」以建構並執行 kernel 的設定工具(Budget Fair Queuing IO Scheduler不會自動啟用要手動勾選)。
- 執行9~17。
----釋出 | Release----
安裝建構好的Debian軟體包裹
- 重要重要重要重要!
解除掛載Linux Kernel原始程式碼位址所在的磁碟分割區(disk partition)或是移動原始程式碼的目錄,要不然header軟體包裹會白目的在原始碼中新增指向它的symbolic link,然後編譯VirtualBox kernel modules時會GG。
※更新:我大概知道這一段要怎麼處理了,先跳過。 - 暫時的排解問題方法 | Workarounds
- 安裝 kernel-package 軟體包
- 以系統管理身份複製 /usr/share/kernel-package/examples/ 目錄底下的「etc/kernel/*/link」或「etc/kernel/*/force-build-link」shell script 程式至 /etc/kernel/ 底下的對應位置
- 安裝「linux-image」跟「linux-header」開頭的兩個Debian軟體包裹。
- 如果還是有問題請見 4. 以後的說明
- 重新開機以安裝好的kernel版本的開機選項開機,下載我做的自訂kernel header安裝後修復symbolic link用script然後在終端機(模擬器)中切換到script的根目錄中以管理員(root)權限執行
bash Shell_scripts/Fix_link.sh
script本身做的只是把「/lib/modules/「kernel版本」/build」、「/lib/modules/「kernel版本」/source」這兩個symbolic link從我建構kernel時的Linux Kernel原始程式碼根目錄移到實際上「linux-headers開頭的Debian 軟體包裹」安裝kernel header的目錄「/usr/src/「kernel版本」/」。 - 重新安裝先前因為symbolic link指向的 Linux Kernel Header目錄不正確而無法成功建構的 kernel module。
已知問題 | Known Issues
- 理論上 make-kpkg 本身可以做到直接建立指向「/usr/src/「kernel版本」/」的symbolic link,但是礙於時間有限我現在只有做到自行修補。
- 已有 workaround ,大概是 make-kpkg 的程式缺陷
linux-headers開頭的軟體包裹居然會莫名其妙的依賴libqtcore…造成某些比較舊的版本無法安裝(已於+5版本修復)。- Ubuntu 10.04LTS因為gcc版本不相容的問題即使安裝了 linux-headers 開頭的軟體包裹也無法安裝第3方kernel modules(不修復,升級系統比較快)。
建構出來的kernel無法執行32位元可執行檔(+6版本應不需修改建構程序即可解決)。
參考資料 | Reference Data
- 自己。