Morphix 雜記


什麼是 Morphix

Morphix 是模組化的 knoppix。 本文的依據是 2003 年 8 月版。

玩耍

先下載最新版的 MorphixCombined-LightGUI-*.iso 並燒成光碟, 玩玩看。 最好是燒成 cdrw 比較環保, 因為等一下還要改來改去。

如果想變身成 root, 可以下: sudo sh

光碟剛開機時的提示符號下, 可以選擇不同的開機方式:

  1. morphix toram 將整個光碟載入記憶體, 如此可以釋放光碟。 我的機器只有 192MB, 當掉。
  2. morphix tohd=hda7 將整個光碟載入硬碟。 沒有試過。
  3. morphix fromhd=hda7 如果先前曾將整個光碟載入硬碟, 現在就可以從硬碟開機。 (也許你對硬碟上的版本做過一些修改)。

簡單修改

如果你對於 Linux 下的特殊檔案系統 有一些概念, 也知道如何 製作開機光碟, 那麼以下幾個修改動作都很簡單。 可以根據光碟上 README.cdrom 的指示, 一次試完:

  1. 修改 index.html 檔。
  2. 抓幾個迷你模組來, 放在 /minimod 目錄底下。
  3. 在 /exec 底下放一個 shell script, 隨便 echo 一點什麼東西。

重燒一次 cdrw, 檢查你所做的更動是否生效。

製作開機光碟很花時間對吧? 從 mkisofs, cdrecord 到重新開機, 都要在一旁傻等。 趁這個機會起來運動一下吧!

事實上你可以做的簡單修改不只如此。 光碟片上還預留了一些空的神奇目錄, 都是拿來讓你進行 「免拆封」 簡單修改用的, 將檔案放在這些目錄底下, 各有不同的效果。 例如只要將 *.deb 套件檔放在 /deb 底下, 在開機時系統就會自動替你安裝這些額外的套件。 其他神奇目錄的用法請見 README.cdrom 檔。 例如要在 Morphix 底下使用中文, 可以這樣做:

  1. 在 /deb 底下放 ttf-arphic-*.deb 文鼎字形套件。
  2. 開機時, 在 boot: 提示下, 打 morphix lang=tw

超簡單吧! (感謝 urcheng 提供)

原來要修改 knoppix 的門檻有點高, 特別是解/壓超大的 KNOPPIX 映象檔要吃很多資源及時間; 現在有了 morphix, 研發人員可以分級分工, 進行不同程度的修改工程:

  1. 如果只想做簡單的修改, 只需要會 掛載/修改 .iso 映象檔, 在上述神奇目錄底下放東西就可以了。
  2. 如果想將許多相關套件包裝在一起, 可以學會如何包裝迷你模組。 拿一個數 MB 到數十 MB 的迷你模組來學習, 拆封起來不會太耗資源。
  3. 如果要包裝不同的圖形工作環境, 例如對 KDE, GNOME, xfce 都不滿意, 才需要學會包裝主要模組。 這可能需要拿一個數百 MB 的主要模組拆封起來學習。
  4. 其他低階的辛苦工作, 就留給 morphix 的作者 Alex de Landgraaf 大德吧!

認識光碟片上的眾多映象檔

一張 morphix 光碟裡面只能有一個主要模組。 以我們下載的光碟映象檔 MorphixCombined-LightGUI-*.iso 為例, 就是由陽春 morphix 光碟與主要模組 MorphixMain-Light.mod 合併而成。

單單是陽春光碟就已經很有用了。 諸如自動偵測硬體等等最重要基本的工作, 都是在這裡做的。 它雖然沒有圖形介面, 但提供了一個基本的文字介面工作環境, 可以拿來當做救援光碟使用。

主要模組則是用來提供不同的圖形介面環境。 現在多數版本的 Linux 不是採用 KDE 就是採用 GNOME, 你可以在 morphix 的網站找到這些主要模組, 或直接找對應的 "陽春+主要模組" 合併版光碟 iso 檔。 至於我們選擇的 MorphixMain-Light.mod 採用的則是輕薄短小的 xfce。

一張 morphix 光碟上, 可以沒有迷你模組, 也可以有任意個。 以下假設我們只放了一個 MorphixMini-Console.mod。

morphix 光碟片的映象檔結構

由於 morphix 是從 knoppix 改過來的, 所以開機流程類似 (舊版的) knoppix; 只不過 morphix 光碟上的映象檔比 knoppix 更多。 如圖所示:

  1. [base/boot.img] 是開機磁片映象檔
  2. [base/morphix] 是陽春版 morphix 的主體, 基本指令等等都放在這裡
  3. [mainmod/MorphixMain-Light.mod] 就是主要模組, 提供 xfce 圖形工作環境
  4. [minimod/MorphixMini-Console.mod] 是一個收集了許多文字模式應用軟體的迷你模組, 提供文字模式瀏覽器, 文字模式試算表, ... 等等指令

當然這些都是映象檔, 不能直接使用, 必須用 loopback 的方式掛載上來, 才能看到它們的內容。 比較特別的是 boot.img 它裡面還有另外一個映象檔 miniroot.gz 是開機過程當中的極簡根目錄環境。

開機流程

閱讀下文之前, 建議先將上述各個映象檔用 loopback 掛載上來, 一邊閱讀一邊對照真實的檔案內容。

第二次閱讀時, 如果想確認這裡有沒有寫錯 (老實說, 我也沒有把握, 純閱讀不動手實在有點心虛) 建議自己把這些映象檔裡面的 scripts 抓出來修改, 再放回去。 ##xx## 修改些什麼呢? 可以把某些目錄的內容印出來看: (echo 'ls -lR /usr; ls -lR /usr) >> /tmp/ckhung_log 或是印出變數的值: echo "\$PATH = $PATH" >> /tmp/ckhung_log 這裡用 >> 將所有列印的輸出接續著放入同一個檔案, 以免印在螢幕上跳太快看不見。 至於應該印到 /tmp 底下還是 /var/tmp 底下還是其他地方, 我也不確定。 因為根目錄會改變, 檔案會拷來拷去, 究竟要放那裡才不會丟掉, 必須試一下。

  1. 在 [base/boot.img] 裡面的 syslinux.cfg 提到要以 miniroot.gz 為起始的根目錄環境, 並且要執行 /etc/init。 所以以下 / 是 ramdisk, 可以寫入。
  2. 在 [miniroot.gz] 裡面... 找不到 /etc/init (##xx##) 控制流程不知怎地交到 /linuxrc。
  3. 在 /linuxrc 裡面提到將光碟片掛在 /cdrom 底下, 並將光碟上的 [base/morphix] 掛在 /MorphixCD 底下。
  4. 把 /MorphixCD 底下一堆東西拷貝到 / 底下。
  5. 把自己 (/linuxrc) 刪除掉, 結束。 (##xx##) 控制流程不知怎地轉到 /etc/inittab -- 當然, 原來的 [miniroot.gz] 裡面並沒有這個檔案, 但是剛才已經從 [base/morphix] 拷貝過來了。 以下許多檔案如果你在 原來的 [miniroot.gz] 裡面找不到, 一樣請到 [base/morphix] 裡面找找看, 不再贅述。
  6. /etc/inittab 提到開機時執行 /etc/init.d/rcS
  7. /etc/init.d/rcS 會執行 /etc/rcS.d 底下所有 S 開頭的檔案, 其中包含超長的 S00knoppix-autoconfig
  8. 偵測硬體的重頭戲就是在 S00knoppix-autoconfig 裡面進行。 這裡面也選擇語系。 (##xx##) 開機時一直出現 splash 相關的錯誤訊息, 是否應研究此處修理?
  9. 回到 /etc/inittab, 它又提到開機時內定的 runlevel 是 5, 也就是說要去執行 /etc/rc5.d 底下所有 S 開頭的檔案。 其中包含 morphix 變魔法的重頭戲 S02morphix-start

S02morphix-start 裡面有一個超長的函數 load_module, 從 102 列到 540 列。 (如果你用的文字編輯器是 vi, 可以將遊標停在函數開頭的左大括弧然後按 % 鍵, 就會跳到函數結尾對應的右大括弧; 再按一次又跳回來。) 真正的流程其實從 544 列開始。 第一次閱讀先簡化我們的問題: 假設使用者在光碟開機時並未輸入任何特殊參數, 而 syslinux.cfg 裡面設定的參數也與此處有興趣的參數無關, 也就是假設 getbootparam 的都沒有傳回值。 在一般情況下, 光碟上恰有一個主要模組, 於是呼叫 load_module 將主要模組載入。

load_module 做了那些事呢? 首先, 它在多處使用 mount --bind ... 將根目錄 / 底下的某些目錄反應在 /mnt/main 的相對應目錄底下。 你可以將它想像成類似 ln, 只不過它比 soft link 更穩固, 不會因為 chroot 而看不見; 又比 hard link 更方便, 可以跨越檔案系統。 越來越明顯了, 它一直在佈置 /mnt/main, 準備將之培植成為 / 的接班人。 真正發生 「政權轉移」 的地方是在 537 列的那句 chroot /mnt/main sh

從 260 列開始, 佈置 translucency。 Translucency 的最上層可寫目錄都集中放在 /var/tmp/trans/ 底下。

從 497 列開始, 處理光碟片上的神奇目錄。 記得嗎? 在 "簡單修改" 一節當中, 提到一些預留的空的神奇目錄。 如果初階的 morphix 研發者在這些目錄裡面放了東西, 就是在這段會進行處理。 其中包含載入迷你模組... (待續)

注意: 啟動各種服務及 X-Window 等等動作還在更後面, /etc/rc5.d 底下的其他 scripts。 所以如果你所做的修改需要依賴某些特定服務, 這麼早執行可能會失敗。 ##xx## 可以試著將你想做的事寫在一個 script 裡面, 放在光碟片上 /copy/etc/rc5.d/S99_ckhung 之類的檔案, 或許就可以達到延後執行的目的。

自製迷你模組

目前 translucency 好像還怪怪的, 特別是 symbolic link 不太能用。 自製模組尚未成功; 以下筆記尚未整理。

extract_compressed_fs MorphixMini-rescue.mod > MorphixMini-rescue.iso
    mount -o loop MorphixMini-rescue.iso /mnt/test
    cp -r /mnt/test/* /morphing/
    umount /mnt/test
    ...
    mkisofs -pad -R -U -V "Morphix fs" -P "Morphix" -cache-inodes -no-bak 
    -hide-rr-moved /morphing/ | create_compressed_fs - 65536 >
    /tmp/MorphixMini-ckhung.mod
    cp /tmp/MorphixMini-ckhung.mod /x/mm/minimod/
    mkisofs -pad -l -r -J -v -V "Morphix" -b base/boot.img -c base/boot.cat
    -hide-rr-moved -o /x/mm.iso /x/mm