Building a Homelab VM Server

Michael Lynch

搭建家庭实验室虚拟机服务器

原文由 Michael Lynch 发布,订阅该博客

:本文介绍的是 2017 年搭建的一台虚拟机主机。

2020 年版本请参阅《搭建家庭实验室虚拟机服务器(2020 版)》

概述

我大部分的家庭开发工作都是在虚拟机(VM)中完成的。我的主力台式机是一台 Windows 10 电脑,所以之前一直都是在 VirtualBox 里运行虚拟机。

这套方案用起来倒也没什么大问题,但我逐渐开始感受到越来越多的痛点。搜索之后,我找到了 Brian Moses 的一篇文章,他在文中介绍了如何搭建一台专门用于运行虚拟机的“家庭实验室”服务器。我非常喜欢这个想法,于是也决定自己动手做一台。

为什么要用虚拟机?

干净的环境

我写的所有软件都依赖特定的软件环境。例如,我的项目 ProsperBot 的开发就依赖 Go 工具链、nginx 和 Redis。如果把每个项目的所有依赖都装在主力台式机上,机器上就会堆满各种 Web 服务器、数据库服务器以及相互冲突的同类库版本,变得一团糟。

安全性:虚拟机隔离

虚拟机还能通过将软件与主系统隔离来提供安全性。我喜欢尝试各种新工具和应用,但任何应用都有可能是恶意的(可能是开发者本身就做了恶意软件,也可能是正规应用被攻击者劫持用来传播恶意代码)。如果直接把应用装到 Windows 主机上,一旦感染恶意软件就全盘皆输。即使是非常基础的恶意软件,只要在主机上运行,就能记录屏幕上的所有内容、控制我的 Gmail、Facebook、GitHub 账号,甚至将所有文件加密勒索

而在虚拟机中运行的恶意软件,能造成的危害就有限得多。如果我在虚拟机里安装的软件偷偷装了键盘记录器,它也只能记录该虚拟机内的按键,无法影响到我的主力台式机。当然,虚拟机并非万无一失,高级的恶意软件仍有可能逃逸出虚拟机,但总体上依然能提供很大程度的保护。

为什么要专门搞一台虚拟机服务器?

之前我一直在主力 Windows 台式机上用 VirtualBox 运行虚拟机,但遇到了几个问题:

  • 每当重启主力电脑时,我都得费劲地把所有正在运行的虚拟机逐一关机或挂起,重启后再一个个重新启动。
  • 我的主力电脑大概每月会崩溃一次,而 VirtualBox 在崩溃恢复方面做得很差。重启后,它会认为虚拟机镜像文件仍被锁定,我不得不去文件系统里折腾一番才能修复。

有了专用的虚拟机服务器,我就可以在上面运行一个极简的 Linux 服务器系统。机器上运行的软件越少,需要重启的频率就越低,崩溃的可能性也越小。

还有一些我觉得很有意思的点对点项目(比如 OpenBazaarBitSquare),但它们需要服务器全天候运行。我曾尝试用 VirtualBox 来跑这些服务,但上面提到的那些麻烦让我渐渐失去了让这些虚拟机持续运行的耐心。如果能一次性创建好虚拟机然后让它一直跑着,尝试这些项目就会有吸引力得多。

挑选配件

CPU

AMD Ryzen 7 1700

在 Brian 的博文中,他很兴奋地提到了二手 Intel Xeon CPU 价格低廉的优势。这个想法不错,但我担心二手服务器硬件出现故障的风险,所以更倾向于买全新的零售版 CPU。

我的主力电脑 CPU 是超频的,但这也会导致偶尔崩溃。为了让虚拟机服务器尽可能稳定,我决定这套系统不超频。这样做还有个好处,就是选配件更简单、也更便宜,因为不需要为不锁频的 CPU、支持超频的主板或高端 CPU 散热器额外付费。

最终我选择了AMD Ryzen 7 1700。它是 8 核 16 线程,应该很适合同时运行多个虚拟机,而且最近口碑很好。

主板

ASRock AB350M-HDV

我住在曼哈顿一套很小的一居室里,物理空间非常紧张。而我的需求也省去了很多通常会占用大量空间的配件,比如硬盘、显卡或高端 CPU 风扇。

这些因素让我倾向于选择 MicroATX 主板,最终选定了ASRock AB350M-HDV。我以前用华擎的主板体验一直不错,这款看起来也是个稳妥的选择。让我有些犹豫的是它的内存扩展性,它只有两个内存插槽,也就是说只能装 2 条 16GB 的内存,之后就没有扩展空间了。不过我想,如果以后真的不够用了,到时候应该已经有 2x32GB 的套条了,大不了到时把两条都换掉。

回过头看,我有点后悔没买带集成显卡的主板(见下文配件回顾)。

内存

G.SKILL Flare X 系列 32GB

我的主力电脑有 32GB 内存,日常使用(即使开着 Windows 10 和多个虚拟机)大概会用到 15GB 左右。我觉得 16GB 也许够用,但 32GB 在未来 2 到 3 年内应该是个比较保险的上限。我选择了G.SKILL Flare X 系列 32GB(2 x 16GB),因为这是与我的主板兼容并经过测试的速度最快的内存。

硬盘

Samsung 850 EVO

和 Brian 一样,我有一台 NAS,可用空间很充足,所以本地存储只需要一块小硬盘来装宿主机/Hypervisor 系统就行了。我选了一块 250GB 的Samsung 850 EVO,主要是看中 M.2 接口非常简洁——就是一块芯片拧到主板上就完事了,不用处理硬盘支架或 SATA 线。250GB 其实远超出我的需求,但对于 M.2 固态硬盘来说,这似乎已经是入门容量了。

机箱

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

组装

配件到齐,就该开始组装了!

服务器配件

这是组装前的所有配件。照片里没有网卡和显卡,因为直到真正尝试运行系统时,我才意识到还需要它们。

组装后的服务器

这是配件全部装好后的服务器。结构很简单,因为配件本来就不多。特别省心的是,不用处理硬盘的电源线或 SATA 线,因为唯一的硬盘就是直接插在主板上的 M.2 固态硬盘。

由于公寓空间有限,我想把服务器藏到看不见的地方。最后我把它放在了书桌抽屉后面,紧挨着桌子。虽然基本藏起来了,但需要操作时和主力台式机一样触手可及:

组装完成的服务器 - 正面视图

组装完成的服务器 - 俯视图

组装完成

安装宿主机操作系统

虚拟机服务器的宿主机系统应该尽可能轻量。它只需要承载 Hypervisor,不需要其他太多功能。宿主机上装的软件越多,需要保持更新以维持稳定的软件包就越多。

我试了几个不同的 Linux 发行版,但在我的硬件上只有 Ubuntu Server 能开箱即用(16.04 和 17.04 都测试成功)。我觉得是Ryzen 的 SMT 功能导致其他发行版安装失败。我猜可以通过在 BIOS 中关闭 SMT,先装好其他发行版,再把内核升级到 >= 4.10,然后重新开启 SMT 来绕过这个问题,但反正 Ubuntu 本来就是我最熟悉的发行版,所以就直接用了Ubuntu 16.04 Server

运行虚拟机

KVM

Hypervisor 我选用了KVM。它是一款相当成熟、用户广泛的产品,遇到问题时在网上很容易搜到解决方法。一些更偏企业级的 Hypervisor 即使免费也需要许可证密钥,而 KVM 没有这个问题,它是完全免费开源的。

Kimchi

我喜欢通过网页界面来管理基础设施,所以安装了Kimchi——KVM 基于 HTML5 的管理界面。

我对 Kimchi 的评价是“还行”。有些仪表盘做得相当漂亮:

Kimchi 主机资源使用仪表盘

Kimchi 虚拟机列表视图

Kimchi 网页界面截图

它在某些功能上做得非常好,比如创建桥接网卡(这在命令行里配置起来相当麻烦)。

主要短板在于交互体验。做一些简单的操作需要点击很多次,而且经常会遇到页面自动刷新(比如某台虚拟机刚好关机完成),导致右键菜单消失,不得不重新开始整个流程。不过这些问题倒也不算太严重,用久了之后慢慢适应,也就学会如何避开这些交互上的小毛病了。

备选:ESXi 6.5

其实我一开始是打算用VMware vSphere Hypervisor 的,也就是 VMware 免费提供的 Hypervisor。它看起来是一款更成熟、用户群更大的产品(所以应该更容易找到技术支持)。然而,它与我的主板网卡和 Ryzen CPU 都不兼容。直到装上 Broadcom 网卡并在 BIOS 中关闭 CPU 的 SMT 后,我才终于能跑起来,但那时我已经用了 Kimchi 好几天,也习惯了。

vSphere 的体验似乎也并不比 Kimchi 好多少。它的界面确实精致得多,但操作流程同样非常笨拙,稍有一步出错就得把整个多步骤流程完全重来。而且也不清楚该怎么进入命令行去直接操作(我相信肯定可以,但没有花时间去深究)。

让我最终放弃 vSphere 的原因是,登录时会醒目地提示:除非输入 VMware 注册密钥,否则软件将在 60 天后停止工作。VMware 确实免费提供许可证密钥,但既然 Kimchi 完全没有许可验证的束缚,体验又和 vSphere 差不多,我就不想再去折腾注册密钥了。

自动化配置服务器

我非常喜欢 Ansible,所以写了一个Ansible playbook 来自动配置我的虚拟机服务器。它会完成以下几件事:

  • 将内核更新到兼容 Ryzen SMT 功能的版本
  • 安装 KVM 和 Kimchi
  • 挂载用于存放虚拟机镜像的 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。它的速度确实很快,但可能有点性能过剩——即使同时运行五台虚拟机、其中几台还在执行 CPU 密集型任务,总 CPU 使用率也从未超过 35%。

Ryzen 的缺点在于当时它还非常新,兼容性不太稳定。我尝试安装 Fedora 25 Server、Debian 8.7、CentOS 7 和 ESXi 6.5,结果都因为与 Ryzen 不兼容而在安装过程中失败。如果在 BIOS 中关闭 CPU 的 SMT(多线程),其中一些倒是能装上,但那样就相当于把 16 线程的 CPU 降成了 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 将 CPU 和 GPU 合二为一的芯片,而 Ryzen 并不属于这一类,所以我的主板实际上没有板载显卡可用。

如果再来一次,我会选择GIGABYTE GA-AB350M-Gaming 3,就为了能有板载显卡带来的省事。

回顾:内存

32GB 一开始看似过剩,但随着我为各种任务添加越来越多的虚拟机,内存占用已经超过了 18GB,所以很庆幸当初选了 32GB 而不是 16GB。

回顾:电源

这款电源的功率对这套系统来说足够了,而且相当安静。30 美元的价格性价比也很高。

唯一的缺点是它采用非模组线材。我的系统非常精简,只需要 24-pin 主板供电线和 8-pin CPU 供电线,其余的线都是多余的,不过倒是可以比较整洁地藏进机箱空置的 5.25 英寸光驱位里。

如果重来一次,我会考虑半模组或全模组电源,这样就能去掉那些多余的线材了。

总结

这台家庭实验室虚拟机服务器运行得非常好。知道虚拟机一直在后台运行非常方便,我只需通过 SSH 连进去或在浏览器中查看就行,不用再在 VirtualBox 里手动启动。

一个意外的好处是,我不再需要对虚拟机的 CPU/内存分配那么精打细算了。我的主力台式机是 8 核 i7 加 32GB 内存,以前为了不让虚拟机抢占主系统的资源,我通常只给每台虚拟机分配 1 核 CPU + 1GB 内存,只有在发现资源吃紧时才增加。有了这台家庭实验室服务器,资源对大家来说都绰绰有余!我现在的标准虚拟机模板是 4 核 4GB 内存,这对大多数环境来说已经是足够的上限了。这样我就不用再花那么多时间手动管理虚拟机的资源分配了。

如果你从事的软件项目需要多种开发或预发布环境,我强烈建议在虚拟机中工作,并使用一台专用的虚拟机服务器。

本文章由 muse-spark-1.2-contributor 进行翻译

评论