介紹
BURG是一個基于GRUB2的啟動管理器。
使用二進制包安裝
ubuntu karmic的用戶可以直接使用PPA里面的二進制包來安裝。首先,在/etc/apt/sources.list文件里加上源:
deb http://ppa.launchpad.net/bean123ch/burg/ubuntu karmic main deb-src http://ppa.launchpad.net/bean123ch/burg/ubuntu karmic main
用以下命令下載并安裝:
sudo apt-get updatesudo apt-get install grub-pc
你還需要把新的啟動管理器安裝到MBR或者啟動扇區(qū)里,例如:
sudo update-grubsudo grub-install "(hd0)"
使用源代碼里安裝
依賴軟件
在編譯BURG前,系統(tǒng)里需要有以下的軟件:
gcc gcc-multilib (用于在i386系統(tǒng)里編譯x86_64目標,或者在x86_64系統(tǒng)里編譯i386目標) bison autoconf GNU make ruby
Debian/Ubuntu
用apt-get可以方便地安裝所需軟件:
sudo apt-get install gcc gcc-multilib bison autoconf make ruby
OSX
需要安裝Xcode。我在10.4 Tiger (Xcode 2.5),10.5 Leopard (Xcode 3.0)和10.6 Snow Leopard (Xcode 3.2)上成功地編譯通過。
對于10.4 Tiger來所,系統(tǒng)自帶的bison和autoconf版本太低,你需要安裝macport或者fink里的版本。
Windows
在Windows下需要mingw或者cygwin。ruby沒有包含在mingw里,你需要另行安裝。
獲得源碼
需要使用bazaar來下載代碼,第一次導(dǎo)入:
bzr branch lp:burg
以后更新可以在burg目錄里運行:
bzr pull
在下載/更新代碼后,需要運行以下的命令來生成makefile:
./autogen.sh
== 編譯和安裝(pc模式)==
在burg工作目錄里運行以下命令即可編譯:
mkdir bin_pccd bin_pc../configure --with-platform=pc --prefix=${HOME}/burg_pcmakemake install
這里,我使用了子目錄bin_pc來放置生成的目標文件,這可以避免在工作目錄下生成大量文件。而且,安裝時使用用戶主目錄下的 burg_pc,這可以避免可系統(tǒng)自帶的GRUB2發(fā)生沖突。
然后,和二進制安裝一樣,需要安裝到MBR:
以下命令只能在Linux下運行,在OSX/Windows下是不適用的
cd ${HOME}/burg_pc/sbinsudo ./update-grubsudo ./grub-install "(hd0)"
== 編譯和安裝(efi模式)==
編譯和pc模式很相近,只需要修改--with-platform和--target參數(shù)就行了。
32位EFI:
mkdir bin_efi32cd bin_efi32../configure --with-platform=efi --target=i386 --prefix=${HOME}/burg_efi32makemake install
64位EFI:
mkdir bin_efi64cd bin_efi64../configure --with-platform=efi --target=x86_64 --prefix=${HOME}/burg_efi64makemake install
然后,需要用grub-mkimage命令來生成EFI啟動映像,例如:
cd ${HOME}/burg_efi64/bin./grub-mkimage -o grub64.efi minicmd part_gpt part_msdos part_apple fat ext2 hfsplus hfs ntfs reiserfs xfs iso9660 udf ls search loopback linux chain reboot halt appleldr help configfile hexdump loadbios memrw fixvideo crc sh video efi_fb gfxterm font png loadcfg normal coreui gfxrgn txtrgn nmenu emenu
把grub64.efi拷貝到rEFIt能找到的目錄,并且在同樣的目錄下建立一個grub.cfg文件,例如:
menuentry "Boot OSX" { search -s -f /usr/standalone/i386/boot.efi chainloader /usr/standalone/i386/boot.efi}menuentry "Boot MBR" { appleloader HD}menuentry "Boot CD" { appleloader CD}
新菜單系統(tǒng)
用法
要啟動新菜單系統(tǒng),首先需要在以下地址下載資源文件:
http://grub4dos.sourceforge.net/themes.tar.bz2
并解壓到根目錄:
sudo tar -xjf themes.tar.bz2 -C /
解壓后相關(guān)的文件可以在/boot/grub/themes/里找到。
在pc模式下啟動新圖形界面,首先需要編輯/etc/default/grub文件,找到GRUB_TERMINAL所在的一行并把前面的#去掉,使得這句話生效:
GRUB_TERMINAL=console
這一步非常重要。沒有GRUB_TERMINAL=console的話,grub會啟動gfxterm,這個和新菜單是不兼容的,這會導(dǎo)致啟動時出現(xiàn)黑屏??!
然后,編輯/etc/grub.d/40_custom,把以下內(nèi)容加進去:
set gfxmode="640x480"set gfxfont="Unifont Regular 16"loadfont /boot/grub/themes/fonts/unifont.pf2loadfont /boot/grub/themes/fonts/aqui.pf2loadfont /boot/grub/themes/fonts/edges.pf2loadfont /boot/grub/themes/fonts/lime.pf2loadfont /boot/grub/themes/fonts/7x13B.pf2loadfont /boot/grub/themes/fonts/smoothansi.pf2loadfont /boot/grub/themes/fonts/Helvetica-Bold-14.pf2insmod vbeinsmod pnginsmod coreuiload_config /boot/grub/themes/proto/theme.txt
最后一句設(shè)置的是風(fēng)格。目前有三種可以選擇:
proto
load_config /boot/grub/themes/proto/theme.txt
ubuntu
load_config /boot/grub/themes/ubuntu/theme.txt
winter
load_config /boot/grub/themes/winter/theme.txt
還有一個示范的風(fēng)格/boot/grub/themes/default.txt。這個界面比較原始,不過里面包含了基本的元素,可以作為定制風(fēng)格的出發(fā)點。
最后,需要生成grub.cfg文件:
sudo update-grub
如果修改了配置,需要重新運行update-grub來更新grub.cfg。
---
在EFI模式下,grub.cfg一般都是手動編輯的。在grub.cfg的最后加上以下內(nèi)容即可:
set gfxmode="0x0"set gfxfont="Unifont Regular 16"loadfont /boot/grub/themes/fonts/unifont.pf2loadfont /boot/grub/themes/fonts/aqui.pf2loadfont /boot/grub/themes/fonts/edges.pf2loadfont /boot/grub/themes/fonts/lime.pf2loadfont /boot/grub/themes/fonts/7x13B.pf2loadfont /boot/grub/themes/fonts/smoothansi.pf2loadfont /boot/grub/themes/fonts/Helvetica-Bold-14.pf2load_config /boot/grub/themes/proto/theme.txt
風(fēng)格文件里定義了以下的快捷鍵:
- e - 編輯當(dāng)前菜單項對應(yīng)的命令
- t - 編輯當(dāng)前菜單項的標題
- c - 打開一個終端窗口
- 2 - 打開兩個終端窗口
- F5 - 映射為ctrl-x,用于結(jié)束編輯。在EFI下ctrl-x輸入不了,可以用F5代替。
- F6 - 切換到到下一個控件。一般用TAB也可以實現(xiàn)類似功能。不過在雙終端模式下,TAB用于自動完成,要在兩個終端間切換就需要使用F6。
- F8 - 在文本和圖形模式之間切換。
- F9 - 關(guān)機
- F10 - 重啟
- ESC - 在彈出窗口里返回
以下段落描述風(fēng)格文件的格式。
基本結(jié)構(gòu)
風(fēng)格文件的格式非常簡單,{}用來開始一個自結(jié)點,而 = 用于設(shè)置屬性的值,例如:
screen { panel { extend = 1 valign = center halign = center panel { class = frame id = __menu__ } }}mapkey { f5 = ctrl-x}
風(fēng)格文件里最頂層的元素定義了一個段,每個段有固定的功能。比如說,screen段里定義屏幕布局,而mapkey段里定義按鍵映射。
有兩個命令可以裝載風(fēng)格文件,load_config和merge_config:
load_config /boot/grub/default.txt
load_config和merge_config的區(qū)別在于,在某個段已經(jīng)存在的情況下,load_config會用新的內(nèi)容來覆蓋,而merge_config會合并新舊內(nèi)容。
數(shù)據(jù)表示
風(fēng)格文件的是同時支持圖形和文本模式的,因此屬性通常由多個部分組成,以適應(yīng)不同的環(huán)境。
大小
所有表示大小的屬性都使用類似的表示方式:
10
10個字符大小,在文本和圖形模式下都適用。圖形模式下,字符大小是使用系統(tǒng)缺省字體來計算。缺省字體用變量gfxfont來指定。另外,1字符單元在橫向和縱向上的大小是不一樣的。
10%
大小是父控件寬/高的10%,在文本和圖形模式下都適用。
10/1
圖形模式下是10像素,文本模式下是1字符。另外,兩個部分都可以換為百分比格式,例如:
10%/20%
圖形模式下是10%,文本模式下是20%。
顏色
red
紅色,在文本和圖形模式下都適用。
支持的顏色名字有以下這些。在文本模式下,只有前面一組顏色可以作為背景顏色:
- black, blue, green, cyan, red, magenta, brown, light-gray
- dark-gray, light-blue, light-green, light-cyan, light-red, light-magenta, yellow, white
red/blue
前景顏色紅色,背景顏色藍色。在文本和圖形模式下都適用。
#808080/red/blue
圖形模式下,使用RGB顏色#808080。在文本模式下,前景顏色紅色,背景顏色藍色。
某個命令如果有關(guān)聯(lián)的命令的話,它就可以被選擇??梢栽谕ǔ顟B(tài)和被選擇狀態(tài)下使用不同的顏色值,方法是用:號把兩個顏色連起來:
cyan/blue:light-gray/blue
在被選擇狀態(tài)下,前景白色,背景藍色。在一般狀態(tài)下,前景青色,背景藍色。
圖片
,,blue,#0
藍色的色塊。在文本和圖形模式下都適用。
,,blue,c
藍色的矩形,用c字符來填充。在文本和圖形模式下都適用。
,,blue,#0x250F
藍色的矩形,用unicode 0x250F字符來填充。在文本和圖形模式下都適用。
/splash.png,,blue,#0
圖形模式下,顯示圖像/splash.png。在文本模式下,顯示藍色色塊。
/splash.png,,blue
圖形模式下,顯示圖像/splash.png。在文本模式下,什么都不顯示。
/splash.png
同上,不過使用缺省的縮放模式和填充顏色。
none,,blue,#0
在圖形模式下什么都不顯示,在文本模式下顯示藍色色塊。
在上面的例子里,第二個參數(shù)都是空的。這個參數(shù)是用來指定縮放模式的,可以取以下的值:
- scaling (缺省) - 縮放圖像以適應(yīng)控件的長和寬。
- center - 把圖像顯示在正中。
- tiling - 瓷磚模式。重復(fù)圖像以至于覆蓋控件。
- minfit - 最小化等比例防縮。保證整個圖像都被顯示,不過在左右/上下邊界可能留有空白。
- maxfit - 最大化等比例防縮。保證沒有空白,不過部分圖像可能被切割。
在留有空白的情況下(center和minfit),用第三個參數(shù)的顏色來進行填充。
和顏色值類似,你可以用:來連接兩個圖像值,以在一般狀態(tài)和被選擇狀態(tài)下使用不同的圖像:
,,cyan/blue,#0x250F:,,light-gray/blue,#0x2554
公有屬性
有一些屬性是所有控件都具有的,這包括布局管理器專用的屬性,command,anchor和class。
布局管理器
控件的定位有兩種方式,你可以直接設(shè)定它的位置,也可以讓布局管理器來自動計算。
在直接定位時,可以使用以下的屬性:
- attach_top - 到父控件上邊界的距離
- attach_bottom - 到父控件下邊界的距離
- attach_left - 到父控件左邊界的距離
- attach_right - 到父控件又邊界的距離
- attach_hcenter - 離父控件水平中心線的位移
- attach_vcenter - 離父控件水平垂直中心線的位移
如果以上屬性都沒有設(shè)置時,布局管理器會試圖自動計算位置,你可以用以下屬性來加以控制:
- extend - 設(shè)為1時,在父控件擴展方向上延伸。
- valign - 垂直對齊方式,可以為 top, center, bottom 或者 extend (缺省)。
- halign - 水平對齊方式,可以為 left, center, right 或者 extend (缺省)。
父控件則使用以下屬性來控制子控件的擺放:
- direction - 擴展方向,可以是 top_to_bottom (缺省), bottom_to_top, left_to_right 或者 right_to_left.
- space - 兩個相連子控件間保留的空間
控件大小可以用以下屬性來指定:
- width - 控件的寬
- height - 控件的高
如果以上屬性沒有指定,布局管理器會試圖自動計算寬/高。在一般情況下,它會取恰好能包含子控件的最小的值,不過在extend為1時,它會橫向/縱向延伸。
有時,你想讓布局管理器自動計算控件大小。不過不想得到過大或者過小的值,以至影響外觀。在這種情況下,你可以用以下值來設(shè)置限制:
- minimum_width - 控件的最小寬度
- maximum_width - 控件的最大寬度
- minimum_height - 控件的最小高度
- maximum_height - 控件的最大高度
以上屬性在直接指定width/height屬性的情況下是無效的。
Command
command屬性為控件增加關(guān)聯(lián)的命令。一旦設(shè)置以后,控件就變?yōu)榭蛇x則的。用方向鍵可以在可選控件間切換。回車鍵則運行當(dāng)前控件的命令。
用\n分割符可以在command里指定多行命令,例如:
command = "chainloader +1\nboot"
Anchor
有時你需要把可選控件分組。比如說,把同一個菜單里的菜單項為一組,則在第一個菜單項里用向前鍵就會跳會最后一項而不是離開菜單。這個可以通過在菜單總結(jié)點里設(shè)定屬性anchor=1來實現(xiàn)。用TAB鍵可以在不同的組間切換。
Class
有許多控件共享一樣的屬性設(shè)置。比如說,邊框的設(shè)置在很多情況下都是一樣的??梢栽O(shè)置class,對應(yīng)的屬性在class段里尋找,這樣可以避免大量重復(fù)的設(shè)置。
即使是沒有class屬性,系統(tǒng)也會以控件的類名來搜索class段,以找到缺省屬性。
screen { panel { class = frame } panel { class = frame }}class { frame { top_left = ",,cyan/blue,#0x250F:,,light-gray/blue,#0x2554" top = ",tiling,cyan/blue,#0x2501:,,light-gray/blue,#0x2550" top_right = ",,cyan/blue,#0x2513:,,light-gray/blue,#0x2557" left = ",tiling,cyan/blue,#0x2503:,,light-gray/blue,#0x2551" right = ",tiling,cyan/blue,#0x2503:,,light-gray/blue,#0x2551" bottom_left = ",,cyan/blue,#0x2517:,,light-gray/blue,#0x255A" bottom = ",tiling,cyan/blue,#0x2501:,,light-gray/blue,#0x2550" bottom_right = ",tiling,cyan/blue,#0x251B:,,light-gray/blue,#0x255D" } screen { background = ":,,blue,#0" }}
控件
控件是組成用戶界面的基本單元。每個控件都有一定的屬性值來控制其行為。
panel
panel是一個容器。你可以為panel設(shè)置邊框。總共有四組邊框,從外到里分別是:
- padding_size, padding_top, padding_bottom, padding_left, padding_right - 在邊框外保留的空間。padding_size 同時設(shè)置四邊的值,你也可以用padding_top等來覆蓋某些邊。
- border_color, border_size, border_top, border_bottom, border_left, border_right - 第二層,由單一顏色的色條組成。
- top_left, top, top_right, left, right, bottom_left, bottom, bottom_right - 第三層,由8個邊框圖像組成。
- margin_size, margin_top, margin_bottom, margin_left, margin_right - 邊框里保留的空間,可以避免子控件過于接近邊界。
- background - 背景圖片,覆蓋控件的內(nèi)部空間。
screen
screen是最頂層控件,代表整個屏幕。它的屬性意義和panel相同,不過只使用了margin_*和background。
text
text是顯示單行文本的控件,支持以下的屬性:
- text - 顯示的文本
- gfx_text - 在圖形模式下顯示的文本。如果沒有設(shè)置的話,文本和圖形模式顯示同樣的文本。
- color - 文本顏色
- font - 文本字體
image
image是顯示單個圖像的控件,支持以下的屬性:
- image - 顯示的圖像
edit
edit是顯示編輯框的控件,支持以下的屬性:
- max_lines - 最多保存得行數(shù)。max_lines=1 指定單行編輯模式。max_lines=0 不限制最大行數(shù)。如果沒有設(shè)置的話,使用缺省值100。
- lines - 屏幕上顯示得行數(shù)。這個用于計算控件的高度,不要和height一起使用。
- columns - 屏幕上顯示得列數(shù)。這個用于計算控件的寬度,不要和width一起使用。
- text - 開始顯示的文本,用\n指定多行文本。
- color - 文本顏色。
- font - 文本字體。
在edit控件里,使用ctrl-x鍵保存結(jié)果,ESC取消。
term
終端窗口,支持的屬性和edit是一樣。
password
密碼輸入框,和單行編輯框類似,不過輸入時顯示*而不是真正得內(nèi)容。支持columns, color和font屬性。
progressbar
進度條控件,支持以下屬性:
- color - 進度條顏色??梢杂?來指定兩種顏色。第一個對應(yīng)已經(jīng)度過的時間,而第二個對應(yīng)剩余的時間。
模板
模板用于定義組合控件,例如:
dialog_hello { panel { parameters = "text=text.text" class = frame text {} }}
parameters屬性定義模板的輸入?yún)?shù)和內(nèi)部控件的屬性的映射。有些模板是在系統(tǒng)內(nèi)部使用,它們必須要在風(fēng)格文件里定義。
- dialog_message - 顯示一個信息窗口,text參數(shù)里指定顯示的內(nèi)容。
- dialog_password - 顯示密碼輸入框。username參數(shù)指定用戶名,password參數(shù)指定密碼。
- template_submenu - 生成子菜單的模板。
- template_menuite - 生成菜單項的模板。title參數(shù)指定標題文本,class參數(shù)指定類型。
以下是缺省風(fēng)格文件里的定義:
dialog_message { panel { parameters = "text=text.text" class = frame margin_size = 1 margin_bottom = 0 space = 1 attach_hcenter = 0 attach_vcenter = 0 text {} panel { class = frame command = true halign = center margin_left = 1 margin_right = 1 text { text = OK } } }}dialog_password { panel { parameters = "username=__user__.text:password=__pass__.text" class = frame margin_size = 1 margin_bottom = 0 attach_hcenter = 0 attach_vcenter = 0 panel { direction = left_to_right space = 1 text { extend = 1 valign = center text = Username } panel { class = frame margin_left = 1 margin_right = 1 edit { id = __user__ max_lines = 1 } } } panel { direction = left_to_right space = 1 text { extend = 1 valign = center text = Password } panel { class = frame margin_left = 1 margin_right = 1 password { id = __pass__ } } } panel { class = frame command = true halign = center margin_left = 1 margin_right = 1 text { text = OK } } }}template_submenu { panel { class = frame }}template_menuitem { panel { parameters = "class=image.class:title=text.text" class = select direction = left_to_right image {} text { valign = center } }}
這個風(fēng)格把字菜單顯示在父菜單的旁邊,如果要全屏顯示子菜單,可以用以下的模板。
template_submenu { panel { absolute = 1 width = 100% height = 100% panel { id = __child__ class = frame valign = center halign = center extend = 1 } }}
這里,absolute=1 指定不要以父菜單為基礎(chǔ)調(diào)整子菜單的位置,而id為child的控件標明菜單項插入的位置。
使用模板后,屏幕的設(shè)置非常簡單:
screen { panel { extend = 1 valign = center halign = center panel { class = frame id = __menu__ } }}
id為menu的控件是主菜單插入的地方。
你可以用menu_popup命令來使用模板建立對話框。比如,要彈出hello world的信息框,可以使用dialog_message模板:
menu_popup dialog_message "text=Hello, World"
menu_edit和menu_popup很類似,不過它使用雙向的參數(shù)傳遞,可以用來在線編輯控件的屬性值。首先,定義模板dialog_edit:
dialog_edit { panel { parameters = "text=edit.text" class = frame width = 80% attach_hcenter = 0 attach_vcenter = 0 edit { lines = 10 } }}
然后,用以下命令彈出編輯框:
menu_edit dialog_edit text=command
進入時,編輯框內(nèi)容設(shè)為當(dāng)前控件的command屬性值。在編輯完成后,把編輯框的內(nèi)容設(shè)置回command屬性里。
定義熱鍵
用 keymap 段可以映射按鍵,主要用于某些系統(tǒng)如EFI下ctrl組合無法輸入的情形。
用 onkey 段可以把某些鍵關(guān)聯(lián)到grub命令。如果該鍵已經(jīng)被當(dāng)前控件使用,則onkey里的定義被忽略。比如說,在終端窗口中,c表示一般的字符輸入,打開終端窗口的命令被忽略。以下是風(fēng)格文件里熱鍵的定義:
onkey { e = "*menu_edit dialog_edit text=command" t = "if menu_edit dialog_line text=title; then menu_refresh; fi" c = "*menu_popup term_window" 2 = "*menu_popup two_term" f6 = ui_next_anchor f8 = menu_toggle_mode f9 = halt f10 = reboot}mapkey { f5 = ctrl-x}
命令前的*字符表示該命令是受密碼保護的,具體的在下一節(jié)介紹。
密碼
要啟動密碼保護,需要在grub.cfg前加上以下的命令:
set superusers=adminpassword --md5 admin '$1$A1tpOB3$bTHEMeIVvBbQsLZIWmJp/.'password user1 user1
superusers變量設(shè)置超級用戶。password命令為個別用戶設(shè)置密碼。帶--md5參數(shù)時使用md5密碼。
要生成md5密碼,可以用grub-mkpasswd命令,例如:
grub-mkpasswd admin
輸出:
$1$A1tpOB3$bTHEMeIVvBbQsLZIWmJp/.
也可以用openssl命令來生成:
openssl passwd -1 -salt 1234567 admin
輸出:
$1$1234567$ergpnZu0mLdD77Dbmwjpb1
要保護某個啟動項,在menuentry里加上--users選項:
menuentry Item1 --users user1 { true}
只有user1和超級用戶可以使用這一項。
在熱鍵定義中,如果某個命令前加上*,則只有超級用戶可以運行該命令。
保存缺省啟動項
要保存缺省啟動項,首先需要用grub-editenv生成環(huán)境文件:
sudo grub-editenv /boot/grub/grubenv create
環(huán)境文件的缺省位置是grub目錄下的grubenv,你也可以用 變量envfile來覆蓋。命令load_env用于導(dǎo)入環(huán)境文件。
要在所有菜單項里使用保存功能,只需要在grub.cfg里設(shè)置savedefault=1就行了。要跳過某些項,可以在menuentry里加上--nosave。也可以用相反的方式。不設(shè)置savedefault的值,而在需要保存的項里加上--save。例如:
set envfile=/boot/grub/grubenvset savedefault=1load_envmenuentry Item1 --nosave { true}menuentry Item2 --save { true}
自動啟動
用timeout變量可以讓系統(tǒng)自動啟動如果在N秒內(nèi)沒有按鍵。
set timeout=5
如果timeout為0,則馬上啟動。但你也可以在啟動前按下任何鍵來中斷。在timeout=0時,不會顯示菜單,除非是自動啟動被中斷。
菜單圖標
在菜單項里加上圖標,可以使用--class選項,例如:
menuentry Item1 --class image_ubuntu { true}
在風(fēng)格文件里,還要定義對應(yīng)的圖標:
class { image_ubuntu { image = "/boot/grub/ubuntu.png" }}
缺省菜單
你可以把一個缺省菜單添加到menuentry定義的啟動項后。缺省菜單在風(fēng)格文件里定義,使用menu段:
menu { Tools { class = image_dir users = user save = 0 "Toggle Mode" { class = image_tools command = menu_toggle_mode } "Terminal" { class = image_term command = "menu_popup term_window" } "Two Term" { class = image_term command = "menu_popup two_term" } "About" { class = image_about command = "menu_popup dialog_message \"text=This is GNU GRUB\"" } } Shutdown { class = image_shutdown command = "halt" } Restart { class = image_restart command = "reboot" }}
這里,class屬性對應(yīng)于menuentry里的--class選項,users對應(yīng)于--users選項,而save=1/save=0對應(yīng)于--save和--nosave。