2010年12月7日 星期二

自製可多重開機USB隨身碟-進階版(一)

Grub4Dos 可以使用 gfxmenu 來美化啟動選單,它有點像是開機選單的佈景主題,網路上雖然有很多類似的教學文件,但我覺得還是太過淩亂,缺乏有系統的整理,因此,還是用我自己的方法來做個整理好了。

在使用 gfxmenu 前,有必要先來了解一下什麼是 gfxboot?gfxboot 可以將文字模式的 BootLoader 美化成圖形模式,它不是一個單獨運作的軟體,而是對 BootLoader 的加強模組,目前大部份的 BootLoader 都已支援 gfxboot,如 grub、lilo、isolinux 及 syslinux 等。

調用 gfxboot 的方式各家 BootLoader 不盡相同,如 grub 是在 menu.lst 內使用 gfxmenu 命令,lilo 在 lilo.conf 內使用 message 命令,isolinux 則是在 isolinux.cfg 內使用 gfxboot 命令,由於這篇文章是延續之前的二篇文章,所以,各家 BootLoader 使用 gfxboot 的細節就不在這裡討論,我們關注的焦點其實是 Grub4dos 對 gfxboot 的支援。

Grub4dos 從 0.4.4 版開始支援 gfxboot,和 grub 一樣,在 menu.lst 內調用如下的指令:
gfxmenu (hd0,1)/boot/message
message 是一個使用 cpio 打包過的檔案,裡面包的就是 gfxboot 的所需文件,如背景圖、字體、說明檔、gfxboot 設定檔...等,在 OpenSUSE 內,預設的安裝目錄是 /boot,為了測試 Grub4dos 對 gfxboot 的支援,我在 VirtualBox 上裝了一套 OpenSUSE 11.3,然後從 /boot 下複製了一份 message 到之前製作的 USB 工作碟上,並在 menu.lst 內使用了 gfxmenu 命令,結果您猜,發生了什麼事?



如上圖,開機後映入眼簾的就是,OpenSUSE 的開機畫面,而選單內容還是我之前的選單內容,這意味著什麼?是不是如果我更改 message 檔案的內容,就可以訂製我自己的開機畫面呢?答案還不清楚,只有做些實驗才能知道。

message 需要使用 cpio 壓縮及解壓縮,如果您沒有 Linux 的操作環境的話,可以下載 MSYS 1.0.11 來模擬 Shell 的環境,另外還需下載 cpio.rar ,將 cpio.rar 解壓至 C:\msys\1.0\bin 目錄下即可。( 事實上我還是覺得直接在 Linux 下操作會方便一些 )

先來看看 message 解開後的內容是什麼:

16x16.fnt
back.jpg
800x600 24bit 16KB 的 jpeg
en.hlp
en.tr
gfxboot.cfg
init
二進位檔
lang
languages
pabout.txt
panim.jpg
panim_a.jpg
pback.jpg
phead.jpg
timer_a.jpg
translations.zh_TW
zh_TW.hlp
zh_TW.tr

看起來,似乎只要更換 back.jpg 就可以達到改變背景圖的效果,根據網路上找到的資料,gfxboot 對於背景圖片是有限制的,必須是 800x600x24bit 尺寸不能超過 150KB~200KB 的 jpeg 圖片,我暫時不想做太多測試,因此就替換了一張同樣格式( 800x600x24bit 28KB)的圖片,重新用 cpio 打包後做測試,結果如下:


嘿嘿,美腿總算可以看見高清版了,現在我們已經知道置換 back.jpg 的效果了,可是,我發覺,我的 menu.lst 內明明寫的是 Reboot,怎麼現在會變成重新開機了呢?莫非,message 內有著什麼字典檔? 可是,問題來了,我把 message 內所有的文字檔案都看了一遍,都沒有什麼 Reboot 和重新開機的字眼,那麼關鍵到底在哪裡呢? 由於 message 事實上是經過編譯而產生的,單純修改 message 這條路,我看還是放棄好了。

那麼,接下來該怎麼做呢?對岸有熱心的朋友開發一個小程式,可以直接製作 message 檔,可是一來,我忘了在哪裡看到的,二來,因為它是簡體中文的,要使用它還得轉碼,有點小麻煩,所以,我選擇的方法是,直接在我的 VirtualBox 內執行 OpenSUSE,然後用 OpenSUSE 附的 gfxboot 工具來產生 message,最後再把這個 message 給它拷貝出來使用即可。

在 OpenSUSE 裡客製 message 的方法,一為使用 gfxboot 或 cpio 直接修改 /boot/message 內的 gfxboot.cfg 檔,二為重新編譯 gfxboot-devel 套件內的範例主題,前者較適合一般使用者,後者則需稍具程式撰寫經驗者,底下我會將二者的方法一併列出,其實有時候為了方便,混著使用也無妨,只是有一點要特別注意的是,使用重新編譯的話,每次編譯完都會產生一份新的 message,使用 gfxboot 命令則是在現有的 /boot/message 內進行修改,二者的差異不要搞混了就好。

首先,需要做的是在 OpenSUSE 內安裝 gfxboot-devel、qemu,詳情這裡就不多說了,將 gfxboot-devel 套件內附的 OpenSUSE Theme ( 在 /usr/share/gfxboot/themes/ 目錄下 ),複製一份到家目錄內,它的內容如下圖:


看到 Makefile 了嗎?這表示,修改完成後您得要進行編譯的動作才行,以我為例,即執行以下指令:
#cd /home/kalvin/Theme/openSUSE
#make clean
#make
make 完成後就會在同一目錄下產生 message 檔,您可以將它複製到 /boot 目錄下進行稍後的測試動作,原來 /boot 目錄下的 message 看您是要刪除還是備份都可以。

那麼修改完成後,要怎麼測試成果呢?gfxboot 很貼心的提供了 test 的功能,不過前提是您必須安裝了 qemu 才行,執行以下指令,即可看見修改的成果:
#gfxboot --test --preview

接下來,就開始說明修改的動作如何操作,原則上,我會用修改原始檔並重新編譯的方式操作,但也會附上使用 gfxboot 命令執行相同的動作的說明,請自行選用。

更換佈景主題背景底圖

底下我以一個實例來做示範,一樣用我的高清美腿來做背景(喔,我愛死它了...)

如果要用重新編譯的方法的話,將圖片覆寫至 OpenSUSE Theme 的 data-boot 目錄內,執行 make 就可以了 ,複製 message 到 /boot 目錄下,用 gfxboot 命令測試,初步成果如下圖:


或使用 gfxboot 命令:
#gfxboot --add-file back.jpg
或直接將 back.jpg 使用 File Roller 插入至 message 內

Tips:有時候,您可能會看到背景圖變成企鵝動畫,那是因為 gfxboot 預設會隨機以企鵝動畫替代您的背景圖,如果您完全不想看到它,可以這麼做
#gfxboot --change-config penguin=0
這麼一來,就等於關閉它了,如果要在編譯時就關閉它,那麼在 OpenSUSE Theme 的 /src 目錄下有一份 gfxboot.cfg ,開啟它,找到
penguin=-1
改成
penguin=0
即可

變更佈景主題語系

仔細瞧,上個步驟圖片中的文字部份都是英文的,選單內容則是這台機器上的選單內容,這點沒關係,因為我們要的只是它的佈景主題而已,到時候套用到我們自己的隨身碟上時,選單自然是我們己設定好的,重點是要如何將文字變成中文,答案就在這裡:
#gfxboot --add-languages zh_TW zh_CN --default-language zh_TW
一行指令搞定,由於 OpenSUSE 支援繁體中文,所以在 gfxboot-devel 套件內包含完整的繁體中文翻譯檔,上面的指令就是將繁體中文、簡體中文的語系翻譯檔加入 message 內,並將預設語系設為繁體中文,效果如下圖:


現在可以看到除了選單部份的文字之外,已經變成繁體中文了,同時如果按下 F2 的話,還可以切換成英文或是簡體中文,不過,要注意的是,使用 gfxboot 指令進行的修改動作,是直接對 /boot/message 做修改,萬一下次還需要對原始 Theme 進行修改及重新編譯的話, 就還得要重新執行一次這個指令,有點麻煩,所以我提供另外一種做法,那就是直接對 Makefile 進行修改,那麼無論要重新編譯幾次,這部份都可以維持現在的狀況,實際的做法為:

開啟 OpenSUSE Theme 內的 Makefile ,找到底下這一行
DEFAULT_LANG =
修改成
DEFAULT_LANG = zh_TW
再來找底下這一行
cp -rL po/en.tr help-boot/en.hlp message.dir
在它下面再增加一行
cp -rL po/zh_CN.tr help-boot/zh_CN.hlp message.dir
然後存檔,接下來再修改 data-boot 目錄下的 languages,開啟它後只有一行內容
en_US
在它底下增加一行
zh_CN
存檔,重新編譯看看成果如何,應該算不錯了吧?只是我個人比較龜毛一點,看著那個 F4 Keyboard 還是英文的就有氣,雖然 keymaps 裡沒有繁體中文,但我想把 "Keyboard" 字串改成"鍵盤",應該不算過份吧?

研究了一下,終於找到了為什麼明明字典檔內有 "Keyboard" 的翻譯,介面上卻仍然顯示著 "Keyboard" 而不是 "鍵盤",原來,在 /src/dia_keymap.inc 內有這麼一行:
xmenu .xm_title "Keyboard" put
原作者不知道什麼原因,在這居然直接把 "Keyboard" 字串寫入,把它改成:
xmenu .xm_title /txt_keyboard put
這樣就表示 "Keyboard" 這個字串是由字典檔提供的了...呃,如果看不懂我在寫什麼的,那乾脆把它關閉好了,反正不管繁中還是簡中,鍵盤的 layout 都是 US,要讓 "Keyboard" 不顯示那就簡單多了,開啟 /src/gfxboot.cfg 找到 [boot] 區段下的這一行
key.F4=keymap
前面加個 ; 號,註解掉就行了,變成
;key.F4=keymap
重新編譯就可以了,不想重新編譯者,修改 message 內同樣內容也是一樣的,效果如下圖


不知道是不是我廢話太多,總覺得文章太長了,修改 HTML 時看得我眼花撩亂的,我想還是多分成幾篇來介紹好了,其它的內容,靜待下回分解囉~

2 則留言:

  1. 請問這張美腿share?thanks!

    回覆刪除
  2. 呃..老兄您是要這張美腿圖嗎?ok~ok~就在這裡
    http://img132.imageshack.us/img132/2637/27749024.jpg

    回覆刪除