遠端安裝 FreeBSD 作業系統而不必接 Remote Console

Daniel Gerzo

法律聲明

FreeBSD 是 FreeBSD 基金會的註冊商標。

許多製造商和經銷商使用一些稱為商標的圖案或文字設計來區別自己的產品。 本文件中出現的眾多商標,以及 FreeBSD Project 本身廣所人知的商標,後面將以 “™” 或 “®” 符號來標示。

摘要

本文介紹如何在沒辦法連到遠端 console 的機器做 FreeBSD 遠端安裝。 本文構想來自於作者與 Martin Matuska <mm@FreeBSD.org> 的合作成果, 以及 Paweł Jakub Dawidek <pjd@FreeBSD.org> 所投注的諸多心血。


1. 緣起

世上有許多 server hosting provider,但其中有官方支援 FreeBSD 則不是相當多。 他們通常會在所提供的機器上有 Linux® distribution 的安裝支援。

有些會讓您可選擇喜好的 Linux® distribution 來裝, 像這種情況就可以試著安裝 FreeBSD。 而有些則是會提供救急用的系統, 這種也可以用來安裝 FreeBSD。

本文介紹這些遠端基本安裝 FreeBSD 的方式,以及 RAID-1 與 ZFS 設定步驟。

2. 介紹

茲摘錄一下本文的目的以及闡述這邊所涵蓋的東西。 對於無官方支援 FreeBSD 的代管服務(colocation)用戶而言, 本文中所介紹到的指令會相當有用。

  1. 正如先前 緣起 所提到的,許多名聲還不賴的 server hosting 公司會提供一些救急用系統,可以透過 LAN 方式開機,也可以透過 SSH 方式進行管理。 通常會有該加值服務, 以讓他們的客戶可以連進來修復有問題的作業系統。 本節之後將介紹如何透過救急系統來安裝 FreeBSD。

  2. 下一節會介紹如何在本機設定以及打造最小巧的 FreeBSD ---- 該版最後會在遠端機器上透過 ramdisk 方式啟動,並以 Sysinstall 從 FTP mirror 站來安裝完整的 FreeBSD 作業系統。

  3. 本文其餘部分將介紹安裝程序,以及 ZFS 檔案系統的設定。

2.1. 需求

為了成功完成遠端安裝,必須要有:

  • 要有可以上網的作業系統,並且 SSH 可以連線。

  • 瞭解 FreeBSD 的安裝程序

  • 熟悉如何使用 sysinstall(8)

  • 有 FreeBSD 安裝光碟片或者 ISO image 檔

3. 準備 - mfsBSD

在裝 FreeBSD 之前,要先打造最小化的 FreeBSD 作業系統 image 檔, 以便可以從硬碟上開機。 如此一來,新的系統就可以透過網路來操作, 而剩下來的安裝部分即可不必透過 console。

而 mfsBSD 這套工具就是用來打造小型的 FreeBSD image 檔。 mfsBSD (名字其中 "mfs" 就是 "memory file system")所建造出來的 整套系統會透過 ramdisk 方式來運作。 由於此一特色,硬碟的部分就不受限, 因此可以用來安裝完整的 FreeBSD 作業系統。 mfsBSD 的首頁位於 http://people.freebsd.org/~mm/mfsbsd/, 其中連結有該工具的最新 release 部分。

請注意:mfsBSD 內部運作方式的細節,不 在本文介紹範圍之內。 若對這方面有興趣的讀者,可至 mfsBSD 官網查閱相關文件。

首先下載最新的 mfsBSD 並解壓縮之, 然後切到解壓縮後的工作目錄,也就是 mfsBSD script 檔所在處:

# fetch http://people.freebsd.org/~mm/mfsbsd/mfsbsd-latest.tar.gz
# tar xvzf mfsbsd-1.0-beta1.tar.gz
# cd mfsbsd-1.0-beta1/

3.1. 設定 mfsBSD

在將 mfsBSD 開機之前, 有幾個重要設定要先設妥。 此時最重要的設定,很明顯就是網路設定。 到底網路怎麼設最好,則取決於所處的網路環境, 以及該網路卡會以哪一種驅動程式載入而定。 我們將會看到 mfsBSD 如何在任何網路情況下進行設定。

另一件重要事就是設定 root 密碼。 這點可以透過 conf/rootpw.conf 來完成。 請切記:該檔密碼是以明文方式存放,因此不建議放真正平常有在用的密碼。 然而這密碼只是臨時密碼而已,可以在之後開機時再做更換。

3.1.1. 設定網路(conf/interfaces.conf 方式)

若對要裝的機器網卡為何還不知道是哪一款,但可以善加利用 mfsBSD 的自動偵測功能。 mfsBSD 的開機 script 會根據網卡的 MAC 位址範圍來偵測正確的驅動程式,像是下列的 conf/interfaces.conf 設定內容:

initconf_interfaces="ext1"
initconf_mac_ext1="00:00:00:00:00:00"
initconf_ip_ext1="192.168.0.2"
initconf_netmask_ext1="255.255.255.0"

別忘了在 conf/rc.conf 內要加上 defaultrouter 的相關設定:

defaultrouter="192.168.0.1"

3.1.2. 設定網路(conf/rc.conf 方式)

若已經知道網卡是哪一種,那麼要設定網路的話直接改 conf/rc.conf 會比較方便。 該檔設定語法與 FreeBSD 標準的 rc.conf(5) 是一致的。

舉個例子,若知道該機器網卡是用 re(4),那麼就在 conf/rc.conf 做下列類似設定:

defaultrouter="192.168.0.1"
ifconfig_re0="inet 192.168.0.2 netmask 255.255.255.0"

3.2. 打造 mfsBSD image

打造 mfsBSD image 檔的過程相當簡單。

首先是把 FreeBSD 安裝光碟或者安裝用的 ISO image 檔丟到 /cdrom。 為維持所有例子的一致,本文假設都是用 FreeBSD 7.0-RELEASE ISO。 而把 ISO image 檔掛載到 /cdrom 目錄相當簡單, 就是用 mdconfig(8)

# mdconfig -a -t vnode -u 10 -f 7.0-RELEASE-amd64-disc1.iso
# mount_cd9660 /dev/md10 /cdrom

接著就開始打造可開機的 mfsBSD image:

# make BASE=/cdrom/7.0-RELEASE

上述的 make 指令要在 mfsBSD 的最上層目錄執行,比方說 ~/mfsbsd-1.0-beta1/

3.3. mfsBSD 開動

現在 mfsBSD image 已經備妥, 要上傳到遠端機器的救急系統或者預先安裝的 Linux® distribution。 要完成這工作最適合的工具就是 scp:

# scp disk.img root@192.168.0.2:.

為了能順利啟動 mfsBSD image, 要把檔案放在欲安裝機器的第一顆(可開機)硬碟上。 假設例子的第一顆開機硬碟代號為 sda, 那麼作法就類似下面這樣:

# dd if=/root/disk.img of=/dev/sda bs=1m

若一切順利,該 image 檔現在應該會在第一顆硬碟的 MBR 磁區並可以開始進行重開機了。 可以用 ping(8) 工具來檢測該機器開機完畢與否。 一旦 ping 到之後, 就可以透過 ssh(1) 連進去,並且用 root 以及剛設定的密碼登入。

4. FreeBSD 作業系統的安裝

現在 mfsBSD 已順利啟動,並且應該可以透過 ssh(1) 方式來連。 本節將介紹如何建立 slice 分割、設定 gmirror 以作 RAID-1、如何以 Sysinstall 來安裝 FreeBSD 作業系統的最小化安裝。

4.1. 準備硬碟

首先要作的是配置硬碟空間給 FreeBSD,像是建立 slice 跟分割區。 很明顯地,目前在跑的作業系統是載入到系統記憶體內執行, 因此要對硬碟配置並無任何問題。 這些工作可以用 Sysinstall 或者以 fdisk(8) 搭配 bsdlabel(8) 來完成。

首先先把各硬碟都先清空。 請對各硬碟作下列指令:

# dd if=/dev/zero of=/dev/ad0 count=2

接著,以您慣用的工具來建立 slice 以及設定 label。 通常會建議以 的 Sysinstall 工具來作會比較輕鬆, 或者是強而又不太會出槌的文字介面 UNIX® 標準工具(像是 fdisk(8), bsdlabel(8)),這部分稍後也會一併介紹。 前者部分在 FreeBSD Handbook 的 安裝 FreeBSD 章節有相當詳盡的介紹,所以這邊主要要介紹的是如何建立 RAID-1 系統以及 ZFS。 這邊會介紹建立以 gmirror(8) 做成的小型 mirrored 檔案系統: / (根目錄), /usr 以及 /var,而硬碟的其餘剩餘空間則通通以 zpool(8) 做成 ZFS 的 mirrored 檔案系統 。 請注意:必須要先把 FreeBSD 作業系統裝好並開完機後,才能進行設定 ZFS 檔案系統。

下面的例子會介紹如何建立 slice 以及 label、在每個分割區上啟用 gmirror(8)、如何在每個 mirrored 分割區上建立 UFS2 檔案系統:

# fdisk -BI /dev/ad0 (1)
# fdisk -BI /dev/ad1
# bsdlabel -wB /dev/ad0s1 (2)
# bsdlabel -wB /dev/ad1s1
# bsdlabel -e /dev/ad0s1 (3)
# bsdlabel /dev/ad0s1 > /tmp/bsdlabel.txt && bsdlabel -R /dev/ad1s1 /tmp/bsdlabel.txt (4)
# gmirror label root /dev/ad[01]s1a (5)
# gmirror label var /dev/ad[01]s1d
# gmirror label usr /dev/ad[01]s1e
# gmirror label -F swap /dev/ad[01]s1b (6)
# newfs /dev/mirror/root (7)
# newfs /dev/mirror/var
# newfs /dev/mirror/usr
1對該硬碟建立 slice 並且在第零軌處將開機表作初始。 請對該機器所有硬碟都作此一動作。
2對各硬碟寫入 label 以及 bootstrap 碼。
3現在手動修改該硬碟的 label,至於如何建立分割區(partitions) 請參閱 bsdlabel(8) 說明。 分割區分別建立:a 是給 / (根目錄), b 給 swap, d/vare/usr, 最後,會在稍後步驟把 f 給 ZFS 使用。
4把剛剛的 label 設定先匯出,再匯入到第二顆硬碟上, 如此一來兩邊的硬碟 label 設定就會同樣。
5在各分割區上啟用 gmirror(8)
6請注意:-F 選項是用在 swap 上。 這參數會讓 gmirror(8) 認為該硬體是處於可靠狀態, 即使發生電源故障或系統當掉,也不會去同步。
7在各個有做 mirror 的分割區上建立 UFS2 檔案系統

4.2. 系統安裝

這裡是最重要的一環, 本節介紹實際上如何在先前一節所做好的硬碟安裝最小化的 FreeBSD, 為了完成此一目標,所有檔案系統都必須掛載妥當,才能讓 Sysinstall 可以把 FreeBSD 裝到硬碟內:

# mount /dev/mirror/root /mnt
# mkdir /mnt/var /mnt/usr
# mount /dev/mirror/var /mnt/var
# mount /dev/mirror/usr /mnt/usr

做完上述動作之後,請執行 sysinstall(8)。 請從主選單中選擇 Custom 安裝,選 OptionsEnter。 然後以方向鍵移動到 Install Root 處,按 Space 鍵然後改為 /mnt,再按 Enter 鍵以將修改值存起來,然後按 q 鍵即可離開這個 Options 畫面。

請注意:本步驟極為重要,若忽略的話那麼 Sysinstall 就沒辦法安裝 FreeBSD。

接著選 Distributions,然後移動游標到 Minimal 處,按 Space 鍵。 本文之所以介紹最小化安裝是為了要節省網路流量,因為系統安裝是透過 ftp 方式來進行。 要離開本畫面,請選 Exit 即可。

至於 PartitionLabel 步驟則可略過, 因為這些目前已經都設定完畢了。

Media 選單中請選 FTP。 請選最近的 mirror 站,並且讓 Sysinstall 假設網路已經設妥。 接下來就會回到 Custom 選單。

最後,按下 Commit 即可開始進行安裝。 完成安裝後,即可離開 Sysinstall。

4.3. 後續安裝步驟

此時 FreeBSD 作業系統應該已經裝完,然而還有些後續流程要做。 必須要做一些後續設定,才能讓 FreeBSD 可以開機跟登入。

現在必須要用 chroot(8) 以切到剛剛新裝好的系統內。 指令如下:

# chroot /mnt

然後再打下列指令以繼續完成:

  • GENERIC kernel 複製到 /boot/kernel 目錄:

    # cp -Rp /boot/GENERIC/* /boot/kernel
  • 建立 /etc/rc.conf, /etc/resolv.conf/etc/fstab 檔案。 別忘了,要記得在 /etc/rc.conf 檔設相關網路設定,以及把 sshd 啟用。 此外, /etc/fstab 檔應該會長像下面這樣:

    # Device                Mountpoint      FStype  Options         Dump    Pass#
    /dev/mirror/swap        none            swap    sw              0       0
    /dev/mirror/root        /               ufs     rw              1       1
    /dev/mirror/usr         /usr            ufs     rw              2       2
    /dev/mirror/var         /var            ufs     rw              2       2
    /dev/cd0                /cdrom          cd9660  ro,noauto       0       0
  • 新增 /boot/loader.conf 檔, 並且內容填入下列:

    geom_mirror_load="YES"
    zfs_load="YES"
  • 執行下列指令,以在下次開機時啟用 ZFS :

    # echo 'zfs_enable="YES"' >> /etc/rc.conf
  • 使用 adduser(8) 工具來新增其他使用者帳號。 別忘了, 至少要有一個帳號得加入 wheel 群組, 才能在重開機後以該帳號切換為 root。

  • 再次檢查上述相關的設定,是否有遺漏或打錯。

現在該系統終於可以重開機了,請用 reboot(8) 指令以重開機。

5. ZFS

系統重開機完畢之後,應該就可以登入了。 歡迎使用全新的 FreeBSD 安裝方式, 完全透過遠端而不必接上 remote console!

接下來只剩要調整 zpool(8) 以及建立 zfs(8) 檔案系統而已。 ZFS 的建立及管理是相當淺顯易懂。 首先, 建立 mirrored pool:

# zpool create tank mirror /dev/ad[01]s1f

接著,建立檔案系統:

# zfs create tank/ports
# zfs create tank/src
# zfs set compression=gzip tank/ports
# zfs set compression=on tank/src
# zfs set mountpoint=/usr/ports tank/ports
# zfs set mountpoint=/usr/src tank/src

一切就是這樣簡單。 若對 FreeBSD 上的 ZFS 細節部分有興趣,請參閱 FreeBSD Wiki 上的 ZFS 一節說明。