第 172 期 遠端管理 VirtualBox 的神兵利器—RemoteBox─自由軟體鑄造場電子報─智邦公益電子報
enews.url.com.tw · February 07,2012【Qt 自由軟體開發與智慧型手機應用研討會】即日起開放報名!
洪華超/文
Qt 是一個功能豐富的程式開發套件,被廣泛運用於 GUI 程式的開發,並以傑出的互動介面受到各方的讚譽,除此之外、Qt 可以協助程式設計師在跨平台的作業系統與機器上實作他們的構想和創意。本次的 Qt 程式開發研討會,自由軟體鑄造場邀請到暨南大學資工系、NOKIA Taiwan,以及 MOVIAL Taiwan 一起合作舉辦,活動內容針對 Qt 的程式開發作深入淺出的介紹,讓國內對於 Qt 程式開發有興趣的朋友,可以透過專職講師一日的精萃解說,便得以初探使用 Qt、以及採用 Qt 進行程式開發方面的實作技巧。活動即日起開放報名,與會者得以全程免費參與,名額有限、請有興趣的朋友儘早完成報名以免向隅!
◎ 活動時間:2011 年 5 月 27 日(五) 9:00 ~ 17:30
◎ 活動地點:中央研究院資訊科學研究所 106 會議室 (http://www.iis.sinica.edu.tw/page/aboutus/Location.html?lang=zh)
◎ 主辦單位:中研院-資創中心-自由軟體鑄造場 (Open Source Software Foundry, OSSF)
◎ 協辦單位:國立暨南國際大學資訊工程系、NOKIA Taiwan、MOVIAL Taiwan
◎ 活動網頁:http://www.openfoundry.org/tw/workshop/details/146
優游自在的「台灣 GNOME User Group」
謝沐璇/採訪
GNOME 的全名是 The GNU Network Object Model Environment,其與 KDE(註一) 並列為 X Window 系統下表現優異、功能齊備的二大圖像式桌面系統之一。而其英文全稱裡的 GNU 一詞 (註二),已將 GNOME 在自由軟體運動裡的重要地位彰顯出來,就像其他 GNU 專案一般,GNOME 計畫也是由數百位散居各地的志願者透過群體共工的方式進行開發,它使用 GIMP Toolkit (GTK+) 作為開發基礎,開發哲學為「提供給使用者易於操作的桌面系統」!在這個簡單易用的設計原則下,GNOME 近年吸引到大量的志願人力投入它的程式開發,所以在功能的穩定及操作的便利上,都得到極大程度的改善。其後、GNOME 被同樣基於「易用哲學」作為開發主軸的 Ubuntu 選為預設桌面系統,此舉對於 GNOME 桌面系統的應用幅度與使用對象方面,產生了非常正面的效應。
「台灣 GNOME User Group」的成立經過
因應 GNOME 日漸擴大的應用風潮,國內的自由軟體社群,也在 2010 年時催生成立「台灣 GNOME User Group(以下簡稱為 GNOME TW)」。GNOME TW 是一個台灣在地化的 GNOME 使用者社群,它的成立緣由可以回顧到在 2010 年 8 月由「開源人年會」與「GNOME 亞洲峰會」一同舉辦的「COSCUP / GNOME.Asia 2010」國際研討會。在這個為期二天的聯合活動中,集結了上千位國內外自由軟體的使用者、開發者,與推廣者。國內的自由軟體參與者,也在這次合作舉辦的機會下,分別接觸到來自北京、香港、印度等地的 GNOME 使用者社群,並從互動過程中吸收其他地區 GNOME 愛好者經營社群的經驗,於是會後經過數位自由軟體志士包括 Pofeng、Pockey、Rex、Emily、Max、FourDollars、Yuren Ju、Honki、震寧、Eric、Rock 黃、pingoo、Franklin、imacat 等人的奔走與努力,與 GNOME 基金會(註三)簽定合約,成功的在國內成立 GNOME 基金會官方認可的「台灣 GNOME User Group」,並且在 GNOME 基金會的贊助下取得了正統的 gnome.tw 網域名稱。
GNOME TW 的運作與交流模式
透過 gnome.tw 這個專屬網址,GNOME TW 為國內 GNOME 桌面系統的使用者建立了運作順暢的資訊記錄與交流平台。任何人只要有興趣、有意願都可以加入「gnome-tw-list」的郵遞論壇 (http://mail.gnome.org/mailman/listinfo/gnome-tw-list),以收發電子郵件的方式與其他社群成員交換訊息,喜歡透過 IRC 方式分享資訊的朋友,也可以登入「#gnome-tw@freenode」這個 Channel 暢所欲言,GNOME TW 透過這二種方式,持續吸納多方意見,以達到資訊共享以及凝聚共識的設立目的。而除了在線上進行交流互動,GNOME TW 也固定於每個月的第一個週二舉辦實體聚會,場地視情況挑選靠近台北捷運南京東路站的果子咖啡,或是古亭站的 Mix Coffee & Tea,而個性優游自在的 GNOME TW 參與成員,其在聚會中從未預先設定特定目標或主題,取而代之的是鼓勵與會者現場主動提報議題,讓大家可以天馬行空的發揮臨場機智,並與聚會中其他成員面對面的分享不設限的群體創意。
GNOME TW 歡迎同好現身
雖然看似輕鬆閑暇,但 GNOME TW 自成立以來,靠著社群成員的熱情貢獻,也擬定了若干推廣 GNOME 的具體計畫並逐一執行中。在培養技術人才方面,已成功舉辦了數場 GTK+ 的開發教學講座,而在增加使用族群方面,則有教育導向的 GNOME-EDU 以及 GNOME 中文化二個子專案(註四)都在同步進行中。除此之外,GNOME TW 亦在 2011 年 4 月 7 日,與自由軟體鑄造場合作,以影像直播的方式,串聯台北、台中、高雄、香港、北京五地的使用者,聯手舉辦 GNOME 3 發行慶祝會,與全球同步聯歡。對於成立還未屆滿一年的 GNOME TW 而言,未來還有許多規劃等著逐一踏實:諸如翻譯更多重要文件、加速使用者回饋 GNOME 操作經驗的管道、邀集具開發能力的朋友一同撰寫具在地化需求的套件程式,或鼓勵使用者協助參與相關套件的測試與修正等。除了上述的方式,GNOME TW 亦歡迎使用者透過各種不同的方式來支持他們,各種建議意見都可以透過前述郵遞論壇以及 IRC Channel 的方式提供給他們,而如果時間許可的話,亦歡迎大家可以在每個月第一個週二的晚上,依據 gnome.tw 活動頁面上的公佈資訊,到咖啡廳加入 GNOME TW 的社群聚會,相信必定能為您帶來收穫豐碩的社群參與經驗!
註一:KDE 使用 Qt 進行開發,以功能華麗為其特色,在國內亦有專職推動 KDE 的使用者社群,有興趣的朋友可以參照 KDE 正體中文資源網:http://kde.linux.org.tw/,以檢閱相關資訊。
註二:GNU 一詞表彰 GNOME 為革奴總計畫 (The GNU Project) 下之子開發專案,GNU Project 的目標在於創造一個近似 Unix、但性屬自由軟體的作業系統,進一步的說明可參照 Richard M. Stallman 所撰寫的正式說明文件:http://www.gnu.org/gnu/thegnuproject.html。
註三:GNOME 基金會 (http://gnome.org/) 成立於 2000 年,除了扮演公關角色負責提供媒體相關資訊外,也贊助各地的 GNOME 社群舉辦技術分享或推廣性質研討會,是一個統合各地 GNOME 社群幫助 GNOME 專案發展的協同組織。
註四:GNOME-EDU 進行使用者經驗的問卷調查,並在分析之後將問卷結果導入可施行的教育專案裡;GNOME 中文化則是透過 Tryneeds 中文化平台,網羅國內的翻譯人才共同來從事 GNOME 桌面系統的中文化工作 (http://tryneeds.westart.tw/tryneeds/project/show/project_id/10)。
照片來源:攝影師 Annie 金魚 ( www.wretch.cc/blog/goldfish5413... )
FreeBSD 基礎設定(中)
Weithenn (http://www.weithenn.org/)/文
前言
在上一篇文章 FreeBSD 基礎設定(上),我們已經安裝及設定好主機的使用者帳號、網路資訊,以及啟動 FreeBSD 主機上 SSH 服務。經由上述的設定,FreeBSD 主機目前已經具備網路連通能力。而管理者也可以透過遠端登入管理主機了。接下來在本文中將會實作安裝 sudo 套件來限制及記錄管理者帳號 root 的使用狀況,並且建立便於操作的 Shell 執行環境。在文章最後則會將套件資料庫 Ports Tree 安裝來源指向到台灣本地鏡像網站,以便縮短相關軟體套件的下載時間。
在 Unix-Like 作業系統中,root 使用者帳號被稱為超級使用者帳號,如同 Microsoft Windows 的 Administrator 帳號,是作業系統中權限最大的管理帳號。系統管理帳號的權限到底有多大呢?它的權限大到您可以使用簡單的幾個字便可以自行摧毀作業系統(rm –rf /,此動作在 Microsoft Windows 中是無法辦到的)。由於 root 超級使用者帳號權限如此之大,強烈建議您使用一般使用者帳號登入主機進行操作,待需要提升權限時才切換為管理帳號,以免因為一時疏忽造成系統損壞。
在 FreeBSD 系統中當一般使用者帳號被加入 wheel 群組,表示該使用者帳號具有可以切換為管理帳號的權限。當使用一般使用者帳號遠端登入主機進行操作時,需要切換為管理帳號時只要輸入指令 su – 即可進行帳號轉換提升權限的動作。但是如果您的 FreeBSD 主機為多人共同管理時,這樣的身份切換方式就會造成管理上的困擾。例如您無法在事後得知是哪個使用者在哪個時間切換為 root 管理帳號,並且得知執行了哪些指令,因而想針對不同使用者設定不同的系統存取權限。上述狀況在多人共同管理同一部主機的情況下,內建的身份切換指令 su 是無法達成的,因此我們可以透過安裝 sudo 軟體套件來達成這樣的需求。
Sudo 套件就是為了彌補作業系統中內建的身份切換指令 su 不足所發展出來的軟體套件。透過安裝此套件後我們可以建立相關的使用者權限群組,並給予不同權限的指令來達到控管使用者權限的目的,配合相關設定,我們可以隨時查閱哪位使用者執行過 sudo 指令並對主機做了哪些動作,以便進行事後的追查。
對於 Unix-like 作業系統不熟悉的使用者,可能不知道 Shell 是什麼。簡單來說,Shell 就是介面軟體,提供使用者能夠存取作業系統核心功能。這樣的說明相信有些讀者可能看得很模糊。舉例來說,您要編輯一個 PHP 檔案,若您採用 Windows 內建的筆記本程式,或者是使用專門用來編輯程式語言檔案的 UltraEdit 程式來編輯檔案,兩者相比較,相信在操作與編輯流暢度來說絕對是 UltraEdit 勝出。同樣的道理,若使用作業系統中最基本的 Shell (sh) 與您設定好相關參數及環境設定的 Shell(例如 tcsh 或 bash)來比較時,絕對是設定好相關功能的 Shell 能夠有效幫助您操作以及管理作業系統。本文將以設定 TENEX C Shell (tcsh) 來進行說明。
Ports Tree 為 FreeBSD 下套件管理工具,其中收集的軟體套件種類非常繁多。因此當您需要安裝軟體套件時不用費心在網路上尋找相關套件,您只需要切換到相關的目錄下並執行安裝指令即可自動安裝完成,並且在安裝過程中若有相依套件時,系統會自行下載及安裝,當發生套件相依性問題也會自動嘗試解決。預設的情況下,軟體套件指定的伺服器位址在國外,然而這樣的設定會使得位於台灣的主機下載套件的時間拉長,此時我們便可以透過修改設定檔將伺服器位址指定為國內鏡像網站,如此一來將可有效縮短套件下載時間。
安裝及設定 Sudo 套件
實作環境
* FreeBSD 8.2 Release
* sudo-1.7.4.6
遠端登入主機後請執行 cd 指令切換至安裝 sudo 軟體套件的路徑後,執行安裝指令即可安裝套件。下列安裝指令中 make install clean 其實是 make install 加上 make clean 二個指令所合併而成的短指令語法,此指令表示先執行安裝套件的動作,當系統下載好軟體套件要安裝前,會將套件解壓縮,因此會產生相關暫存檔案,所以當安裝套件完成之後,系統會接著清除相關暫存檔案。
▲ 圖1 安裝 sudo 套件
安裝套件完畢後請使用指令 visudo 來修改 sudo 設定檔內容,請不要使用 vi 進行修改。原因在於當執行 visudo 指令後系統會自行找到 sudo 設定檔 /usr/local/etc/sudoers 且自動進入修改模式。當我們修改完成後若設定檔內容中有發生語法或斷行等錯誤時,系統會跳出警告訊息提醒我們哪裡發生錯誤。在此次實作中我們會修改到的 sudo 設定檔內容為將 wheel 群組那行的註解符號拿掉,以及加上 Log 記錄檔的內容。另外要注意的是,當設定檔修改完畢後,由於指定的 sudo 記錄檔目前並不存在於系統中,因此請手動建立該檔案。相關操作如下所示:
▲ 圖2 修改 sudo 設定
上述 sudo 設定檔內容中表示加入 wheel 群組的使用者可以使用 sudo 指令來切換為管理者帳號。當使用者第一次使用 sudo 指令時系統會再次詢問使用者密碼,當成功通過密碼驗證之後便會切換為管理者帳號 root 來執行其指令,並且在 5 分鐘之內若該使用者再次執行 sudo 指令時系統便不會再詢問密碼。接著我們可以測試 sudo 記錄檔是否正常運作,另外開啟一個 SSH Client 視窗並使用一般使用者帳號進行遠端登入。例如使用 weithenn 這個一般使用者帳號(已加入 wheel 群組)登入系統並嘗試再次安裝 sudo 套件,相信會得到權限被拒絕 (Permission denied) 的錯誤訊息回應。此時您可以使用 sudo 搭配安裝指令再次執行即可進行再次安裝(系統會顯示該套件已安裝過)。當執行安裝指令完畢後,請查看 sudo 記錄檔便會看到相關的記錄內容。
▲ 圖3 測試 sudo 記錄功能是否運作
經由上述的驗證動作後我們可以確定 sudo 記錄檔機制目前正確運作中,而且您可以從 sudo 記錄檔中清楚得知是在什麼時間點 (Mar 15 16:27:24)、哪個使用者帳號 (weithenn)、在哪台主機 (bsd82)、從遠端登入此台主機 (pts/0)、在系統中哪個路徑 (/usr/ports/security/sudo)、切換成什麼身份 (root)、執行什麼指令 (make install clean)。
若您覺得 sudo 記錄檔中的資訊仍然有不足的地方,例如使用者執行指令 sudo su – 直接切換為 root 身份,如此一來後續所執行的指令便不會記錄在 sudo 記錄檔內,您可透過 lastcomm 指令來查看每一位登入主機的使用者在登入期間執行的詳細指令內容。但要執行 lastcomm 指令之前要先將啟動此功能的參數加入至 /etc/rc.conf 設定檔中,並啟動該服務才能正確運作。
▲ 圖4 啟動 accounting 服務記錄使用者動作
待 accounting 服務啟動後,系統便會將每一位登入主機的使用者,在主機上執行指令的歷程記錄存放於 /var/account/acct 檔案中,您便可以隨時使用指令 lastcomm 來查看每個使用者登入主機的執行狀況。並且,系統管理者可以隨時查看使用者的視窗畫面,即時觀察該使用者對主機進行哪些動作及指令執行結果。使用的方式很簡單,管理者先執行 w 指令來查看有哪些使用者登入此台主機,配合使用 watch 指令以及使用者的 TTY 名稱,即可將使用者目前的視窗畫面即時顯示於管理者視窗畫面上。
▲ 圖5 查看登入主機的使用者並抓取其視窗畫面
如上述說明,當管理者欲查看使用者 chris 的視窗操作畫面時,便可使用指令 watch pts/0 在管理者視窗畫面中即時顯示使用者 chris 操作畫面的一舉一動,管理者若想要回到自已的視窗畫面時請使用組合鍵 Ctrl + G 即可。
設定 tcsh Shell 操作環境
對於許多 Linux 的使用者來說,習慣的 Shell 應該是 bash (Bourne-Again Shell),而筆者個人則習慣於 tcsh Shell 環境下來管理機器。基本上使用哪種 Shell 全憑個人使用習慣即可,而下列的相關設定及環境參數也都將以筆者習慣的 tcsh Shell 來進行舉例說明。
FreeBSD 作業系統安裝完成後即內建有 sh、csh、tcsh 等 3 種 Shell(bash 需另行安裝),使用 tcsh Shell 在不設定任何參數的情況下便擁有使用【Tab】鍵自動補齊檔名及搜尋上一次輸入指令的功能。所謂【Tab】鍵補齊檔名功能,舉個例子來說,假如我們想要查看主機的網路資訊時,會鍵入 ifconfig 指令,在輸入 ifc 之後即按下【Tab】鍵,此時作業系統會尋找相關 ifc 開頭的指令,【Tab】補齊檔名功能便會自動補齊為 ifconfig 指令。補齊檔名功能不僅僅能使用於指令方面,對於檔案及目錄也具有相同的功能。以搜尋上一次輸入指令的功能為例,分別輸入了 ls 某個目錄內容及 cd 到某個目錄內,當您想要再次執行時只要打 ls 再按【上方向鍵】則 tcsh Shell 會自動找出最近執行過開頭為 ls 的指令,這樣的功能對於操作作業系統來說很方便。
除了預設的功能外我們可以設定 Shell 的環境變數來加強操作的便利性,以執行 ifconfig 指令來說,其實該指令的完整路徑為 /sbin/ifconfig,但是為何我們輸入 ifconfig 指令便可順利執行?這是因為預設的 tcsh Shell 環境設定檔已經將作業系統經常會使用到的指令路徑載入環境變數中,因此我們可以在不用鍵入絕對路徑的情況下直接執行相關指令。
以 tcsh Shell 來說當使用者登入 FreeBSD 主機後該使用者帳號會依序載入 /etc 的 csh.cshrc 及 csh.login 通用環境設定檔,再來則是載入個人家目錄下的 .cshrc 及 .login 個人環境設定檔。當通用環境設定檔與個人環境設定檔有衝突時會以套用個人環境設定檔為最後結果。以下為筆者個人習慣設定於 /etc/csh.cshrc 的通用環境設定檔內容:
▲ 圖6 tcsh Shell 通用環境設定檔內容
當您使用 tcsh Shell 之後若您在系統安裝套件後,請您記得執行 rehash 指令來重新建立系統的 Hash Table ,這樣便可直接執行相關指令,否則必須鍵入絕對路徑或重新登入系統才能正常執行,若安裝套件後未重新建立 Hash Table 便直接指令,將會得到無法找到指令 (Command not found) 的錯誤訊息。
設定 Ports Tree 環境
我們可以透過修改 /etc/make.conf 設定檔將 Ports Tree 鏡像網站指定至台灣境內各所大學。目前台灣可使用的鏡像網站共有 16 個,安裝軟體套件時即可就近下載,加快套件下載的速度。提醒您設定列表時,由於交大資工鏡像網站 (ftp.tw.freebsd.org) 很多人存取因而非常忙碌,為了避免塞車建議您不要將此站排在第一筆。
▲ 圖7 指定 Ports Tree 鏡像網站至台灣境內各所大學
完成上述設定之後當您需要安裝軟體套件時,若您知道套件名稱時可以透過指令 whereis 加上套件名稱來找到該套件的安裝路徑在哪裡。例如我們知道安裝套件的名稱為 sudo,就可以找到其安裝套件的完整路徑為 /usr/ports/security/sudo,如下所示
▲ 圖8 查看 sudo 指令及安裝路徑
若您不知道想要安裝套件的名稱或僅知道套件的關鍵字,那麼您可以透過在 Ports Tree 搜尋套件的方式來達成。如下所示我們要搜尋的套件關鍵字為 sudo,執行後系統便會將 Ports Tree 中有關 sudo 關鍵字的相關套件列出:
▲ 圖9 尋找相關套件
更新 Ports Tree
當系統使用一段時間後您想要安裝某個套件時,該套件或許已經釋出了相關安全性更新版本或者增加新功能的版本,此時我們可以在安裝套件以前先更新 Ports Tree 使得您安裝的套件得以保持在最新且穩定的版本。在本文中採用比老牌 CVSup 更新速度更快並以 C 語言重新改寫的 CSUP 套件更新工具。請先將相關參數設定新增於 /etc/make.conf 設定檔內。完成設定檔修改後接下來只要切換到 Ports Tree 目錄下執行更新指令,即可更新整個 Ports Tree 內所有套件資訊。在您執行更新 Ports Tree 動作後可以看到更新套件的站台位址、Ports Tree 版本、哪些套件其檔案被更新或刪除等相關資訊,提醒您當您更新 Ports Tree 完成後要安裝套件以前,請記得先行查看 /usr/ports/UPDATING 檔案了解更新 Ports Tree 日期及相關資訊,像是升級某套件需注意的事項等,並且在更新 Ports Tree 後記得更新 Ports Tree 的索引檔以便同時更新搜尋套件的索引內容。
▲ 圖10 修改 /etc/make.conf 設定檔並更新 Ports Tree
結語
本文討論了安裝 sudo 套件來限制及記錄管理者帳號 root 的使用記錄,並且搭配 lastcomm 及 watch 機制以了解使用者到底對作業系統做了什麼動作,並且透過設定 Shell 環境設定檔使得操作系統時的便利性提高並加快效率,在最後則是將安裝套件的來源指向至台灣本地鏡像網站,以加快軟體套件下載時間,也順道說明更新 Ports Tree 套件後需要注意的事項。
在下一篇文章中將討論 FreeBSD 如何進行套件的安全性更新作業,當主機上線運作如何定期將系統的相關記錄例如安全性記錄、磁碟空間使用狀況、登入資訊等定期寄送給管理人員,最後則是探討如何對遠端登入服務 SSH 做基本的安全性設定。
十本 Linux 核心開發書籍介紹
Rex/文
我相信絕大部分 Linux 開發者都會告訴你,Driver 的開發比 Linux Application 容易許多,即便寫驅動程式聽起來莫名偉大,其實也不過是一段 C/assembly 的組合程式碼。有別於桌面應用程式,Linux kernel API 較少因爲不同的新軟硬體規格,而進行大幅度 API 更動,反倒是參數的簡化倒是十分常見。由於是傑出的軟體開發者撰寫的核心架構,穩定性已經十分可靠。 相較於 userland 高度複雜的設定機制,Linux Kernel 暴露的界面十分簡單,在硬體穩定的前提之下,你也很難碰到 API 反應與預期不符合的處境。一般開發者對於核心驅動程式上手的時間,應該不會比開發桌面軟體來的更久。花費的時間應該多是在研讀硬體手冊,以及因不嚴謹的開發習慣造成臭蟲而所需的除錯時間。
對於深具經驗的開發者,在學習開發 Linux kernel driver 時,最快的方法莫過於直接解開 Kernel tarball,切進欲開發的 subsystem 目錄,拿出 global, vim, LXR 直接把現成程式碼當作範例學習,很快就可以理解程式結構。不過,偶爾還是需要參考書來驗證對於架構的理解是否正確,另外接觸新的 subsystem 時先閱讀入門文章也可以減少無謂的撞牆期。
所幸,幾位 Linux kernel hacker 也同時是傑出的文件作者。在 Linux kernel source tree 中已有一些各子系統的架構、操作參考文件,涵蓋了基本的 coding style、設計哲學等。另外,像是 Robert Love, Greg Kroah-Hartman (GregKH, PCI, USB maintainer) 等開發者也出版了完整的書籍,很值得參考。
不過市面上針對 Linux kernel 開發的書籍也不少,那一本是適合你的呢?這類的技術書籍,通常針對不同的讀者而有不同的書寫內容,有的偏重知識,有的偏重操作實務。出版版次也會影響所介紹的 API 差異,造成無法編譯其範例,但是也並不因為是舊書,所談之理論就不正確。
以下分享筆者對於市面上 2005 年之後出版的核心開發書籍的評論,希望對於想擴充團隊圖書館的朋友提供些參考。
▲ 圖1 《Linux Kernel in a Nutshell》書籍封面
《Linux Kernel in a Nutshell》是 2006 年底發行,作者是 GregKH,使用核心為 2.6.18,部分操作方式或指令已經略有更改。GregKH 基於讓更多新手參與開發行列,針對的讀者是從未編譯過 Linux kernel,想瞭解下載、設定、編譯需求等等細節,適合剛從其他平臺進入 Linux 核心開發的朋友,可以較快熟悉核心編譯的操作程序。書內主要介紹通用性知識,因此未提到各 distro 間安裝 kernel 的細節 (如 initrd 建制方式)。
LKN 已採 CC BY-SA 2.5 授權。電子書可於 GregKH 的網頁下載。
▲ 圖2 《Understanding the Linux Kernel, Third Edition》書籍封面
《Understanding the Linux Kernel, Third Edition》這本由兩位博士 Daniel P. Bovet 與 Marco Cesati 所撰寫,從 2000 年底出版之後,到 2005 已經是第三版,介紹的核心是 2.6.24。有中譯版。
此書結構以流水帳方式帶過各個子系統,但稍嫌膚淺的僅僅介紹表面的細節,未能給予概觀性的理論說明,也未能直指程式核心。篇幅常用於註記資料結構或函式用途,適合想尋著麵包屑理解 Linux kernel 運作的探險家使用。
▲ 圖3 《Professional Linux Kernel Architecture》書籍封面
《Professional Linux Kernel Architecture》在 2008 年出版,作者是 Wolfgang Mauerer,作者的背景是量子物理學家。在沒有社群內知名開發者的背書與協助下,他完成了一本巨大的書籍,篇幅高達 1368 頁。
有別於 UTLK,也許是為了非科班出生的讀者,作者試著詳盡的敘述作業系統的基本概念,另外一方面也以程式碼告訴讀者 Linux 的運作模式。
如果你讀不下純粹理論導向的作業系統教科書,而想透過 Linux 理解一個作業系統的設計原理,這是適合你的書。本書基於 Linux kernel 2.6.24。
▲ 圖4 《Linux Kernel Development (3rd Edition)》書籍封面
身為知名的 kernal hacker,Robert Love 在《Linux Kernel Development (3rd Edition)》一書中為讀者拆解 Linux kernel source tree,直接從設計理念切入,酌以程式碼輔助,讀者需要有作業系統理論素養以及 Linux 開發經驗,才能消化理解筆者的解剖。最新第三版發表於 2010 年,書中 Linux kernal 則更新到 2.6.34。
簡體中譯版《Linux 内核设计与实现》翻譯自《Linux Kernel Development》第二版。正體中文版有維科圖書有限公司出版沈中庸, 沈彥男翻譯的《Linux 核心開發指南, 2/e》。
▲ 圖5 《Linux Network Internals》書籍封面
《Linux Network Internals》的作者是 Christian Benvenuti,發表於 2005 年。少數專談 Linux Network stacks 的書籍,作者循序的從設定工具、核心啟動開始,逐一介紹封包傳送接受、Bridging、IPv4、Neighboring Subsystem 與 Routing。
書中涵蓋了 Layer 2、Layer 3 等協定, 可惜遺漏了 IPv6、IGMP、PIM、Traffic Control、Netfilter、Virtual devices (802.1Q, bonding, IPIP, GRE) 等等重要元件。讀者需要基本開發能力與網路協定常識才好上手。此書有中譯版。
▲ 圖6 《The Linux TCP/IP Stack: Networking for Embedded Systems 第一版》書籍封面
《The Linux TCP/IP Stack: Networking for Embedded Systems 第一版》發表於 2004 年,最新第二版則於 2006 年發表,針對的版本是 2.6.16,作者是 Thomas F. Herbert。此書對於讀者的定位不明。雖然意圖以一個章節討論嵌入式系統中的 TCP/IP Stack,但除了說明一般嵌入式系統需求外,缺乏實際有用資訊。
書籍想涵蓋各種 TCP/IP Stack 所涵蓋的項目,但章節設計雜亂,從基本的 Network Stack 開始介紹,對於 API 部分又缺乏系統性描述。既無法瞭解網路協定,或撰寫網路程式或作業系統核心架構。
書中時常夾雜敘述與程式碼,令讀者難以連貫消化,讀者需要開啟原始程式碼才能領會作者的思路。這是一本關於網路協定的原始碼註記,適合已具核心開發經驗的開發者參考使用,考量其版本日期,書籍的功能可能比自行追蹤程式碼的效用還差。另外,若你想瞭解嵌入式系統,這也不是你該買的書。
▲ 圖7 《Linux Device Drivers, 3rd Edition》書籍封面
《Linux Device Drivers, 3rd Edition》的作者是 Jonathan Corbet(LWN 的創辦人)、Alessandro Rubini、GregKH。即便 LDD3 已經出版許久,還是所有想寫 Linux kernel driver 的第一優先入門參考書。此書有中譯版。
《LDD3》務實的從實做範例開始,帶領讀者理解各種 subsystem,含括了入門操作與基本觀念,對於初次開發 loadable kernel module (LKM) 的開發者提供了燈塔般的指引。
《LDD3》授權採 CC BY-SA 2.0,線上版可於此下載 http://lwn.net/Kernel/LDD3/。但由於書籍年代較久,針對的核心版本為 2.6.10,書中範例需要一點調整才能正常運作。已有同好改了幾份擺在 github (jesstess, martinezjavier)。
▲ 圖8 《Essential Linux Device Drivers》書籍封面
《Essential Linux Device Drivers》的作者是長期在 IBM 工作的 Sreekrishnan Venkateswaran,參與 Linux Watch、PDA、Nurse Call Systems、Merlin Patient Care System 等等開發專案。有正體中譯版《Linux 驅動程式開發實戰》,以及簡體中譯版《精通 Linux 驅動程序開發》。
這本書是作者的實務工程筆記,出版於 2008 年,針對核心為 2.6.23/2.6.24,透過此書新手可以從中漫遊一個深具經驗的開發者,如何從原始碼迷霧之中理解 Linux device driver,老手或許可從雜亂的描述中再次驗證自己的理解。
雖然篇幅高達 744 頁,卻被引用程式碼佔了許多頁面。這本書不足以提供開發者撰寫驅動程式的基本觀念,也無法協助理解作業系統概觀。
作者另有一小冊 Debugging Linux Systems 電子書短短 90 頁,帶過幾個常見的核心除錯工具與技巧,很有實務參考價值。
▲ 圖9 《The Linux(R) Kernel Primer: A Top-Down Approach for x86 and PowerPC Architectures》書籍封面
《The Linux(R) Kernel Primer: A Top-Down Approach for x86 and PowerPC Architectures》出版於 2005 年,作者是 Claudia Salzberg Rodriguez, Gordon Fischer, Steven Smolski。有中文版,但評價頗差。
書名讓人非常期待總算有一本核心介紹書籍是講述 x86 外的硬體平臺,畢竟 RISC vs CISC 架構的不同,endianness、alignment、calling convention 等,應當有許多寫核心驅動程式應該注意的事項。但是整本書只在 2.2 節稍微說一下寫 Assembly 時,PowerPC、x86 的指令差異,剩下的細節根本沒提!
整本書還是著重在一般核心的結構介紹。
而書中除了少量的插圖之外,根本沒有多少邏輯上的說明跟描述。通篇拆解程式碼,對資料結構作註解。這些資訊任何有點基礎的工程師都可自行閱讀程式碼及程式碼註解。新入門工程師還可能因爲書中解釋而疑惑。
除非你想寫沒有價值的書評,否則不建議購買。
▲ 圖10 《Linux(R) Debugging and Performance Tuning: Tips and Techniques》書籍封面
《Linux(R) Debugging and Performance Tuning: Tips and Techniques》出版於 2005,作者是 Steve Best。此書以一般這類書籍少見的內容著手,內容除了應用程式之外,還包括從核心切入的除錯、效能測試,而這方面的技術資訊總是一下就過時了。
作者試著從基本的 Profiling 實務開始,介紹 gdb、應用程式記憶體管理,再講核心的各種資訊界面。很可惜,以一本專講除錯與效能測試的書來說,範例與介紹過於粗淺,以第十二章 Dynamic Probes 為例,其介紹深度可能還比不上 Documents/kprobes.txt 中的概念介紹與 IBM developerWorks 的範例介紹。
適合剛切換到 Linux 的開發者,從這本書可概略學得各種基本開發工具的入門資訊。
作者簡介
蔡志展 (Rex Tsai) 或網名 chihchun,現為自由工作者,從事開源軟體顧問或開發服務。倡議並推廣自由軟體與開放源碼,早期 KaLUG 成員,現常出席 Tossug、 HackingThursday 聚會,亦是開源人年會 (COSCUP) 籌備志工。長期 Debian、OpenWrt 使用者。關注議題甚廣,進一步資訊請參考 http://people.debian.org.tw/~chihchun/。用自由軟體 Plone 來架設網站(4)—建立專案
marr/文
在前篇文章裡,我們介紹了 Plone 的內部管理工具,講解透過 ZMI 的網頁介面,進行網站設定的方法,也說明了 GenericSetup 的基本原理。有了這些知識和練習,在檔案系統上撰寫客製化的程式碼,也就更容易上手。
Plone 使用一個稱為 Paste 的工具,協助開發人員建立網站專案。Paste 提供一系列的中介軟體和工具程式,透過 WSGI 標準介面來讓應用程式溝通,其中包括一個稱為 PasteScript 的模組,內含 paster 工具程式,可以用來建立模組軟體的骨架程式碼,並以 egg 檔案格式儲存。Paste 還可以單獨執行測試工作,不需要跟 server 程式綁在一起,目前廣泛被 Python 程式人員用於專案建置的場合。
在本文中,我們要模擬一個專案,專案的目標是建立一個網站,能夠新增活動資訊,並接受報名資料。我們將認識模組的命名空間,在檔案系統上,利用 paster 建立擴充模組的骨架,調整程式碼及設定值,以滿足上述的專案需求。
需求分析
從內容管理的角度來分析,專案裡要處理的資料,將被規劃成內容型別,例如活動資訊是具備 Folder 特性的 Event 型別,我們稱之為 Event Folder,它能夠包含稱為 Signup 的報名資料,這樣的設計,可以實作 1 對 N 的關係,也就是 1 個 Event Folder 包括 N 個 Signup 型別。
減少重造輪子,則是另一個重要原則,實作時善用既有的功能或模組,是聰明的方式。Plone 預設提供 Event 型別,可以做為 Event Folder 模仿的基礎,再把 Signup 型別搞定,我們主要的內容型別都自製完成。
上述的設計,可以利用 Archetypes 框架來實作,而且 paster 工具程式能協助簡化整個過程。不過,設計與實作的方式存在多種方案,我們試著先從最簡化的方案開始練習。
使用 paster 建立模組
實際使用 paster 時,通常要搭配 template 才方便,例如 Plone 的場合搭配 ZopeSkel 的 template,使用 Unified Installer 的話,已經完成 ZopeSkel 的安裝,執行 paster create --list-templates 指令,可以列出既有支援的 template 項目,如圖1 所示。
▲ 圖1 paster 所支援的 template 列表
我們需要的是 Archetypes 框架的 template,執行 paster create -t archetype 指令,再接模組的名稱,也就是 mysite.eventfolder,名稱前面的 mysite 是命名空間,如圖2 所示。
▲ 圖2 paster 建立 Archetypes 專案
paster 會顯示一些問題,多數以預設值回答就行,通常直接按 Enter 代表使用預設值,如圖3 所示。
▲ 圖3 Archetypes 專案建立時的預設問題
一切順利的話,模組的 egg 資訊完成建立,最後的畫面並提示有個 addcontent 的 local command 可以使用,如圖4 所示。
▲ 圖4 Archetypes 專案建立後的畫面
接著,編輯 buildout.cfg 檔案,分別在 eggs 與 zcml 的變數,指定 mysite.eventfolder 變數值,develop 變數則指定 src/mysite.eventfolder,如圖5 所示。
▲ 圖5 編輯 buildout.cfg 的部份參數值
由於我們處於模組開發階段,建議將 debug-mode 變數值指定為 on,在系統日誌檔裡,就會記錄更多有助於除錯的資訊,如圖6 所示。
▲ 圖6 編輯 buildout.cfg 的 debug-mode 參數值
儲存 buildout.cfg 檔案後,我們要執行 bin/buildout 指令,讓設定值生效,由於既有的自製模組並不牽涉網路上的資源,可以使用 off line 模式,也就是 -o 參數,來加速 buildout 的過程,如圖7 所示。
▲ 圖7 執行 buildout 讓設定值生效
模組目錄結構
現在,系統已經能夠認得我們的新模組,執行 bin/zopepy 指令,載入模組名稱,沒有出現 ImportError 的話,表示 Zope instance 已經能夠使用模組了,如圖8 所示。按 Ctrl-D 結果 zopepy 的執行。
▲ 圖8 執行 zopepy 指令的畫面
傳統的 Zope 2 應用程式,只要把程式專案放進 $INSTANCE_HOME/Products 目錄,Zope 就會在啟動時掃瞄這個目錄,並處理應用程式的安裝與註冊工作。這樣便利的方式有其缺點,一方面,搭配 Products.* 命名空間的黑魔法,只能被 Zope 系統認得,很難再應用於其他場合,另一方面,也造成命名空間的侷限,開發者不容易建立精簡而重用性高的模組。
Plone 在第 2 版與第 3 版之間,擴充模組的命名方式開始有所不同,Plone 2 常見的範例類似 PloneSurvey 或 WebServerAuth 這樣,但 Plone 3 常見的範例類似 Products.Maps 或 plonetheme.stylized 或 collective.indexing 這樣。我們自製的模組名稱,便使用 mysite 的命名空間,再加上 eventfolder 的名稱。
名稱之間以「.」符號隔開,在檔案系統裡,預設則以「/」符號及目錄架構來隔開。第一層的目錄裡,包括模組 egg 或 README.txt 之類的基本資訊,在 mysite 目錄裡,則包含第二層的 eventfolder 目錄,這裡才是實作細節的所在。如圖9 所示。
▲ 圖9 mysite.eventfolder 的目錄結構
自製模組執行 buildout 生效後,會向系統註冊一個 development egg,讓系統能夠啟用它,並在 etc/package-includes 目錄裡,建立一個 ZCML 設定檔,這樣的設定檔稱為 slug,內容範例如下:
<include package="mysite.eventfolder" file="configure.zcml" />
此時啟動 Plone 的話,從 Site Setup 前台管理介面,在 Add-ons 裡看得到這個新模組,如圖10 所示。不過,我們並不急著啟用它,因為還需要修改程式碼。
▲ 圖10 Add-ons 裡顯示模組的畫面
之前提過,Plone 所搭配的 GenericSetup,用到 base profile 和 extenstion profile 兩種設定方式,自製模組的場合,通常是註冊 extension profile,當 Zope 啟動時,會經由 ZCML slug 通知系統讀取新的設定值。
在我們的範例裡,檔案 mysite.eventfolder/mysite/eventfolder/configure.zcml 使用 provides 設定值,在 genericsetup:registerProfile 裡,註冊了 extension profile,它的名稱是 default,對應一個 profiles/default 目錄,它的標題是 Event Folder,如圖11 所示。
▲ 圖11 mysite/eventfolder/configure.zcml 內容
profile 的完整名稱,包括了模組名稱,也就是使用 mysite.eventfolder:default 形式,如果要在同一個模組裡註冊多個 extension profile,就必須使用不同的名稱和目錄。
在 profiles/default 目錄裡,看得到一些 XML 檔案,它們是 GenericSetup 執行時所讀取的設定內容。以 types.xml 為例,這個檔案用來註冊 portal_types 裡的新型別資訊。
為了新增我們需要的內容型別,要在模組目錄裡,繼續執行 paster 的指令,特別是利用 ZopeSkel 的 addcontent local command,如圖12 所示。
▲ 圖12 addcontent 的 local command 訊息
同樣的,addcontent 支援多種 template 項目,稍後,我們要用的是 contenttype 和 atschema,如圖13 所示。
▲ 圖13 addcontent 所支援的 template 列表
建立自製型別的過程,可以分成 content type 和 schema 兩個階段。
執行 paster addcontent contenttype 後,同樣會顯示一些問題,由於 Event Folder 被規劃成 folderish 特性,這項問題記得要指定 True 設定值,如圖14 所示。如果過程的選項弄錯了,可以按 Ctrl + C 強迫中斷,重頭再來一次。
▲ 圖14 addcontent contenttype 執行畫面
接著,執行 paster addcontent atschema 指令,請事先閱讀 Archetypes 的 field 和 widget 說明文件,以確保能夠選用最合適的欄位類型。
▲ 圖15 addcontent atschema 執行畫面
首先,要決定 content class 的檔案名稱,這個範例裡填的是 eventfolder,在檔案系統裡,它會以 eventfolder.py 檔名出現。然後,依序決定 field 的各項屬性值,在範例裡我們以 startDate 為名稱,指定它為 datetime 型別,其餘使用預設值,如圖16 所示。
▲ 圖16 field 設定畫面
paster 已經幫我們建立第一個 field 的骨架程式碼,如果想要建立第二個 field 的屬性值,可以重複上述的 addcontent atschema 指令,當然,也可以直接手動編輯 Python 原始檔,仿照骨架程式碼的內容,依樣畫葫蘆。
如果你急著想看看結果,執行 bin/plonectl fg 指令,以便除錯訊息能在前景顯示,如圖17 所示。
▲ 圖17 plonectl fg 執行畫面
一切順利的話,在 Plone 裡,已經可以從新增項目的下拉選單中,找到我們自製的內容型別,而且任一目錄裡都能執行新增動作,如圖18 所示。
▲ 圖18 新增項目裡找得到 Event Folder
新增 Event Folder 時,除了既有的 Title 和 Description 欄位外,編輯畫面也顯示我們建立的 Event Starts 欄位,如圖19 所示。
▲ 圖19 Event Folder 的編輯畫面
我們開始模擬一個小型專案,從需求分析開始,尋找合適的工具,修改系統成為想要的樣子,就像組合樂高積木一般。如果把 paster 建立骨架程式碼的過程,詳細記錄目錄檔案的資訊,並進行比對,就可以觀察模組開發的成長歷程。
以 mysite.eventfolder 的 Archetypes 專案為例,系統透過 mysite/eventfolder/configure.zcml 檔案來註冊 extension profile,在 interfaces 目錄裡註冊 IEventFolder 介面檔案,其中的 I 代表 interface 之意,如圖20 所示。interface 是 Zope 3 所導入的新設計概念,日後我們還會介紹它。
▲ 圖20 interfaces/eventfolder.py 檔案內容
在 content 目錄裡,同樣有一個 configure.zcml 檔案,它是用來指定 content component 的設定值,包括它的介面檔案位置,以及實作 class 的程式碼位置。「.eventfolder」代表 content 目錄裡的 eventfolder 檔案或目錄,「..interfaces」代表 content 上一層目錄的 interfaces 檔案或目錄。如圖21 所示。
▲ 圖21 content/configure.zcml 檔案內容
我們還沒開始新增 Signup 內容型別,不過它的建立原理跟 Event Folder 大同小異,另外,我們也將探究程式碼的細節,以便修改模組,滿足專案實際的需求。這些都待下回分曉。
▲ 圖10 Add-ons 裡顯示模組的畫面
Extension Profile
之前提過,Plone 所搭配的 GenericSetup,用到 base profile 和 extenstion profile 兩種設定方式,自製模組的場合,通常是註冊 extension profile,當 Zope 啟動時,會經由 ZCML slug 通知系統讀取新的設定值。
在我們的範例裡,檔案 mysite.eventfolder/mysite/eventfolder/configure.zcml 使用 provides 設定值,在 genericsetup:registerProfile 裡,註冊了 extension profile,它的名稱是 default,對應一個 profiles/default 目錄,它的標題是 Event Folder,如圖11 所示。
▲ 圖11 mysite/eventfolder/configure.zcml 內容
profile 的完整名稱,包括了模組名稱,也就是使用 mysite.eventfolder:default 形式,如果要在同一個模組裡註冊多個 extension profile,就必須使用不同的名稱和目錄。
在 profiles/default 目錄裡,看得到一些 XML 檔案,它們是 GenericSetup 執行時所讀取的設定內容。以 types.xml 為例,這個檔案用來註冊 portal_types 裡的新型別資訊。
為了新增我們需要的內容型別,要在模組目錄裡,繼續執行 paster 的指令,特別是利用 ZopeSkel 的 addcontent local command,如圖12 所示。
▲ 圖12 addcontent 的 local command 訊息
同樣的,addcontent 支援多種 template 項目,稍後,我們要用的是 contenttype 和 atschema,如圖13 所示。
▲ 圖13 addcontent 所支援的 template 列表
自製型別
建立自製型別的過程,可以分成 content type 和 schema 兩個階段。
執行 paster addcontent contenttype 後,同樣會顯示一些問題,由於 Event Folder 被規劃成 folderish 特性,這項問題記得要指定 True 設定值,如圖14 所示。如果過程的選項弄錯了,可以按 Ctrl + C 強迫中斷,重頭再來一次。
▲ 圖14 addcontent contenttype 執行畫面
接著,執行 paster addcontent atschema 指令,請事先閱讀 Archetypes 的 field 和 widget 說明文件,以確保能夠選用最合適的欄位類型。
▲ 圖15 addcontent atschema 執行畫面
首先,要決定 content class 的檔案名稱,這個範例裡填的是 eventfolder,在檔案系統裡,它會以 eventfolder.py 檔名出現。然後,依序決定 field 的各項屬性值,在範例裡我們以 startDate 為名稱,指定它為 datetime 型別,其餘使用預設值,如圖16 所示。
▲ 圖16 field 設定畫面
paster 已經幫我們建立第一個 field 的骨架程式碼,如果想要建立第二個 field 的屬性值,可以重複上述的 addcontent atschema 指令,當然,也可以直接手動編輯 Python 原始檔,仿照骨架程式碼的內容,依樣畫葫蘆。
如果你急著想看看結果,執行 bin/plonectl fg 指令,以便除錯訊息能在前景顯示,如圖17 所示。
▲ 圖17 plonectl fg 執行畫面
一切順利的話,在 Plone 裡,已經可以從新增項目的下拉選單中,找到我們自製的內容型別,而且任一目錄裡都能執行新增動作,如圖18 所示。
▲ 圖18 新增項目裡找得到 Event Folder
新增 Event Folder 時,除了既有的 Title 和 Description 欄位外,編輯畫面也顯示我們建立的 Event Starts 欄位,如圖19 所示。
▲ 圖19 Event Folder 的編輯畫面
結論
我們開始模擬一個小型專案,從需求分析開始,尋找合適的工具,修改系統成為想要的樣子,就像組合樂高積木一般。如果把 paster 建立骨架程式碼的過程,詳細記錄目錄檔案的資訊,並進行比對,就可以觀察模組開發的成長歷程。
以 mysite.eventfolder 的 Archetypes 專案為例,系統透過 mysite/eventfolder/configure.zcml 檔案來註冊 extension profile,在 interfaces 目錄裡註冊 IEventFolder 介面檔案,其中的 I 代表 interface 之意,如圖20 所示。interface 是 Zope 3 所導入的新設計概念,日後我們還會介紹它。
▲ 圖20 interfaces/eventfolder.py 檔案內容
在 content 目錄裡,同樣有一個 configure.zcml 檔案,它是用來指定 content component 的設定值,包括它的介面檔案位置,以及實作 class 的程式碼位置。「.eventfolder」代表 content 目錄裡的 eventfolder 檔案或目錄,「..interfaces」代表 content 上一層目錄的 interfaces 檔案或目錄。如圖21 所示。
▲ 圖21 content/configure.zcml 檔案內容
我們還沒開始新增 Signup 內容型別,不過它的建立原理跟 Event Folder 大同小異,另外,我們也將探究程式碼的細節,以便修改模組,滿足專案實際的需求。這些都待下回分曉。
遠端管理 VirtualBox 的神兵利器—RemoteBox
翁卓立/文
前言
許多人因為工作或興趣的關係,經常需要測試各種作業系統。例如驗證應用程式在不同版本的 Windows 系統下是否會產生事先未預期到的問題,或是測試最新版本的 Linux 發行版本,並了解其最新技術與功能表現等等。以往要進行類似的測試,多半需要同時準備數部電腦主機,並在每一部主機上安裝待測試的作業系統平台,才能開始進行測試。但這樣的測試方式十分費時費力,相關硬體的建置成本支出也會是相當沉重的負擔。但在硬體效能持續進步的今天,要安裝各種不同的作業系統,已經不再需要實際購買與建置真正的硬體設備。因為只要安裝虛擬機器軟體,即可在現有的作業系統平台上建立虛擬機器,並利用此虛擬機器進行任何測試。由於虛擬機器的運作狀態與真實主機相去不遠,因此可以相當真實的呈現軟體在各種不同作業系統平台上的實際表現。
目前在虛擬機器軟體方面已經有非常多的選擇,例如知名的商業軟體 VMware,或是原先是商業軟體、但在 Microsoft 買下原開發公司後成為免費軟體的 Virtual PC,都有許多愛用者。Linux 系統上的 Xen、KVM (Kernel-based Virtual Machine) 也有相當數量的支持者,而且成熟度也越來越高。除了這些選擇以外,目前由 Oracle 公司進行開發,採用開放原始碼方式授權的 VirtualBox,也是許多人選擇虛擬機器軟體的首選之一。除了開放式原始碼的授權模式相當吸引人之外,VirtualBox 本身支援多種不同的作業系統平台(無論是 Host OS 或是 Guest OS 皆然),並且提供圖形化的操作介面,也是許多人採用 VirtualBox 的理由之一。
VirtualBox 本身所提供的管理介面非常方便,無論是建立新的虛擬機器,或是設定虛擬機器之中的各種硬體設備,都能使用此介面進行處理。雖然 VirtualBox 的管理介面已經足以應付大部份的使用需求,但較為可惜的是本身並未提供遠端管理虛擬機器的功能。也就是說,只要虛擬機器一關機,除非使用者回到安裝 VirtualBox 的主機前面並直接進行操作,否則將無法針對虛擬機器之中的資料進行任何處理。只是這樣的問題今後將不復存在,因為取名為 RemoteBox 的工具程式,正是解決相關問題的最佳幫手。
官方網站:http://remotebox.knobgoblin.org.uk/
下載網址:http://remotebox.knobgoblin.org.uk/downloads/RemoteBox-0.8.tar.bz2 (587KB)
▲ 圖1 RemoteBox 的主畫面。
RemoteBox 簡介
RemoteBox 這一套圖形化的管理工具,可以遠端管理其他主機 (Host) 所執行的 VirtualBox 程式,且無論是 VirtualBox 本身的設定,或是利用 VirtualBox 所安裝的 Guest,都能直接進行處理。此處所謂的其他 Host 主機,可以是遠端主機(被連結主機與執行 RemoteBox 的電腦並非同一部),也可以是本地主機(RemoteBox 執行的電腦與欲連接的目的端電腦,都是同一部機器)。前者的應用方式適合在臨時需要處理虛擬機器的相關操作,但暫時無法實際接觸遠端主機並進行管理的情況下使用。例如在網路上或家中建置了一部伺服器,並且在該部主機中執行了 VirtualBox。如果希望從公司的電腦連接此部主機並執行 VirtualBox 的相關操作,即可利用 RemoteBox 進行處理。至於後者,則可以將 RemoteBox 視為是 VirtualBox 的另一種替代的管理介面使用。也就是說,RemoteBox 的出現,是為了提供 VirtualBox 使用者一套新的圖形管理介面,並且可以利用這套管理介面進行遠端主機的管理工作。由於 RemoteBox 同時可以進行 VirtualBox 的設定變更與虛擬機器本身的操作功能,因此在使用 RemoteBox 時,其操作與實際在遠端主機前面進行作業並無太大差別。如果網路速度夠快,甚至不會感覺到有任何差異,如同 VirtualBox 是安裝在本地一般。
由於 RemoteBox 在使用時可以將虛擬機器的所有執行結果顯示在本地端,因此無論要連接的遠端主機與其虛擬機器是否有連接顯示器,都不會影響 RemoteBox 的正常操作。這是因為 RemoteBox 本身支援遠端桌面協定 (Remote Desktop Protocol, RDP),因此可以在本地端直接看到遠端虛擬機器的操作畫面,並且透過此通訊協定與虛擬機器進行互動,包括滑鼠與鍵盤等輸入裝置都能直接使用。如果有其必要性,甚至也能利用 RDP 直接播放遠端虛擬機器所產生的音效。輸入輸出都能利用 RemoteBox 進行,自然不必要求遠端的虛擬機器必須安裝螢幕或其他裝置。此外,RemoteBox 使用的技術為 VirtualBox 本身所提供的 API 函式與 SOAP 介面為主,而這些技術只要啟用 VirtualBox 的網頁服務功能即可開始使用。
▲ 圖2 RemoteBox 亦可透過遠端桌面功能查看虛擬機器的畫面。
RemoteBox 的主要功能與特色
由於 VirtualBox 本身可以在數種不同的作業系統上執行,例如 Linux、Windows、Mac OS X 或 Solaris 等等,因此在使用 RemoteBox 時,可能會面臨欲進行連接的遠端主機其作業系統彼此互異,或是與本地主機並不相同的情況。但由於 RemoteBox 採用的是網路通訊協定,且這些通訊協定本身都是 VirtualBox 直接支援的協定,所以只要遠端主機可以安裝 VirtualBox,便能使用 RemoteBox 進行連接與處理相關的管理動作,並不會因為遠端主機所使用的作業系統有所不同而產生任何問題。但截至目前為止,RemoteBox 本身則只能在 Linux、BSD 或 Mac OS X 等作業系統上執行,尚未支援 Windows 系統。這是因為 RemoteBox 的開發團隊認為 Windows 平台上並沒有合適的 Perl 直譯器可以使用,因此暫時沒有將 RemoteBox 移植到 Windows 系統的計畫。
也因為 RemoteBox 強調本身是一套採用開放原始碼的 VirtualBox 圖形化遠端管理介面,因此在執行 RemoteBox 時一定要擁有圖形化的桌面環境。RemoteBox 主要支援的桌面環境為 GNOME,而 GNOME 目前也是大多數 Linux 發行版本的預設桌面環境,在使用上不至於產生太大的問題。但如果使用者慣用的桌面環境是 KDE 或其他桌面環境,則可能需要安裝 GTK 相關的套件才能順利執行 RemoteBox。
▲ 圖3 RemoteBox 亦可用來新增 VirtualBox 中的虛擬機器。
雖然 RemoteBox 使用的是 VirtualBox 所提供的網頁服務,且 RemoteBox 與 VirtualBox 進行溝通時採用的也是 HTTP 協定,但使用者不需要事先在執行 VirtualBox 的主機上啟用任何網頁伺服器,也不需要使用瀏覽器進行操作。因為 RemoteBox 只是單純使用 HTTP 協定進行通訊,並未使用任何網頁技術,所以只要啟用 VirtualBox 本身的網頁服務功能即可,並不需要同時執行像 Apache 之類的網頁伺服器。如果有人嘗試使用網頁瀏覽器連接 VirtualBox 的網頁服務,也只會得到一些錯誤訊息而已,無法取得任何有效的資訊。除此之外,由於 RemoteBox 本身是以 Perl 撰寫而成,因此在使用 RemoteBox 之前並不需要進行編譯動作,直接執行程式即可。唯一可能產生問題的地方,在於每一部主機的 Perl 執行檔可能位於不同的目錄之下。如果有此類問題,只需要修改 RemoteBox 的描述檔,並修改 Perl 的路徑即可。
RemoteBox 連接上遠端的 VirtualBox 之後,會先顯示本身的主畫面。此畫面的排列方式與實際功能都與 VirtualBox 相去不遠,因此也可以利用此畫面進行 VirtualBox 的設定功能。這些設定功能包含修改 VirtualBox 本身的設定,或是變更虛擬機器的相關設定等等。例如加入光碟或儲存媒體至 VirtualBox 的媒體庫之中,或是直接建立一個新的虛擬機器、修改現有的虛擬機器等功能,都能透過 RemoteBox 的操作畫面完成。而無論處理的是虛擬機器的新增或修改功能,都能直接設定虛擬機器的細部設定。例如指定處理器的數量與核心數量、顯示器相關的參數、輸入裝置、音效、I/O 埠或是共享目錄等,都能以遠端作業的方式加以完成。此外,也因為 RemoteBox 採用的是網路協定與 VirtualBox 進行溝通,因此遠端主機是否有安裝螢幕並不是 RemoteBox 考量的重點。即使 VirtualBox 是以無顯示器的方式進行運作,RemoteBox 一樣可以加以支援,而不需要進行任何額外的設定,或使用其他特殊的設備。
▲ 圖4 管理虛擬機器的設定值亦是 RemoteBox 的功能之一。
或許有人會擔心,RemoteBox 本身所支援的遠端管理功能是否只支援開機前的設定與開機後的操作功能。事實上因為 VirtualBox 會將所有訊息全數傳回至 RemoteBox,因此只要是在本地端實際操作 VirtualBox 所能處理的工作,RemoteBox 也幾乎可以全數進行處理。例如啟動尚未開機的虛擬機器,或是將目前正在執行中的虛擬機器直接關機等功能皆可透過 RemoteBox 進行處理。如果需要暫停虛擬機器的運作,或是儲存虛擬機器的狀態,也有 RemoteBox 發揮的空間。甚至在虛擬機器開機後,在正式進入作業系統畫面之前,也能使用 RemoteBox 進行 BIOS 的設定工作。如果需要使用或設定較為進階的選項,例如是否採用大量分頁技術、CPU 熱插拔等功能,亦可使用 RemoteBox 進行處理,不需要擔心會有無法進行操作的情況發生。如果需要將遠端主機 Host OS 上的 USB 裝置連接至 VirtualBox 所建立的虛擬機器之中,或是要建立新的磁碟裝置並連接至虛擬機器,這些工作也都能直接透過 RemoteBox 加以完成。至於在網路設定方面,RemoteBox 也可以直接支援 VirtualBox 所提供的各種網路設定。無論虛擬機器要使用的是橋接式或 NAT 方式的網路,或是建立一個本地網路,其成員只有虛擬機器與其 Host OS,都不會有任何問題產生。
VirtualBox 另外也支援名為 Snapshot 的系統快照功能,可以將目前 Guest 的狀態儲存在 Host 的磁碟當中。如果將來 Guest 發生任何問題,只需要回溯先前所建立的快照,即可恢復整個系統的狀態至正常情況。這樣的快照功能是 VirtualBox 相當廣受好評的功能之一,RemoteBox 自然也不會忘記要支援這樣的功能。如果需要遠端進行虛擬機器的快照處理,只需要在 RemoteBox 的畫面上點選適當的按鍵,並輸入相關的資訊即可立即產生快照。
▲ 圖5 切換至右方視窗的【Snapshot】頁籤,即可進行快照功能的管理。
結語
虛擬機器軟體的流行,讓許多需要經常安裝各種不同作業系統的使用者有了更方便的測試環境建置選擇。由於省時省力,在金錢花費上甚至可以達到零支出,自然吸引許多人的目光。VirtualBox 在各方面都提供了不次於其他虛擬機器軟體的功能,如果再加上 RemoteBox 的輔助,相信將會有如虎添翼的感受。目前 RemoteBox 可以執行的作業系統平台仍然不如 VirtualBox 的多元化,相信這也會是 RemoteBox 將來改版的重點項目之一。
作者簡介
翁卓立,逢甲大學資訊工程學系、台灣科技大學電子所畢業,目前擔任韌體研發工作,主要使用 Embedded Linux 進行產品開發。著有「Linux 進化特區:Ubuntu 10.04 從入門到精通」等書。
報主的話
報主的話: 更多自由軟體相關新聞及文章,請按此閱讀或訂閱。 |