Building a Homelab VM Server

Michael Lynch

打造 Homelab VM 伺服器

:本文介紹的是 2017 年建置的 VM。

2020 年版本請參閱《打造 Homelab VM 伺服器(2020 年版)》

概述

我大部分的居家開發工作都是在虛擬機器(VM)中進行。我的主要桌機是一台 Windows 10 電腦,因此過去我都是在 VirtualBox 中執行 VM。

這樣的設定運作起來還算順暢,但我開始意識到痛點越來越多。我上網搜尋,找到了 Brian Moses(布萊恩·摩西斯)的一篇文章,他在文中介紹了如何打造一台專門用來執行 VM 的「homelab(居家實驗室)」伺服器。我非常喜歡這個想法,也因此受到啟發,決定自己動手做一台。

為什麼要用 VM?

乾淨的環境

我撰寫的所有軟體都依賴特定的軟體環境。舉例來說,我的專案 ProsperBot 的開發就依賴 Go 工具鏈、nginx 和 Redis。如果我在主要的桌機上不斷為每個專案安裝相依套件,系統很快就會變得一團亂,到處是不同的網頁伺服器、資料庫伺服器,以及互相衝突的函式庫版本。

安全性:VM 隔離

VM 還能透過將軟體與我的主要系統隔離來提供安全性。我喜歡嘗試各種新工具和應用程式,但任何應用程式都有可能是惡意的(可能是開發者本身就製作了惡意程式,也可能是正當的應用程式被攻擊者入侵,用來散播惡意軟體)。如果我直接在 Windows 電腦上安裝應用程式,結果感染了惡意軟體,那就徹底完了。即使是非常陽春的惡意軟體,只要在我的電腦上執行,就能記錄螢幕上的所有內容、掌控我的 Gmail、Facebook、GitHub,甚至將我所有的檔案勒索

在 VM 中執行的惡意軟體能造成的損害就有限得多。如果我在 VM 中安裝軟體,結果它偷偷安裝了鍵盤記錄程式,它也只能記錄該 VM 內的按鍵輸入,而無法記錄我主要桌機上的操作。VM 並非萬全的防禦,因為進階的惡意軟體仍有可能逃逸出 VM,但仍能提供相當程度的保護。

為什麼需要一整台 VM 伺服器?

過去我都是在主要的 Windows 桌機上用 VirtualBox 執行虛擬機器,但有幾個問題:

  • 當我重新啟動主要電腦時,也必須費力地將所有執行中的 VM 逐一關機或暫停,然後在重開機後再一個個重新啟動。
  • 我的主要電腦大約每個月會當機一次,而 VirtualBox 在從當機中復原的表現非常差。重開機後,它會認為 VM 映像檔仍處於鎖定狀態,我必須在檔案系統中東搞西搞才能修復。

有了專屬的 VM 伺服器,我就可以在上面執行一套精簡的 Linux 伺服器作業系統。機器上執行的軟體越少,需要重新開機的頻率就越低,當機的可能性也越小。

還有一些我覺得很有趣的點對點專案(例如 OpenBazaarBitSquare),但它們需要全天候執行伺服器。我曾嘗試用 VirtualBox 來做這件事,但上述的種種麻煩往往讓我對持續維持這些 VM 的運作失去興趣。如果我能一次建立好 VM 後就讓它持續運作,嘗試這些專案就會吸引人得多。

挑選零件

CPU

AMD Ryzen 7 1700

在布萊恩·摩西斯的部落格文章中,他很興奮地提到可以趁二手 Intel Xeon CPU 價格低廉時入手。這個想法很不錯,但我擔心二手伺服器硬體會有故障風險,因此偏好全新的零售 CPU。

我在主要電腦上有對 CPU 超頻,但這也導致偶爾會當機。為了讓 VM 伺服器盡可能穩定,我決定不對這套系統超頻。這樣帶來的好處是挑選零件變得更簡單、也更便宜,因為我不需要為了不鎖頻的 CPU、支援超頻的主機板或高階 CPU 散熱器而多花錢。

最後我選擇了AMD Ryzen 7 1700。它是 8 核心、16 執行緒,應該很適合用來同時執行多個 VM,而且最近評價相當不錯。

主機板

ASRock AB350M-HDV

我住在曼哈頓一間相當小的單房公寓,實體空間非常寶貴。而我的需求也讓許多通常會佔用大量機殼空間的零件變得不需要,例如磁碟機、顯示卡或高階 CPU 風扇。

這些需求讓我傾向選擇 MicroATX 主機板,最後我選了ASRock AB350M-HDV。我過去使用 ASRock 主機板的經驗都不錯,這款看起來也是個穩固的選擇。我對它的記憶體支援有點猶豫,因為它只有兩個 RAM 插槽,代表我只能安裝 2x16 GB 的記憶體,毫無擴充空間。我心想,如果以後真的不夠用,到時候應該已經有 2x32 GB 的記憶體可買,大不了到時再忍痛把兩條都換掉。

回頭來看,我真希望當初買的是有內建顯示功能的主機板(請見下方的零件回顧)。

記憶體

G.SKILL Flare X Series 32GB

我的主要電腦有 32 GB 的 RAM,日常使用時大約會用到 15 GB(即使同時執行 Windows 10 和多個 VM)。我估計 16 GB 應該勉強夠用,但 32 GB 在未來 2 到 3 年內應該是個安全的上限。我選擇了G.SKILL Flare X Series 32GB(2 x 16GB),因為這是經測試與我的主機板相容的速度最快的記憶體。

磁碟

Samsung 850 EVO

和布萊恩·摩西斯一樣,我有一台 NAS,有充足的可用空間,因此就本地儲存而言,我只需要一顆小容量的磁碟來存放宿主/hypervisor(虛擬機器監視器) 作業系統。我選擇了 250 GB 的Samsung 850 EVO,主要是因為我覺得 M.2 介面非常簡潔。只要把一片晶片鎖到主機板上就完成了,不需要處理固定支架或 SATA 排線。250 GB 遠超過我的需求,但以 M.2 SSD 來說,這似乎就是入門容量。

機殼

Rosewill Micro ATX SRM-01

至於機殼,我主要想找一個非常小的。我打算把伺服器藏起來不讓人看見,所以不需要美觀或華麗的外觀。Rosewill Micro ATX SRM-01 小巧、便宜又實用,是個不錯的選擇。

顯示卡

我主要打算以無頭(headless)模式執行這套系統,僅透過 SSH/Ansible 來管理,但偶爾還是需要顯示輸出(例如初次安裝時,或是不小心弄壞網路設定時)。我一開始以為可以使用主機板的內建顯示支援,但結果不行(請見下方的零件回顧)。

由於我對顯示卡的需求很彈性,我只想找個便宜且評價不錯的產品,因此選擇了EVGA GeForce 8400 GS

為這套系統再買一台專屬螢幕並不划算,因為有 99.99% 的時間我都是以無頭模式管理它。剩下的 0.01% 時間,我只要鑽到桌子底下,把主螢幕的 HDMI 線從主要桌機拔起來接到 VM 伺服器上就行了。

網路卡

我本來打算直接使用主機板內建的 1 Gbps 網路卡,因為我的網路只有 1 Gbps。它在 Ubuntu 16.04 上確實可以隨插即用,但我很快就發現網路速度被限制在約 10 Mbps。稍作研究後,我發現 Ubuntu 16.04 並未包含正確的驅動程式,因此必須新增一個額外的 apt-get 軟體來源來安裝 r8168-dkms 套件。我照做了,但在重新開機後,Ubuntu 卻無法偵測到網路卡……

到了這個地步,我已經厭倦了折騰內建網路卡,乾脆直接買了一張據說在 Ubuntu 上可隨插即用的 PCI 網路卡:Broadcom BCM5751 Netxtreme。它不需任何設定就能達到 1 Gbps 的速度,既然只要 23 美元,我覺得就沒必要再花時間去追究內建網路卡的問題了。

另外值得一提的是,內建網路卡與 ESXi 6.5 相容,但 Broadcom 網路卡相容。

最終零件清單

類別零件價格
CPUAMD Ryzen 7 1700$323.66
主機板ASRock AB350M-HDV$69.99
磁碟Samsung 850 EVO - 250GB$99.99
記憶體G.SKILL Flare X Series 32GB (2 x 16GB) F4-2400C15D-32GFXR$224.99
電源供應器EVGA 430 W1, 80+ WHITE 430W 100-W1-0430-KR$29.99
顯示卡EVGA 512-P3-1300-LR GeForce 8400 GS$29.99
網路卡Broadcom BCM5751 Netxtreme$22.95
機殼Rosewill Micro ATX SRM-01$21.99
總計$823.55

組裝

零件全都到齊後,就該開始組裝了!

伺服器電腦零件

這是組裝前的所有零件。照片中沒有網路卡和顯示卡,因為我是在實際嘗試執行系統後,才發現需要它們。

組裝後的伺服器

這是零件全數組裝完成的伺服器。看起來沒什麼,因為零件本來就不多。特別棒的是不需要處理磁碟機的電源線或 SATA 排線,因為唯一的磁碟就是直接連接在主機板上的 M.2 SSD。

由於公寓空間有限,我想要一台可以藏起來不被看到的伺服器。我決定把它放在書桌抽屜後方、緊鄰書桌的位置。它在實體上仍和我的主要桌機一樣容易碰到,但大部分時間都隱藏在視線之外:

組裝完成的伺服器-正面視圖

組裝完成的伺服器-俯視圖

組裝完成

安裝宿主作業系統

VM 伺服器的宿主作業系統應該越輕量越好。它只需要承載 hypervisor,不需要其他多餘的功能。我們在宿主上安裝的軟體越多,就有越多套件需要保持更新,才能維持伺服器的穩定。

我嘗試了幾種不同的 Linux 發行版,但只有 Ubuntu Server 能在我的硬體上隨裝即用(16.04 和 17.04 都測試成功)。我想是Ryzen 的 SMT 功能導致其他發行版安裝失敗。我猜可以透過在 BIOS 中停用 SMT、安裝其他發行版、再將核心升級到 >= 4.10 後重新啟用 SMT 來解決,但既然我本來就對 Ubuntu 16.04 Server 最熟悉,就決定直接沿用它。

執行虛擬機器

KVM

至於 hypervisor,我使用的是KVM。它是個相當成熟且廣泛使用的產品,當我需要上網搜尋支援解答時很有幫助。一些更偏向企業導向的 hypervisor 即使軟體本身免費,仍需要授權金鑰,但 KVM 沒有這個問題,因為它是免費且開源的。

Kimchi

我喜歡能透過網頁介面來管理基礎架構,因此安裝了Kimchi,這是以 HTML5 實作的 KVM 管理介面。

我會形容 Kimchi 是「還不錯」。有些儀表板做得相當漂亮:

Kimchi 主機使用率儀表板

Kimchi 客體總覽

Kimchi 網頁介面截圖

它在某些事情上也做得非常好,例如建立橋接網路卡(這在命令列上搞起來有點麻煩)。

缺點主要在於使用者體驗。做一些簡單的事情就需要點很多下,而且我經常遇到頁面自動更新(例如客體 VM 剛關機完成),導致選單消失,迫使使用者必須重頭來過。這些缺點不算太嚴重,用久了之後,也就比較容易調整操作方式來避開這些 UX 臭蟲。

其他嘗試:ESXi 6.5

其實我一開始是打算使用VMware vSphere Hypervisor,也就是 VMware 提供的免費 hypervisor。它看起來是個成熟得多、使用者也更多的產品(因此應該更容易找到支援)。然而,它最後被證實與我的主機板網路卡和 Ryzen CPU 都不相容。在安裝 Broadcom 網路卡並在 BIOS 中停用 CPU 的 SMT 後,我終於能讓它跑起來,但到了那時,我已經用了 Kimchi 好幾天,也習慣了它。

vSphere 似乎沒有提供比 Kimchi 明顯更好的體驗。它的介面精緻許多,但流程也非常笨拙,只要一個步驟出錯,就必須將整個多階段流程完全重來。而且也不清楚該如何進入命令列的 shell 來直接執行我想要的操作(我確定應該是可行的,只是我沒有花足夠的時間去研究)。

對我而言真正的致命傷是,登入時 vSphere 會醒目地顯示警告,說除非輸入 VMware 註冊金鑰,否則軟體將在 60 天後停止運作。VMware 雖然免費提供授權金鑰,但既然 Kimchi 完全不需要任何授權驗證,又能提供與 vSphere 差不多的體驗,我就不想再去處理註冊金鑰的麻煩。

自動化伺服器佈建

我非常喜歡 Ansible,因此寫了一個Ansible playbook 來自動佈建我的 VM 伺服器。它會執行以下工作:

  • 將核心更新至與 Ryzen 的 SMT 功能相容的版本
  • 安裝 KVM 和 Kimchi
  • 掛載用於存放 VM 映像檔的 NFS 共享

你也可以透過安裝 Ansible並執行以下指令,使用同一個 playbook 來佈建你的伺服器:

VM_SERVER=vmaster # Replace with your VM server's hostname
echo "${VM_SERVER}" > hosts
wget https://mtlynch.io/files/provision-vm-host.yml

# Replace the extra-vars with the values for your NFS share
ansible-playbook provision-vm-host.yml \
  --extra-vars "cifs_share=/nas-hostname/VMs" \
  --extra-vars "cifs_username=foo" \
  --extra-vars "cifs_password=bar"

回顧我的選擇

回顧:CPU

我最值得商榷的選擇是 CPU。它的確跑得很快,但可能有點效能過剩,因為即使同時執行五台 VM、其中幾台還在跑吃重的運算工作,總 CPU 使用率也從未超過 35%。

Ryzen 的缺點是目前技術非常新,處於最前線,相容性還不穩定。我嘗試安裝 Fedora 25 Server、Debian 8.7、CentOS 7 和 ESXi 6.5,結果全都在安裝過程中失敗,因為它們與 Ryzen 不相容。如果我在 BIOS 中為 CPU 停用 SMT(多執行緒),其中一些就能安裝成功,但那會讓 CPU 從 16 核心變成 8 核心,感覺有點可惜。唯一能成功安裝的作業系統只有 Ubuntu(16.04 和 17.04 都成功)。

Ryzen 也限制了我能購買的記憶體。主機板支援最高達 3200 MHz 的 DDR4 RAM,但 Corsair 沒有任何經測試相容的記憶體。G.SKILL 有,但沒有比 DDR4 2400 MHz 更快的產品。

回顧:主機板

我對這張主機板的選擇大致上滿意。它小巧精簡,卻仍為所有零件保留了足夠的空間。

我唯一的遺憾是沒有仔細閱讀內建顯示支援的規格。它在「Onboard Video Chipset」底下的規格寫道:

內建於 A 系列 APU 中的 AMD Radeon R7/R5 系列顯示晶片,支援 HDMI,最高解析度可達 4K x 2K(4096x2160)@ 24Hz/(3840x2160)@ 30Hz

所以我當時想:「太好了!它自己就有顯示卡,少裝一樣東西。」我沒搞懂的是,這句話的意思其實是「只有當你使用 AMD A 系列 APU 時才支援顯示功能」。APU 是 AMD 結合 CPU 與 GPU 的晶片,而 Ryzen 並不是 APU,所以對我來說就沒有內建顯示可用。

如果再來一次,我會選擇GIGABYTE GA-AB350M-Gaming 3,就為了內建 GPU 所帶來的單純與便利。

回顧:記憶體

32 GB 一開始看起來有點過剩,但隨著我為各種用途新增更多 VM,記憶體使用量已經超過 18 GB,所以我很慶幸當初選擇了 32 GB 而非 16 GB。

回顧:電源供應器

這顆電源供應器對這套系統來說瓦數足夠,而且相當安靜。以 30 美元來說,CP 值也很不錯。

唯一的缺點是它採用非模組化線材。我的系統非常精簡,只需要 24-pin 主機板線和 8-pin CPU 線,其餘的線材全是多餘的雜亂,不過它們可以相當整潔地藏在機殼內 5.25 吋的光碟機槽中(在我的機殼裡當然是空的)。

如果重來一次,我會考慮半模組化或全模組化的電源供應器,這樣就能省去多餘的電源線。

結論

這台 Homelab VM 伺服器運作得非常好。知道我的 VM 全天候都在執行非常方便,我只要透過 SSH 連線或在瀏覽器中檢視即可,不必再在 VirtualBox 中手動啟動任何東西。

一個意想不到的好處是,我不再需要對客體作業系統的 CPU/RAM 資源配置錙銖必較。我的主要桌機是 8 核心 i7、搭配 32 GB RAM。過去我不想讓 VM 搶走主要作業系統的資源,所以通常只會給客體作業系統分配 1 顆 CPU 和 1 GB RAM,等到發現資源不足時才再增加。有了 Homelab VM 伺服器後,資源對每個人來說都綽綽有餘!我標準的客體作業系統範本使用 4 核心和 4 GB 記憶體,對我大多數的環境來說已經是相當充裕的上限。這代表我不必再花時間手動管理客體作業系統的資源。

如果你從事的軟體專案需要多種不同的開發或測試環境,我非常推薦在 VM 中工作,並使用一台專屬的 VM 伺服器。

原文由 Michael Lynch 發布

本文章由 muse-spark-1.2-contributor 進行翻譯