美思 [技術雜談] 在 VirtualBox 中使用 TrueOS (FreeBSD 衍生系統) 的教學

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

TrueOS 是一套衍生自 FreeBSD 的 BSD 發行版,其前身是 BSD 桌面系統 PC-BSD。原本 PC-BSD 就是基於 FreeBSD 的桌面系統,但 TrueOS 經過一段時間的發展後,成為一套基於 FreeBSD 的基礎發行版,去掉了桌面環境的部分。

現在基於 TrueOS 的桌面系統有 GhostBSDProject Trident。兩者的差別在於預設的桌面環境相異。GhostBSD 採用 MATE (GNOME 2 的分支),而 Project Trident 則採用 Lumina。在兩個桌面環境中,Lumina 較輕量而 MATE 發展較久。

註:Project Trident 於西元 2020 年後會逐步改以 Void Linux 為基礎,故不再建議以此發行版做為 BSD 測試平台。

筆者使用 TrueOS 的目的是要在 BSD 風格的類 Unix 系統上試跑自己寫的一些程式,並沒有打算把 TrueOS 當成主力系統來用。

由於 TrueOS 本身的資料比較少,所以筆者把安裝和使用 TrueOS 的過程記錄下來。有需要使用 FreeBSD 或 TrueOS 的讀者可以參考一下。

下載 TrueOS 安裝媒介

到 TrueOS 官網中下載 ISO 映象檔即可。TrueOS 的版本號分為最新版 (latest) 和穩定版 (stable) 兩種。最新版基於 FreeBSD-CURRENT,所以就是 rolling release 的概念。而穩定版則基於 FreeBSD-STABLE。

筆者使用 TrueOS 的目的只是測程式碼相容性,所以不追新,使用穩定版。喜歡嘗鮮的讀者可自行試用最新版。

TrueOS 本質上還是 FreeBSD,應該很少人會真的把 FreeBSD 當成平日的主力系統吧。所以我們在這裡使用 VirtualBox 建虛擬機器,把 TrueOS 灌進去。

使用 VirtualBox 等虛擬機器軟體就不太需要煩惱硬體問題。而且可以對系統做快照 (snapshot),玩壞了可以快速回復到先前的狀態。

由於我們使用 VirtualBox,所以 ISO 映像檔不需要燒成光碟,這樣也比較環保。

安裝 TrueOS

設好虛擬機器後,掛載 TrueOS 的 ISO 檔,然後開啟虛擬機器,進入 TrueOS 安裝程式。

選擇系統磁碟:

{{< figure src="/img/blog/trueos-select-disks.png" alt="安裝 TrueOS 的流程:選擇系統磁碟" class="img-resposive" >}}

由於我們是用虛擬機,所以只會有一塊硬碟。

選擇磁碟分割類型:

{{< figure src="/img/blog/trueos-use-all-disks.png" alt="安裝 TrueOS 的流程:選擇磁碟分割類型" class="img-resposive" >}}

由於虛擬機內的磁碟一開始都是空的,所以直接用全部的磁碟即可。

選擇系統載入程式:

{{< figure src="/img/blog/trueos-select-bootloader.png" alt="安裝 TrueOS 的流程:選擇系統載入程式" class="img-resposive" >}}

當硬碟容量較大,或需要超過四個主分割區時,就要用 GPT。在這裡其實沒差。

輸入 root 的密碼:

{{< figure src="/img/blog/trueos-enter-root-password.png" alt="安裝 TrueOS 的流程:輸入 root 的密碼" class="img-resposive" >}}

為了安全起見,輸入時是看不到密碼的。為了怕使用者輸入時手殘,系統會請使用者再確認一次:

{{< figure src="/img/blog/trueos-confirm-root-password.png" alt="安裝 TrueOS 的流程:確認 root 的密碼" class="img-resposive" >}}

由於無法直接從螢幕上獲得回饋,所以用這種方式來確認輸入的密碼是正確的。

由於 root 對系統破壞力過強,系統會請使用者建立一個一般使用者帳號:

{{< figure src="/img/blog/trueos-select-user-name.png" alt="安裝 TrueOS 的流程:選擇一般使用者帳號" class="img-resposive" >}}

在這裡我們輸入 user ,但讀者可換成自己喜歡的帳號名稱。

接著,輸入 user 的真實姓名:

{{< figure src="/img/blog/trueos-select-user-real-name.png" alt="安裝 TrueOS 的流程:輸入一般使用者的真名" class="img-resposive" >}}

其實這裡的真實姓名只是一種元資料 (metadata),會在適當的時機顯示,但不會影響系統管理,所以也不用真的填入真名。

同樣地,為 user 輸入密碼:

{{< figure src="/img/blog/trueos-enter-user-password.png" alt="安裝 TrueOS 的流程:輸入一般使用者的密碼" class="img-resposive" >}}

並確認沒有手殘輸錯密碼:

{{< figure src="/img/blog/trueos-confirm-user-password.png" alt="安裝 TrueOS 的流程:確認一般使用者的密碼" class="img-resposive" >}}

選擇使用者的起始 shell:

{{< figure src="/img/blog/trueos-select-user-shell.png" alt="安裝 TrueOS 的流程:選擇 shell script" class="img-resposive" >}}

傳統上,BSD 預設提供 C shell 家族的 shell,像是 cshtcsh。但筆者這裡選擇 POSIX shell (sh),因為筆者想測一些以 POSIX shell 寫的命令稿。反正之後可以改 shell,不用在這個選項上停留太久。

選主機名稱:

{{< figure src="/img/blog/trueos-enter-host-name.png" alt="安裝 TrueOS 的流程:輸入 hostname" class="img-resposive" >}}

原本 hostname 要根據該主機在網路上的網域 (domain) 來設置,但我們的系統沒有要當成遠端主機,所以可隨意輸入。trueos 是一個不錯的名字。

開啟網路連線:

{{< figure src="/img/blog/trueos-enable-network.png" alt="安裝 TrueOS 的流程:啟用網際網路" class="img-resposive" >}}

完全沒網路的電腦幾乎等於無用了,所以在這裡會開啟網路。

選擇網路連線的方式:

{{< figure src="/img/blog/trueos-select-network-card.png" alt="安裝 TrueOS 的流程:選擇網路連線的方式" class="img-resposive" >}}

除非你有要把此系統當成虛擬遠端主機來連線,選擇 DHCP 即可。

是否要開啟 SSH:

{{< figure src="/img/blog/trueos-disable-ssh.png" alt="安裝 TrueOS 的流程:關閉 SSH 服務" class="img-resposive" >}}

由於此系統沒有要接收遠端登入,故選否。

開始安裝系統:

{{< figure src="/img/blog/trueos-start-to-install.png" alt="安裝 TrueOS 的流程:開始安裝系統" class="img-resposive" >}}

到這裡,安裝精靈算是設置完成了,接著準備開始安裝。

系統會再做最後確認:

{{< figure src="/img/blog/trueos-confirm-to-install.png" alt="安裝 TrueOS 的流程:確認安裝" class="img-resposive" >}}

會多這一步是因為原本 TrueOS 是用來安裝在實體機器上,裝下去真的會抹去磁碟上現存的資料。為求慎重起見,所以多問一次。

按確認後安裝程式就會開始安裝。安裝的動作包括將磁碟格式化,所以對磁碟上的資料是破壞性的動作。整個安裝過程不會太久,因為 TrueOS 預設套件很少。

安裝完後,系統會提示下一步:

{{< figure src="/img/blog/trueos-installation-finished.png" alt="安裝 TrueOS 的流程:安裝完成" class="img-resposive" >}}

離開安裝精靈:

{{< figure src="/img/blog/trueos-quit-installation-wizard.png" alt="安裝 TrueOS 的流程:離開安裝精靈" class="img-resposive" >}}

這時候新系統已經安裝好了,準備退出安裝程式。

準備重開機:

{{< figure src="/img/blog/trueos-reboot.png" alt="安裝 TrueOS 的流程:準備重開機" class="img-resposive" >}}

系統安裝後,要抽出安裝光碟。才不會再下次開機時又跑一次安裝程式。在虛擬機中就是關閉虛擬機器,然後缷載 TrueOS 的 ISO 映像檔。

更改使用者的 Shell

系統剛裝好時,所提供的 shell 是 POSIX shell (sh)。雖然用 POSIX shell 來測試 shell 命令稿的相容性很有用,但 POSIX shell 在日常使用不太方便。建議交互性使用和跑 shell 命令稿時各用不同的 shell。

以下指令可以修改使用者的 shell:

$ chsh

之後會進入修改使用者資料的設定檔,這時候會以 vi 來修改設定檔。只要改掉 shell 路徑的地方即可。

TrueOS (或 FreeBSD) 的 shell 路徑和 GNU/Linux 有差異,最好事先用 which 確認 shell 路徑,以免寫錯了 shell 路徑而無法登入系統。

筆者通常是用 Zsh 搭 Oh My Zsh 所提供的設定檔套餐,就不用自己調設定。讀者也可以自行嘗試其他的方案,像是 Bash 或 Fish 等。

附帶一提,最好不要更動 root 的登入 shell,以免設壞了無法用 root 管理系統。

在 TrueOS 中使用桌面壞境

雖然本文的目標只是把 TrueOS 當成測程式碼的平台,裝個基本的桌面環境沒什麼壞處。

既然都用 TrueOS 了,當然就順便嘗鮮一下 TrueOS 自家的 Lumina。由於桌面環境算比較大型的程式,我們直接用現有的二進位套件 (binary pakcage) 來安裝:

# pkg install lumina xorg

lumina 是 Lumina 桌面環境的元套件 (metapackage),安裝此套件就會安裝所有的相關套件。由於 Lumina 算輕量級桌面環境,就算全裝也沒多少套件。

接著要手動設一個 DBus 的 UUID:

# dbus-uuidgen > /etc/machine-id

不知道 TrueOS 為什麼不直接在安裝 lumina 元套件時直接加入這一步驟。總之就是要手動處理一下。

原本 Lumina 內附的 xTerm 實在不太好看,要調到好看得花一些工夫。如果不想花時間調的話,可以直接安裝 LilyTerm:

$ pkg install lilyterm

LilyTerm 還算輕量,但一裝好就比 xTerm 好看,頂多再微調一下字體大小就可以使用。

每次要使用 Lumina 時,在終端機輸入以下指令即可:

$ start-lumina-desktop

基本上,最好不要用 root 登入桌面系統,以免因一時手殘玩壞系統。如果需要使用 root,在切進 Lumina 後開啟 LilyTerm 或其他終端機模擬器,再從終端機切成 root 比較安全。

本節最後附上一張原汁原味,未經調整的 Lumina 桌面截圖:

{{< figure src="/img/blog/trueos-lumina-screenshot.png" alt="TrueOS 的 Lumina 桌面環境" class="img-resposive" >}}

(選擇性) 安裝桌面軟體

由於 Lumina 採精簡原則。剛裝好時能用的軟體甚少,使用者自己需要什麼就裝什麼。

筆者並沒有要把 TrueOS 當成主力系統,所以只裝個瀏覽器,用來上網查資料。用以下指令安裝 Firefox:

# pkg install firefox

TrueOS (或 FreeBSD) 的桌面軟體會比 GNU/Linux 再少一些。因為 TrueOS (或 FreeBSD) 算小眾桌面系統,沒什麼商業公司想耕耘這一塊市場。反正就是找自由軟體來用。

此外,TrueOS (或 FreeBSD) 有做 GNU/Linux 相容層,可以用來跑 GNU/Linux 軟體。筆者也沒實際用過,有興趣的讀者可以自己試試看。

使用 Ports 編譯及安裝程式

TrueOS 有兩套安裝軟體的方式,分別是套件和 ports。前者是直接安裝預編好的二進位程式,從者則是從原始碼慢慢編譯。兩種方式都承襲自 FreeBSD。一般來說,為了節省時間,如果沒有特殊需求,使用現成的套件即可。

Ports 可用 Git 或 Subversion 來管理,比較簡單的方式是用 Git。先下載 Git 套件:

# pkg install git

第一次使用時要先從遠端抓 ports 樹:

# portsnap fetch

然後把 ports 解開:

# portsnap extract

解開的 ports 樹位於 /usr/ports ,基本上就是一個本地端的 Git 套件庫。

有些軟體只能以原始碼散布,這時候 ports 就能發揮其用途。下一節所介紹的 VirtualBox Guest Additions 就是一個例子。

(選擇性) 調整 VirtualBox 的解析度

警告:本任務相當耗時,請預先為宿主機器 (host machine) 留好足夠的任務時間。

筆者在 15 吋 Macbook Pro 2015 年版上做完這項任務的時間約為三至四小時。

如果讀者一路上跟著本文的步調走,應該會發現 TrueOS 客系統 (guest system) 在 VirtualBox 中的畫面很小。這不是 TrueOS 本身的問題,而是 VirtualBox 的預設情境。在預設情境下,客系統相當於是用公版驅動程式來驅動硬體,所以支援度不佳。

如果想要改善這項議題,需在客系統中安裝 VirtualBox Guest Additions。對於客系統來說,安裝 Guest Additions 相當於安裝驅動程式 (或驅動模組)。安裝這套軟體後會改善 VirtualBox 對客系統的硬體支援。像是桌面可以用比較高的解析度,就不用忍受過小的畫面。

在 TrueOS (或 FreeBSD) 上安裝 Guest Additions 時,會用到 FreeBSD 的核心原始碼 (kernel source)。所以我們到 GitHub 上抓 FreeBSD 本身的原始碼:

# git clone https://github.com/freebsd/freebsd.git /usr/src

在本文中,我們使用穩定版的 TrueOS,所以我們把 FreeBSD 的原始碼切到相當於 TrueOS 穩定版發行時的版本號:

# cd /usr/src
# git checkout release/12.0.0

前置工作完成後,移到 VirtualBox Guest Additions 所在的 port 目錄:

# cd /usr/ports/emulators/virtualbox-ose-additions

由於有可能會有相依套件,建議用以下指令先一次把相關的設置都跑完:

# make config-recursive

這時候會跳出數個可選擇的編譯選項,大部分選項並不是給 Guest Additions 用的,而是給相依軟體用的。使用這個指令的好處在於可先一次設置完,就不用守在電腦前,可以一次跑完整個編譯流程。

筆者的筆電的顯卡只是 Intel 晶片,故按照預設選項來選。如果讀者的宿主機器的顯示卡不錯,可以考慮在編譯 Guest Additions 時開啟選擇性的 OpenGL (3D 繪圖) 選項,並在虛擬機器中開啟 3D 繪圖的支援。

如果讀者不確定這些選項的意義,就先使用預設選項即可。

接下來就要開始漫長的 Guest Additions 編譯及安裝任務:

# make install clean

如果讀者不想坐在電腦前枯等,可以把宿主機器的休眠功能關掉,然後就可以離開電腦,去做其他事情。把休眠關掉是為了防止客系統因宿主系統進入休眠狀態而中斷編譯程式的任務。

當 Guest Additions 編譯安裝完後,最好在 /etc/rc.conf 中設置相關選項:

vboxguest_enable="YES"
vboxservice_enable="YES"

下次開虛擬機時就會自動開啟 Guest Additions 的支援。

此外,也要給桌面環境使用者相關的權限:

# pw groupmod wheel -m user

適當地給予權限後, user 就可以利用桌面環境正確重開機和關機。在使用本指令時,請把 user 改為自己系統上實際的使用者帳號名稱。

其他的配置請參考 FreeBSD 的相關頁面,這裡不再重覆。

整個設置完成後,要將系統重開機一次,就會開啟 Guest Additions 相關模組的支援。

(選擇性) 對 TrueOS 加入中文支援

雖然我們只是把 TrueOS 當成測程式碼的平台,在系統中加入中文支援,就可以直接在 TrueOS 中上網查資料,不用一直切回宿主系統。

要在類 Unix 系統中加入中文 (或其他語言) 的支援,得設置:

  • 語系 (locale)
  • 字型 (font)
  • 輸入法 (input method)

先以 locale -a 指令檢查系統上已有的 locale:

$ locale -a | less

由於 TrueOS 一開始就開啟大部分主流語言的 locale,所以不需自己新增 locale。

在家目錄的 shell 設置檔設置 LANG 參數:

LANG=en_US.UTF-8

當我們將 LANG 設為 en_US.UTF-8 時,桌面環境會保持英文介面,但可顯示及輪入中文字。

對程式人來說,系統保持英文介面比較好,因為程式發生錯誤時系統吐出的訊息也是英文的,比較容易根據錯誤訊息上網找資料來除錯。

如果只是要基本的中文字體,可安裝 zh-font-std 套件:

# pkg install zh-font-std

如果想要好看一點的中文字體,可安裝 Google 發佈的 Noto 字體:

# pkg install noto

noto 套件蠻肥的,接近 700 MB。只是為了字型的話,這個容量算肥了點。讀者可自行考慮是否要安裝。

TrueOS (或 FreeBSD) 上有數套中文輸入法,這裡安裝 Fcitx (小企鵝輸入法):

# pkg install zh-fcitx zh-fcitx-chewing zh-fcitx-table-extra zh-fcitx-configtool

在家目錄中要設置 XMODIFIERS 變數:

export XMODIFIERS='@im=fcitx'

對於 GTK+ 程式來說,還要設置 GTK_IM_MODULEGTK3_IM_MODULE 兩個變數:

export GTK_IM_MODULE=fcitx
export GTK3_IM_MODULE=fcitx

如果想在開啟桌面時自動開啟 Fcitx,需將 fcitx.desktop 複製到 $HOME/.config/autostart 目錄中:

$ cp /usr/local/share/applications/fcitx.desktop \
    ~/.config/autostart/

設置完後,重新登入桌面環境,應該就有中文桌面環境可用。

繼續深入

本文只是粗淺的說明,想深入學習 TrueOS 或 FreeBSD 的話,可以繼續看相關的資料。

可以先看看 TrueOS 的官方手冊。但從 TrueOS 的官網入口頁面似乎無法直接連結到官方手冊,算是官網的小疏失。

另外,也可以看看 FreeBSD 的官方手冊,畢竟 FreeBSD 是最接近 TrueOS 的系統。但閱讀時要注意兩者間的差異。

由於 TrueOS 或 FreeBSD 算小眾系統,專書不太好找。比較新的像是 Absolute FreeBSD, 3rd Edition, No Starch Press 。如果能夠放開心胸,也可以試著看一些 Unix 通論的書籍,只是上機時要注意不同系統間的相異處。

評語

由於 TrueOS (或 FreeBSD) 是 BSD 系統,命令列工具和 GNU/Linux 上的同名軟體會有一些差距,像是參數不相容、專案設置檔語法不同等。而各個類 Unix 系統間的差異,就是測程式碼相容性時所需確認的標的。

macOS 也是 BSD 系統,但 Mac 主機價格偏高,而且 macOS 和 FreeBSD 等正統 BSD 系統也有一些差異。因此,不太需要為了使用 BSD 系統就特地去買 Mac 主機來用。

相對來說,可以考慮在虛擬機中弄個 TrueOS (或 FreeBSD),用很低廉的代價就可以體驗 GNU 和 BSD 兩種風格的差別。

關於作者

身為資訊領域碩士,美思認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

美思喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,美思將所學寫成文章,放在這個網站上和大家分享。