鳳梨酥計劃:FreeBSD on OpenStack

最近都在交大計中內玩 OpenStack 相關的事情。

FreeBSD 是我架伺服器的首選,令人意外的是要在 OpenStack 上面跑 FreeBSD 到現在依然都還沒有很好的方案…

CNMC 和交大計中都大量使用 FreeBSD ,同時我們也在研究 OpenStack ,在 OpenStack 上跑 FreeBSD 能提供我們很多好處。同時,身為 FreeBSD 的使用者和支持者,當然希望更多人來使用,也擔心現在很多的使用狀況都是在 VM 裡頭,如果 FreeBSD 沒辦法在雲端環境下運行,就是多了使用上的限制,不利於 FreeBSD 的普及。

因此我,Iblis 和 Apua ,決定開始計劃來讓 FreeBSD 像各種 Linux 一樣在 OpenStack 環境下輕鬆順利的部署和運行。我們將計劃命名為鳳梨酥計劃!(這個名字讓我們笑了很久,會取這個名字是因為使用來自台灣的東西更可以凸顯這個計劃的發源)

鳳梨酥計劃基本上就是給 FreeBSD 用的 cloudinit

計劃分為兩大部分。一為 instance 的開機腳本,會在開機時讀取 OpenStack 的各種環境變數並依照環境變數來設定 instance ,這部分稱為 bsd-cloudinit ,做的事情和 Linux 上面的 cloudinit 相近。第二部分為 VM template 化腳本,在建立 template 的時候使用,負責移除 VM 的各種特徵,如 SSH host key ,以免屆時開新 instance 的時候 VM 的特徵重複。除此之外還要負責安裝 bsd-cloudinit ,我們將第二部分稱為 bsd-cloudinit-installer

命名

會開始做這件事情是想說,這件事情應該很簡單,但是卻沒有人做(我也很納悶為什麼沒有人做)。在 FreeBSD 上面做各類的系統管理只要用 CLI 就可以完成,我們要做的事情只是把外面的資訊拉進來,和這些動作黏在一起,就做完了。

剛開始我們就確立了一個方向,就是不要管 code 有多髒,能動就好。後來覺得這真的是正確的決定。由於不管架構、維護性等問題,我們很快就做出基本的功能。快速做出基本功能有一個重要的好處就是可以迅速獲得進度的回饋(你看,我們這麼快就做出這個功能了!),有進度就產生成就感,成就感對於計劃的繼續進行我認為很重要。要是我們顧慮很多,拖了很久還做不出第一個功能,因為沒有明顯的進度,心理上就很難產生成就感,很可能連第一個功能都沒做出來就不想做了。

計劃的命名也讓我們想了很久和笑了很久,剛開始我們提了一堆希臘神明之類的名字(因為拼起來很酷XD)。可是其實我一直覺得開源計劃的名稱應該要達到幾個目的:能夠顯示計劃的緣起、計劃的功能、好念、好記,再來還要看起來很酷很先進。

計劃剛開始我只有找 Iblis ,那天我給 Iblis 做 OpenStack 架構的簡報,Apua 走進來問我們要幹嘛,我就簡單講了一下然後附帶問了一句「要不要加入」,然後 Apua 就加入計劃了www

第一天我們就開始想名稱了哈哈,剛開始想了一堆希臘神明的名字,那天我剛好有帶鳳梨酥當點心,靈機一動就提出用鳳梨酥當名字XDD

鳳梨酥這名字超棒,首先,它顯示了我們的起源——台灣,只有台灣有這種點心。再來,它好念而且念起來很酷(對於不會中文的人而言),想像一個老外說 “feng li su" 的聲音XD

但是為了顯示計劃目標,我們還是再加了一個附標題:bsd-cloudinit

開發過程

幾乎都是以半 hackathon 的方式進行的,我們大概花掉幾個週末和平日晚上吧。

Iblis 負責用各種骯髒的方法用 shell script 實作各種動作,因為我們兩個都不會寫 Python ,Apua 提供 Python 支援,幫我了解 cloudbase-init 的架構,我比較了解 OpenStack 和 cloudinit 的架構,所以我要提供其他人方向,還有架構用以前弄好的 OpenStack 提供測試環境,還有負責 build template 、寫文件、去 mailing list 宣傳什麼的。

我們三人的領域都不太相同,但都互相稍微了解對方的領域。合作起來很愉快的一點就是一旦遇到問題就可以互相回答,像是不確定要用哪種實作的時候馬上就有人可以討論、分析和決定。不像我常常自己寫程式寫到一半沒辦法決定 implementation 就整個卡在那邊猶豫很久,要是猶豫太久就會開始打混了XD

成果

我們的計劃被加進 OpenStack Image Guide 了!超爽

下一步

最大的重點就是把 cloudconfig 的功能加進去,這樣才是真的自動化啊。

還有很多很髒的的地方要稍微修一修⋯⋯

鳳梨酥計劃主網站及說明文件

ZFS 不關機更換硬碟+重建 glabel

要更換的硬碟是 /dev/label/disk1

首先先將硬碟 offline :

# zpool offline tank label/disk1

然後即可將硬碟拔除(不需要關機)。

SATA 熱插拔需要啟用 ACPI 的支援,如果裝置的名稱是 /dev/adaX 的話就是有 ACPI 了。

IDE 硬碟應該是沒辦法熱插拔的。

將新的硬碟換上,接上  SATA 線和電源線之後,即可

# zpool online -e tank label/disk1

其中 -e 參數是:

Expand the device to use all available space. If the device is part of a mirror or raidz then all devices must be expanded before the new space will become available to the pool.

因為我換上的硬碟是 1TB 的,舊的是 500GB 的,之後想要再把另一顆 500GB 的舊硬碟更換成 1TB 的,這樣做應該就可以將整個 RAID0 建成 1TB 的檔案系統。(我還沒做所有不確定是否會成功)

接下來幫新裝上的硬碟加上 label (可以使用 dmesg 看剛插上的硬碟編號):

# glabel label disk1 /dev/ada1

其中 disk1 是名稱(要貼上的 label ),/dev/ada1 是硬碟的位置編號

接下來即是重建磁碟陣列的資料了:

# zpool replace tank label/disk1

重建的過程稱為 resilvering , 需要花一點時間,端看於硬碟上面原本有多少資料。

FreeBSD 9 and (U)EFI

FreeBSD 9 在安裝的時候沒有提供 EFI 的選項,我將它安裝在 IBM x3650 M2 上面。

事後查了一下發現, IBM System x 的確有提供 BIOS 相容功能,而且預設是開啓的。

FreeBSD 9 預設使用 GPT 分割表,沒有一併啓用 EFI 太可惜啦。

讀了一些文章的結果顯示,應該是要用 gpart 指令建立一個類型爲 efi 的分割區,然後把 FreeBSD 的 EFI boot loader 安裝到那個分割區就好了,還不確定是否就這樣,測試完再更新這一篇。

岔題做個筆記

我將 FreeBSD 9 安裝在 System x3650 M2 之後開不了機,後來進 UEFI 設定中的 Boot options 加上 Legacy only 就好了。

FreeBSD 上關於硬碟的各種疑問

最近在裝新的機器,FreeBSD 9 的預設 partition table 變成  GPT 了。我產生了幾點疑問:

  1. FreeBSD 9 之前,分割區通常都是長類似這樣:/dev/ad0s1a ,可是我新灌了一台他是長這樣:/dev/ada0p2
  2. GPT label 與 glabel 有何不同
  3. FreeBSD 9 到底能不能從 EFI 開機?我灌的那一臺是 EFI 的機器沒錯,不過我不確定他是否有啓用什麼模擬 BIOS 的機制之類的
  4. 對 BSD 來說,partition 與 slice 到底是什麼意思?
  5. 何謂 soft-updates? journaled soft-updates? 又 UFS 預設是什麼狀況?

依次就我調查到的結果來做個筆記:

一、

有兩個地方不同,首先是 ad 變成 ada ,這是因爲啓用了 AHCI ,AHCI 讓 SATA 硬碟速度稍微加速,並支援熱插拔功能。參考:

再來是 s1a 變成 p2 ,大致上來說前者是只有在 MBR partition table 纔會出現,意思是第一個 slice (s1) 的第一個 partition (a) ;後者只有在 GPT 纔會出現,意思是第二個 GPT 分割區 (p2) 。

二、

GPT label 很顯然是只有分割表格式是 GPT 的時候才能用,可以使用 # gpart show -l 來查看目前各分割區的 label 。在分割區未掛載的狀況下,裝置節點會出現在 /dev/gpt/<label> ,掛載之後,這個節點就消失了。可以直接在 /etc/fstab 中將原本的裝置節點 (eg. /dev/ada0p2) 改成 GPT 的裝置節點 eg. /dev/gpt/<label> 。 glabel 與 FreeBSD 特有的 GEOM 有關,即使是 MBR 也可以作 glabel ,裝置節點會出現在 /dev/label/<label>

三、

GPT 其實是 EFI 標準的一部分,但 BIOS 系統也可以使用 GPT partition table 。FreeBSD 支援 EFI+GPT 和 BIOS+GPT 。但是那臺機器上到底是哪一種我搞不清楚,尚待調查。

四、

BSD 當中,partition 與 slice 是兩個很容易混淆的概念,尤其是 BSD 的 partition 代表的意義又與一般常見的意義不同。

http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/disk-organization.html

File systems are contained in partitions. This does not have the same meaning as the common usage of the term partition (for example, MS-DOS partition), because of FreeBSD’s UNIX® heritage. Each partition is identified by a letter from a through to h. Each partition can contain only one file system, which means that file systems are often described by either their typical mount point in the file system hierarchy, or the letter of the partition they are contained in.

“partition" 裏面裝的是檔案系統 (file system) 。"partition" 在此與一般常見(像是 MS-DOS partition )的意義不同,這是由於 FreeBSD 的 UNIX® 傳統。每一個 partition 由 a 到 h 作爲編號。每一個 partition 只能包含一個 File System 。[…]

Each partition-that-contains-a-file-system is stored in what FreeBSD calls a slice. Slice is FreeBSD’s term for what the common call partitions, and again, this is because of FreeBSD’s UNIX background. Slices are numbered, starting at 1, through to 4.

每一個包含 File System 的 “partition" 都被儲存於 FreeBSD 稱作 “slice" 的東西之中。FreeBSD 中"slice" 的意義其實與 “partition" 的一般常見意義是相同的,這也是由於 FreeBSD 的 UNIX 傳統。"slice" 的編號從 1 到 4 。

五、

我還沒完全瞭解。參考:

其他筆記

  • FreeBSD 5.0 開始, UFS 的預設版本都是 UFS2 http://en.wikipedia.org/wiki/Unix_File_System
  • /dev/ad0s1a 中的 a~h 的編號是由 bsdlabel(8) 建立的
  • 參考 manpage
    • bsdlabel(8)
    • gpart(8)
    • newfs(8)
    • fdisk(8)
    • glabel(8)