2012年6月3日 星期日

我的 GNU/Linux 作業系統核心自製 Debian 軟體包裹製作程序(The Debian way)

我的 GNU/Linux 作業系統核心自製 Debian 軟體包裹製作程序(The Debian way)

智慧財產授權條款 | Intellectual Property License

本文章以創用CC BY 3.0 台灣版本授權所有人使用。
如果有其他需求歡迎來信詢問

文章版本 | Article Version

+09

文章修改紀錄 | Article ChangeLog

  • +09
    • 增加 ZRAM 的選項
  • +08
  • +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

因為 VirtualBox 作業系統核心模組太容易不小心建構不出來了所以…Orz...
總之這是我做出 Linux 作業系統核心 Debian 軟體包裹的標準程序。
這裡用的是所謂 The Debian way 的建構方法,可以直接建構並打包成可輕易安裝及移除的 Debian 軟體包

確認建構 Linux 作業系統核心所需要的軟體是否已安裝

  • 必要條件
    • kernel-package 軟體包
      • make-kpkg 命令等
    • 待補充
  • 選用條件
    • Qt 函式庫開發用軟體包
      • make xconfig 命令需要用到
    • Gtk 函式庫開發用軟體包
      • make gconfig 命令需要用到
    • 待補充

獲取並建構 Linux 作業系統核心

  1. www.kernel.org 下載最新穩定版本的 Linux 作業系統核心原始程式碼壓縮封裝檔。
  2. 在一個 UNIX 檔案系統的磁碟分割區中解壓縮壓縮封裝檔
    • 其他類型的檔案系統我還沒試過…
    • 如果可用記憶體空間夠大(6~8GiB)的話可以直接建立跟 RAM 磁碟差不多的 tmpfs 檔案系統並在其中建構 
      • mount --types tmpfs --options size=8G tmpfs 「要掛載的目錄」
        • 掛載選項
          • size
            • tmpfs 檔案系統最大允許的大小(似乎預設值挺小的)
  3. 執行終端機(模擬器),變更目前工作目錄(current working directory)至kernel 原始程式碼根目錄內(有 arch、block、kernel、net、drivers 等資料夾的那一層目錄)。
  4. 執行「make mrproper」。
  5. 下載並套用合適的版本的 AppArmor 2.4 Capability Patchureadahead trace patch (現在暫時用這個)。
    patch --strip 1 < 「patch檔案的位址」
  6. 確定「make gconfig」或「make xconfig」所需的軟體相依性有沒有俱備。
  7. 執行「make gconfig」或「make xconfig」以建構並執行kernel的設定工具。
  8. 載入/boot/中Ubuntu官方linux kernel的config開頭的檔案。
  9. 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
      • 影響範圍:可使用可用記憶體空間 或 效能
  10. Power management and ACPI options分類中選擇需要的設定
    • CPU Frequency scaling中選擇需要的Default CPUFreq governor(ondemand)。
      • 影響範圍效能 或 電力消耗
  11. 選擇自己感興趣的自訂項目(胡搞亂搞模式啟動!)
    • /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支持
  12. 儲存 kernel 設定之後關閉 kernel設定工具。
  13. 執行「make clean」(為了要排除掉無用的設定工具的軟體相依性)跟「make-kpkg clean」移除先前可能存在的建構產物
  14. 編輯「家目錄/.kernel-pkg.conf」的 maintainer、email 選項(可以複製 /etc/kernel-pkg.conf 當作範本)。
  15. 執行「make-kpkg clean」。
  16. 執行make-kpkg程式建構Linux Kernel並包成Debian軟體包裹。
    執行範例(注意:這只是範例!):
    make-kpkg --initrd --rootcmd=fakeroot --jobs 6 --revision=3.4.6+08 --append-to-version=-intelceleronm
    optimized-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軟體包裹檔案。
  17. 如果要建構別的版本
    1. 執行「make gconfig」或「make xconfig」以建構並執行kernel的設定工具。
    2. 回到9,如果要更換CPU架構的話回到8。
      ----第一階段結束 | First Phase Ended----
  18. 下載並套用合適的版本的UKSM PatchBrain Fuck Scheduler(B.F.S.) Patch-ck PatchBudget Fair Queuing IO Scheduler Patch
    patch -p1 < 「patch檔案的位址」
  19. 執行「make gconfig」或「make xconfig」以建構並執行 kernel 的設定工具(Budget Fair Queuing IO Scheduler不會自動啟用要手動勾選)。
  20. 執行9~17。
    ----釋出 | Release----

安裝建構好的Debian軟體包裹

  1. 重要重要重要重要!解除掛載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/ 底下的對應位置
  2. 安裝「linux-image」跟「linux-header」開頭的兩個Debian軟體包裹。
  3. 如果還是有問題請見 4. 以後的說明
  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版本」/」。
  5. 重新安裝先前因為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

  1. 自己。