Morphix 雜記
什麼是 Morphix
Morphix 是模組化的 knoppix。 本文的依據是 2003 年 8 月版。
玩耍
先下載最新版的 MorphixCombined-LightGUI-*.iso 並燒成光碟, 玩玩看。 最好是燒成 cdrw 比較環保, 因為等一下還要改來改去。
如果想變身成 root, 可以下: sudo sh
光碟剛開機時的提示符號下, 可以選擇不同的開機方式:
morphix toram
將整個光碟載入記憶體, 如此可以釋放光碟。 我的機器只有 192MB, 當掉。morphix tohd=hda7
將整個光碟載入硬碟。 沒有試過。morphix fromhd=hda7
如果先前曾將整個光碟載入硬碟, 現在就可以從硬碟開機。 (也許你對硬碟上的版本做過一些修改)。
簡單修改
如果你對於 Linux 下的特殊檔案系統 有一些概念, 也知道如何 製作開機光碟, 那麼以下幾個修改動作都很簡單。 可以根據光碟上 README.cdrom 的指示, 一次試完:
- 修改 index.html 檔。
- 抓幾個迷你模組來, 放在 /minimod 目錄底下。
- 在 /exec 底下放一個 shell script, 隨便 echo 一點什麼東西。
重燒一次 cdrw, 檢查你所做的更動是否生效。
製作開機光碟很花時間對吧? 從 mkisofs, cdrecord 到重新開機, 都要在一旁傻等。 趁這個機會起來運動一下吧!
事實上你可以做的簡單修改不只如此。 光碟片上還預留了一些空的神奇目錄, 都是拿來讓你進行 「免拆封」 簡單修改用的, 將檔案放在這些目錄底下, 各有不同的效果。 例如只要將 *.deb 套件檔放在 /deb 底下, 在開機時系統就會自動替你安裝這些額外的套件。 其他神奇目錄的用法請見 README.cdrom 檔。 例如要在 Morphix 底下使用中文, 可以這樣做:
- 在 /deb 底下放 ttf-arphic-*.deb 文鼎字形套件。
- 開機時, 在 boot: 提示下, 打 morphix lang=tw
超簡單吧! (感謝 urcheng 提供)
原來要修改 knoppix 的門檻有點高, 特別是解/壓超大的 KNOPPIX 映象檔要吃很多資源及時間; 現在有了 morphix, 研發人員可以分級分工, 進行不同程度的修改工程:
- 如果只想做簡單的修改, 只需要會 掛載/修改 .iso 映象檔, 在上述神奇目錄底下放東西就可以了。
- 如果想將許多相關套件包裝在一起, 可以學會如何包裝迷你模組。 拿一個數 MB 到數十 MB 的迷你模組來學習, 拆封起來不會太耗資源。
- 如果要包裝不同的圖形工作環境, 例如對 KDE, GNOME, xfce 都不滿意, 才需要學會包裝主要模組。 這可能需要拿一個數百 MB 的主要模組拆封起來學習。
- 其他低階的辛苦工作, 就留給 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 是從 knoppix 改過來的, 所以開機流程類似 (舊版的) knoppix; 只不過 morphix 光碟上的映象檔比 knoppix 更多。 如圖所示:
- [base/boot.img] 是開機磁片映象檔
- [base/morphix] 是陽春版 morphix 的主體, 基本指令等等都放在這裡
- [mainmod/MorphixMain-Light.mod] 就是主要模組, 提供 xfce 圖形工作環境
- [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 底下還是其他地方, 我也不確定。
因為根目錄會改變, 檔案會拷來拷去, 究竟要放那裡才不會丟掉,
必須試一下。
- 在 [base/boot.img] 裡面的 syslinux.cfg 提到要以 miniroot.gz 為起始的根目錄環境, 並且要執行 /etc/init。 所以以下 / 是 ramdisk, 可以寫入。
- 在 [miniroot.gz] 裡面... 找不到 /etc/init (##xx##) 控制流程不知怎地交到 /linuxrc。
- 在 /linuxrc 裡面提到將光碟片掛在 /cdrom 底下, 並將光碟上的 [base/morphix] 掛在 /MorphixCD 底下。
- 把 /MorphixCD 底下一堆東西拷貝到 / 底下。
- 把自己 (/linuxrc) 刪除掉, 結束。 (##xx##) 控制流程不知怎地轉到 /etc/inittab -- 當然, 原來的 [miniroot.gz] 裡面並沒有這個檔案, 但是剛才已經從 [base/morphix] 拷貝過來了。 以下許多檔案如果你在 原來的 [miniroot.gz] 裡面找不到, 一樣請到 [base/morphix] 裡面找找看, 不再贅述。
- /etc/inittab 提到開機時執行 /etc/init.d/rcS
- /etc/init.d/rcS 會執行 /etc/rcS.d 底下所有 S 開頭的檔案, 其中包含超長的 S00knoppix-autoconfig
- 偵測硬體的重頭戲就是在 S00knoppix-autoconfig 裡面進行。 這裡面也選擇語系。 (##xx##) 開機時一直出現 splash 相關的錯誤訊息, 是否應研究此處修理?
- 回到 /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
- 本頁最新版網址: https://frdm.cyut.edu.tw/~ckhung/b/sa/morphix.php; 您所看到的版本: February 14 2012 10:32:25.
- 作者: 朝陽科技大學 資訊管理系 洪朝貴
- 寶貝你我的地球, 請 減少列印, 多用背面, 丟棄時做垃圾分類。
- 本文件以 Creative Commons Attribution-ShareAlike License 或以 Free Document License 方式公開授權大眾自由複製/修改/散佈。