Building a Homelab VM Server

Michael Lynch

打造 Homelab 虛擬機伺服器

原文由 Michael Lynch 發布,訂閱此部落格

:本文介紹的是 2017 年建置的虛擬機。

如需查看 2020 年的版本,請參閱「Building a Homelab VM Server(2020 Edition)」

概覽

我在家的大部分開發工作都是在虛擬機(VM)上進行的。我的主力桌機是一台 Windows 10 電腦,所以過去我都是在 VirtualBox 裡跑虛擬機。

這樣的配置本來也還堪用,但我開始愈來愈常感受到它的痛點。上網搜尋後,我找到了 Brian Moses 的一篇文章,他在文中介紹了如何打造一台專門用來跑虛擬機的「homelab」伺服器。我很喜歡這個點子,也因此受到啟發決定如法炮製。

為什麼要用虛擬機?

乾淨的環境

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

安全性:虛擬機隔離

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

在虛擬機中執行的惡意軟體能造成的損害就有限得多。如果我在虛擬機裡安裝軟體,即便它偷偷裝了鍵盤側錄程式,也只能記錄在該虛擬機內的按鍵,無法竊取我主力桌機的輸入。虛擬機並非萬無一失的防禦,因為高階的惡意軟體仍有可能逃脫虛擬機,但整體來說仍能提供相當程度的保護。

為什麼需要一整台虛擬機伺服器?

我原本都是在主力 Windows 桌機上用 VirtualBox 跑虛擬機,但有幾個問題:

  • 當我重新啟動主力電腦時,也得費工地將所有執行中的虛擬機一一關機或暫停,重開機後再逐一啟動。
  • 我的主力電腦大約每個月會當機一次,而 VirtualBox 在當機後的復原能力很差。重開機後,它會認為虛擬機映像檔仍被鎖定,我就得在檔案系統裡瞎搞一通才能修復。

有了專屬的虛擬機伺服器,我就可以在上面跑一個極簡的 Linux 伺服器作業系統。機器上跑的軟體愈少,需要重新啟動的頻率就愈低,當機的機率也愈小。

還有一些我覺得很有趣的點對點專案(例如 OpenBazaarBitSquare),但它們需要伺服器全天候運行。我曾試著用 VirtualBox 來跑,但上述那些麻煩事總讓我漸漸失去維持這些虛擬機運作的動力。如果能建好虛擬機後就讓它一直跑著,嘗試這些專案就會吸引人得多。

挑選零組件

CPU

AMD Ryzen 7 1700

在 Brian 的部落格文章中,他很興奮地利用了二手 Intel Xeon 處理器價格低廉的優勢。這個點子很不錯,但我擔心二手伺服器硬體故障的風險,所以還是偏好全新的零售版處理器。

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

最後我選擇了AMD Ryzen 7 1700。它有 8 核心、16 執行緒,應該很適合同時跑多台虛擬機,而且最近評價相當不錯。

主機板

ASRock AB350M-HDV

我住在曼哈頓一間相當小的單房公寓,實體空間非常珍貴。我的需求也讓我省去了許多通常很佔空間的零組件,像是硬碟、顯示卡或高階處理器風扇。

這些需求讓我傾向選擇 MicroATX 主機板,最後挑了ASRock AB350M-HDV。我過去使用華擎主機板的經驗都不錯,這張看起來也是個穩健的選擇。讓我猶豫的是它的記憶體支援,它只有兩個 RAM 插槽,意味著我只能裝 2 條 16GB 的記憶體,毫無擴充空間。我心想,如果以後真的不夠用,到時候市面上應該已經有 2x32GB 的組合,到時就忍痛整組換掉就好。

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

記憶體

G.SKILL Flare X Series 32GB

我的主力電腦有 32GB 記憶體,日常使用大約會用到 15GB 左右(即使同時跑著 Windows 10 和多台虛擬機)。我想 16GB 應該也夠用,但 32GB 在未來 2 到 3 年內應該是比較保險的上限。我選擇了G.SKILL Flare X Series 32GB(2 x 16GB),因為這是經測試與我的主機板相容的速度最快的記憶體。

硬碟

Samsung 850 EVO

和 Brian 一樣,我有一台 NAS,有充足的儲存空間,所以本地端只需要一顆小硬碟來裝宿主/hypervisor 作業系統就好。我選了 250GB 的Samsung 850 EVO,主要是因為我覺得 M.2 介面非常俐落——只要把一片小晶片鎖到主機板上就完成了,不用處理支架或 SATA 線。250GB 對我來說遠遠超過需求,但以 M.2 SSD 來說,這似乎已經是入門容量了。

機殼

Rosewill Micro ATX SRM-01

機殼方面,我主要想找盡量小的。我打算把伺服器藏起來不讓人看到,所以不需要漂亮或花俏的外觀。Rosewill Micro ATX SRM-01 小巧、便宜又實用,正合我意。

顯示卡

我主要是要讓這台系統無頭運行,透過 SSH/Ansible 來管理,但偶爾還是需要接螢幕(例如初次安裝,或是不小心把網路設定搞壞的時候)。我一開始以為可以用主機板的內建顯示功能,但結果不行(詳見下方的零組件回顧)。

由於我對顯示卡的要求不高,只要便宜、評價不錯就行,所以我選了EVGA GeForce 8400 GS

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

網路卡

我原本打算直接用主機板內建的 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

組裝

零組件到齊後,就來開始組裝吧!

伺服器電腦零組件

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

組裝後的伺服器

這是零組件全數組裝好的伺服器。因為零組件不多,看起來相當簡潔。特別方便的是,唯一的硬碟是直接接在主機板上的 M.2 SSD,所以完全不用處理電源線或 SATA 線。

因為公寓空間有限,我想把伺服器藏到看不見的地方。我決定把它放在書桌抽屜後方、緊鄰書桌的位置。它依然和我的主力桌機一樣伸手可及,但大部分時間都不會映入眼簾:

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

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

組裝完成

安裝宿主作業系統

虛擬機伺服器的宿主作業系統應該愈輕量愈好。它只需要負責承載 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 網頁介面截圖

它在某些功能上也做得很好,例如建立橋接網路卡(這在命令列上處理起來有點麻煩)。

缺點主要在使用者體驗上。做一些簡單的操作需要點很多下,而且經常會遇到頁面自動更新(例如某台虛擬機剛關機完成),導致情境選單消失、使用者被迫重頭再操作一次。這些缺點還不算太嚴重,用久了之後,慢慢調整自己的操作方式就能避開這些 UX 問題。

備選:ESXi 6.5

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

vSphere 的體驗並沒有比 Kimchi 好上多少。介面確實精緻許多,但操作流程同樣很笨拙,只要在多步驟流程中犯一個錯,就得整個重來。而且也不清楚該如何進入命令列來直接用指令操作(我確定一定可以,但我沒有花時間去研究)。

讓我打退堂鼓的關鍵是,登入時 vSphere 會顯眼地跳出警告,說 60 天後若未輸入 VMware 註冊金鑰,軟體就會停止運作。VMware 雖然免費提供授權金鑰,但既然 Kimchi 沒有任何授權檢查、體驗也與 vSphere 差不多,我就不想再去處理註冊金鑰的事了。

自動化伺服器佈建

我是 Ansible 的愛用者,所以我寫了一個 Ansible playbook 來自動佈建我的虛擬機伺服器。它會執行以下工作:

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

你也可以用同樣的 playbook 來佈建你的伺服器,只要先安裝 Ansible,然後執行以下指令:

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 的工作,總 CPU 使用率也從未超過 35%。

Ryzen 的缺點在於它現在還非常新,支援度不太穩定。我試著安裝 Fedora 25 Server、Debian 8.7、CentOS 7 和 ESXi 6.5,結果全都在安裝過程中當掉,因為它們與 Ryzen 不相容。如果我在 BIOS 中停用 SMT(多執行緒),其中一些系統就能安裝成功,但那會讓處理器從 16 核心變成 8 核心,感覺有點可惜。唯一能成功安裝的作業系統是 Ubuntu(16.04 和 17.04 都成功)。

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

回顧:主機板

我對主機板的選擇大致上滿意。它小巧精簡,又沒有為了體積而犧牲零組件的安裝空間。

我唯一後悔的是沒有仔細看內建顯示的支援說明。規格表上在「內建顯示晶片」一欄寫著:

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

所以我想:「太好了!它有自己的顯示晶片,少裝一樣東西。」但我沒搞懂的是,這句話的意思其實是「只有在使用 AMD A 系列 APU 時才支援顯示」。APU 是 AMD 結合處理器與顯示晶片的產品,而 Ryzen 並不屬於這類,所以我的主機板根本沒有內建顯示可用。

如果重來一次,我會選擇 GIGABYTE GA-AB350M-Gaming 3,就為了能有內建顯示的便利性。

回顧:記憶體

32GB 一開始感覺有點太多,但隨著我為了各種用途新增更多虛擬機,記憶體使用量已經超過 18GB,所以很慶幸當初選了 32GB 而不是 16GB。

回顧:電源供應器

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

唯一的缺點是它採用非模組化線材。我的系統非常精簡,只需要 24-pin 主機板電源線和 8-pin 處理器電源線,其他線材都是多餘的雜物,不過它們倒是可以整齊地藏在機殼空著的 5.25 吋光碟機槽裡。

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

結論

這台 homelab 虛擬機伺服器運作得非常順利。能確定虛擬機一直都在線上,讓我隨時可以透過 SSH 或瀏覽器連上去,而不必在 VirtualBox 裡手動啟動,這真的很方便。

一個意外的好處是,我不再需要斤斤計較分配給虛擬機的 CPU/記憶體資源。我的主力桌機是 8 核心 i7 加上 32GB 記憶體,我不想讓虛擬機搶走主系統的資源,所以過去通常只會給虛擬機 1 顆 CPU 和 1GB 記憶體,等到發現資源吃緊才再往上加。有了 homelab 虛擬機伺服器後,資源多到大家都夠用!我現在的標準虛擬機範本直接給 4 核心和 4GB 記憶體,對大多數環境來說已經是相當充裕的上限。這讓我省下不少手動管理虛擬機資源的時間。

如果你從事的軟體專案需要多種不同的開發或測試環境,我非常推薦使用虛擬機,並用一台專屬的虛擬機伺服器來運行它們。

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

留言