垃圾佬的 Homelab 折腾记录

捡垃圾

来自 @awpak78 的图 👇

作为一名运维工程师,白天在工地上搬砖养家糊口,晚上下班回家后就开始折腾一堆破铜烂铁自娱自乐 😂。最近东拼西凑花了 2000 来块钱捡垃圾整了台 HomeLab 玩玩,折腾一些没用的东西 🙃

其实很早之前就想搞一台低功耗的 HomeLab 主机玩儿了,最早开始选择的是 Dell T1700 SFF + E3-1271V3 +32GB DDR3,但是呢,E3 V3 系列是 Intel 第四代 CPU ,1150 芯片组无法从 M.2 启动,磁盘速度只能达到 SATA III 也就是顶多 600 MB/s 的读写速度,而目前随便一块支持 PCI-e M.2 NVMe 的主板普遍都能达到 3000MB/s 了。所以这一点来讲 E3 V3 已经不值得捡了。而且我想把我台式机上 SN750 500GB 换到这台机器上,所以还是要选择一个支持 PCI-e M.2 NVMe 的主板。

硬件 配置 价格
CPU Intel(R) Core(TM) i5-6600T CPU @ 2.70GHz 35w 480
主板 Dell OptiPlex 7040 准系统:Intel ®Q170 400
内存 镁光 DDR4 16GB 2666MHz 310
显卡 英特尔 ® 核芯显卡 530 0
机箱 Dell OptiPlex 7040 准系统 0
电源 Dell OptiPlex 7040 准系统:290W 开关电源 0
UPS 某杂牌 UPS 650VA360W 160
固态 三星 970PRO 512GB 820
总价 2170

CPU

至于 6600T 的性能,在 500 块钱的价位内 35W 低功耗的 6600T 还算可以能接受,为什么不买 7200U 这种低压 U 呢?,一是低压 U 的装机成本太高,而且性价比很低,我还要在上面跑一堆虚拟机,低压 U 恐怕扛不住,所以一开始就放弃了低压 U 的装机方案。

主板

由于 Dell SFF 系列的机箱是定制的,和普通的主板不太一样,也只有这样才能塞进这么小的空间,对于 MFF 系列的则更小一点。对于这种小机箱而言,拥有 2 个 PCI-e*4 和一个 PIC-e*16 是相当不错了,PCI-e*4 可以装一个阵列卡个一个四网口的网卡,PIC-e*16 又可以装一个低功耗的刀卡显卡。等到以后台式机升级的硬件的时候再把台式机上的 GT1030 亮机卡放上去。三个 SATA 一个 M.2 有点捉襟见肘,机箱空间就那么点,口子多了硬盘也塞不下呀 😂。

Model: Dell OptiPlex 7040 SFF
Form factor: Small Form Factor
CPU options: Intel Gen6 i3/i5/i7
Chipset: Intel Q170
RAM slots: (4x) DIMM DDR4-2133
Max RAM: 64 GB
USB Ports: (6x) USB3.0; (4x) USB2.0;
Video Ports: (2x) Display Port 1.2; HDMI 1.4;
Other Ports: Serial; (2x) PS2; RJ45; Headset; Line-Out;
Optional Ports: VGA; Media Card Reader;
SATA: (3x) SATA 3.0*
PCIe: PCIe 3.0 x16 (low profile); PCIe 3.0 x4 (low profile);
M.2 slots: M.2 2280 M-key (PCIe 3.0 x4, SATA 3.0)
Drive bays: 3.5-inch/(2x)2.5-inch; 5.25-inch (slim);
Hard Drive: max 2TB; RAID 0 & 1;
PSU: 180 W
Weight: 6.00 kg (13.22 lb)

内存

两条 8GB DDR4 内从从我台式机上拆下来的,又花了 300 块钱买了个镁光的 16GB DDR4 装了上去,迫于 我的台式机 B350M-K 的缩水板只有两个内存插槽而且支持到 32GB,暂时装一个 16GB 的吧,能以后再装一个上去。

固态

其实本来的预算三星 970PRO 512GB 没打算买,是我在找 Dell OptiPlex 7040 时意外碰到的一个老哥,而且这块固态是德亚的,还算靠谱一些,于是剁手买了这个块固态。970PRO 系列的都是 MLC 的颗粒的固态硬盘,通 SM961 一样是属于传家宝系列 😂,但是 SM961 淘宝上水太深,清零盘占据多数,所以不建议买。

正好把这块 970PRO 换到我的台式机上,把台式机上的 SN750 512GB 换到 HomeLab 机器上,给 ESXi 上的虚拟机用。在玩儿虚拟化的时候深有感触,宿主机的磁盘是机械硬盘的话,上面的虚拟机达到一定数量时,虚拟机会很卡,所以玩 ESXi 虚拟化,有块固态的体验是非常爽滴 😋。

装机

其实装机很快,由于是买的 Dell OptiPlex 7040 准系统,所以只需要把 CPU 、内存、硬盘装上去就完事儿了。

收到准系统后发现没有带 M.2 螺丝,只能临时拿胶带粘糊上去,勉强撑了两天,后来买了个螺丝和散热片完美地解决了。

从以前旧笔记本淘汰下来的 2TB 5400RPM 的石头盘,已经出现坏道了,临时当个下载盘吧,在它还没彻底崩盘之前再压榨一下它吧 😂。后面打算再添加一块 12TB 的氦气盘当仓库盘和备份数据使用,有了 UPS 和这台主机 7*24 小时开机也没啥问题了。

后面那台是我的台式机,也是去年这时候买的,两者比较起来 SFF 的型号确实小很多。Dell 的这种主机还有一种 MFF 型号的,那种更小一些,差不多比路由器大一些而已,不过扩展性不好,而且还需要外置电源,也就没考虑,不过现在想想有点后悔了,当初应该多加点钱买 SFF 的,不过还好也能接受,只不过体积大了些,搬家的时候不太方便。

ESXi

装完机器之后就开始装 ESXi ,对于虚拟化,ESXi 算是比较熟悉的了,听说 Proxmox VE 也不错 🤔,等到后面硬盘到了再折腾一下 Proxmox VE。看到隔壁 Proxmox VE:优秀的自建虚拟化方案 愈发想玩玩了。

贯彻「不重复造轮子」的原则,当前版本的 PVE 基于成熟稳定的 Debian 9 “Stretch” 构建。在熟悉和使用 PVE 的过程中,我越发喜欢它「不重复造轮子」的特性。相较之前用过的其他虚拟化方案,PVE 的内部构造和工作原理对我来说不再是一个黑盒,我可以清晰地观测到它在干什么——比如要迁移一台虚拟机到另一个节点,我就可以通过 ps 观察到它启动了一个 dd 进程,对接 ssh 管道,将磁盘数据通过网络复制到目标机器——这种仿佛透明手表一样能看到内部工作原理的感觉真是太棒了!

从 VMware 家下载好 VMware-VMvisor-Installer-7.0.0-15843807.x86_64.iso 镜像,找了两个 U 盘,一个用于 ESXi 的安装盘,一个用于 ESXi 的系统盘,其中一个 U 盘还是我用读卡器 +16GB 内存卡拼凑而成的,目的是为了把 ESXi 装到 U 盘里方便迁移数据之类的,之后在网上找一个神 KEY 激活一下(🤫 小声

Ubuntu 20.04

当作网关机使用,和我所有的 云主机打通网络,使用 WireGuard 组成一个小内网,关于 WireGuard 的使用建议阅读大佬写得博客 WireGuard 教程:WireGuard 的搭建使用与配置详解 以及 WireGuard 教程:WireGuard 的工作原理

顺带用 ZBench 测了一下虚拟机的磁盘性能,还算勉强说的过去,实际上 SN750 512GB 只有 2GB 左右的缓存,写满换粗之后,写入的性能会直线下降到 800MB/s,读的性能倒是可以达到 3200MB/s 以上,或许是主板的限制,没能达到理想的读写性能。

--------------------------------------------------------------------------
CPU model            : Intel(R) Core(TM) i5-6600T CPU @ 2.70GHz
Number of cores      : 4
CPU frequency        : 2712.000 MHz
Total size of Disk   : 33.3 GB (7.7 GB Used)
Total amount of Mem  : 3935 MB (306 MB Used)
Total amount of Swap : 3934 MB (0 MB Used)
System uptime        : 4 days, 19 hour 47 min
Load average         : 0.13, 0.08, 0.03
OS                   : Ubuntu 20.04 LTS
Arch                 : x86_64 (64 Bit)
Kernel               : 5.4.0-42-generic
Virt                 : vmware
--------------------------------------------------------------------------
I/O speed(1st run)   :1.3 GB/s
I/O speed(2nd run)   :1.3 GB/s
I/O speed(3rd run)   :1.3 GB/s

PhotonOS

这个是系统在我另一篇博客 Container Linux OS 从入坑到爬出来 里提到过,Photon OS™ 是针对 VMware vSphere® 虚拟化平台进行内核优化的容器专用操作系统,就和 CoreOS 一样。十分适合专门用来运行容器,当作 Kubernetes 集群中的工作负载来使用。

  • 系统初始化启动之后内存仅仅使用了 45Mi
root@photon-machine [ ~ ]# free -h
              total        used        free      shared  buff/cache   available
Mem:          2.0Gi        45Mi       1.8Gi       0.0Ki        93Mi       1.8Gi
Swap:            0B          0B          0B
  • 启动 docker 进程之后的占用情况,也仅仅 109Mi
root@photon-machine [ ~ ]# free -h
              total        used        free      shared  buff/cache   available
Mem:          2.0Gi       109Mi       1.6Gi       0.0Ki       238Mi       1.8Gi
Swap:            0B          0B          0B
  • 使用 OVA 虚拟机模板启动后的虚拟机,磁盘仅仅占用了 515MB ,确实是相当轻量化,这还是包含了 docker。
root@photon-machine [ ~ ]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        16G  515M   15G   4% /
devtmpfs        998M     0  998M   0% /dev
tmpfs          1000M     0 1000M   0% /dev/shm
tmpfs          1000M  532K  999M   1% /run
tmpfs          1000M     0 1000M   0% /sys/fs/cgroup
tmpfs          1000M     0 1000M   0% /tmp
/dev/sda2        10M  2.2M  7.9M  22% /boot/efi
tmpfs           200M     0  200M   0% /run/user/0

总之,PhotonOS 是个很轻量的 OS ,适合专门用来运行一些容器化的服务,这正好符合我的需求。别问我为什么不用 CoreOS ,CoreOS 已经凉了。

Alpine NFS

把我一块磁盘直通给这个虚拟机,主要用来给 k8s 集群中的 Pod 挂载 PVC 持久化存储使用。

Debian

主要是用来运行 K8s 集群,目前只有一个 master 和一个 node 玩玩儿,跑了一些自用的服务。

Windows

当下载机使用,外加运行一些不得不使用的国产毒瘤软件 😡

额外硬件

捡垃圾的乐趣就在于越折腾越好玩,于是又开始打算折腾一些

UPS

由于最近房东家里经常断电,有时一天断电八九次,每次断电我都担心着硬盘里的老婆们会不会挂掉,索性还是买了 UPS ,在马云家看了看,带给 NAS 自动断电的 UPS 普遍在 400 块钱以上,而且我这个还是个假的 NAS ,UPS 上的 USB 口不一定支持我的主机。最后为了节省一下预算花儿 160 块钱买了个不支持 USB 的 UPS ,但是又不能没有这个功能,因为家里的 220V 市电断电之后,UPS 的电量只能给主机续命 10~20min 左右,UPS 的电量用完之后就嗝屁了,照阳还是断电。所以在 UPS 用尽电量还是没有来电之前,一定要想办法把主机通过 poweroff 的方式安全优雅滴关机。

首先要考虑的是怎么知道 220V 市电断电了,起初想有没有个 220V 的传感器,我去,有点难度还是算了吧。最后一想,可以通过 ping 房东家光猫的方式。我的路由器和主机等设备连接 UPS ,房东家的光猫并没有连接 UPS ,我在路由器上设置一个定时任务,每分钟去 ping 房东家的光猫,没有 ping 通说明就是断电了,也有可能是网线被拔掉了,但概率很小。! ping -c 8 A && ssh B "poweroff" 一行简单的命令就满足了我的需求,

#!/bin/sh
echo "start" >> /tmp/power_status
if ! ping -c 32 192.168.1.1
then
    sleep 300
    ping -c 32 192.168.1.1 && exit 0
    sshpass -p "pwd" ssh [email protected] "net rpc shutdown -I 192.168.0.240 -U admin%poweroff"
    sshpass -p "pwd" ssh [email protected] "sh -c /suspend_vm.sh"
    echo "220v poweroff" >> /tmp/power_status
fi

对于 ESXi 上的虚拟机,还是采用了挂起的方式,将虚拟机的内存状态保存在数据存储的磁盘里,这样重新开启虚拟机后就能恢复到之前的状态,这一点有点像 Windows 的休眠。

#!/bin/sh
for vm in $(/sbin/vmdumper -l | grep -v Alpine |  awk '{print $1}' | sed 's/wid=//g')
do
     /sbin/vmdumper ${vm} suspend_vm
done

网管交换机

当我从台式机向 ESXI 里的虚拟机传输文件的时候,发现网络速度最快只能达到 700Mbits/sec ,看来应该是路由器的性能瓶颈,于是想着升级一下网络设备,把 R6300V2 路由器当作 AP 来用,将流量都汇聚到网管交换机上。

[  4] local 192.168.0.240 port 50718 connected to 192.168.0.123 port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec  83.8 MBytes   702 Mbits/sec
[  4]   1.00-2.00   sec  83.4 MBytes   700 Mbits/sec
[  4]   2.00-3.00   sec  83.6 MBytes   701 Mbits/sec
[  4]   3.00-4.00   sec  82.9 MBytes   695 Mbits/sec
[  4]   4.00-5.00   sec  83.8 MBytes   702 Mbits/sec
[  4]   5.00-6.00   sec  83.6 MBytes   701 Mbits/sec
[  4]   6.00-7.00   sec  83.5 MBytes   701 Mbits/sec
[  4]   7.00-8.00   sec  83.8 MBytes   703 Mbits/sec
[  4]   8.00-9.00   sec  83.8 MBytes   702 Mbits/sec
[  4]   9.00-10.00  sec  83.8 MBytes   702 Mbits/sec
[  4]  10.00-11.00  sec  83.8 MBytes   703 Mbits/sec
[  4]  11.00-12.00  sec  83.8 MBytes   703 Mbits/sec
[  4]  12.00-13.00  sec  83.9 MBytes   703 Mbits/sec
[  4]  13.00-14.00  sec  83.8 MBytes   703 Mbits/sec
[  4]  14.00-15.00  sec  83.8 MBytes   703 Mbits/sec
[  4]  15.00-16.00  sec  83.9 MBytes   704 Mbits/sec
[  4]  16.00-17.00  sec  83.4 MBytes   699 Mbits/sec
[  4]  17.00-18.00  sec  83.9 MBytes   703 Mbits/sec
[  4]  18.00-19.00  sec  83.6 MBytes   702 Mbits/sec
[  4]  19.00-20.00  sec  83.8 MBytes   702 Mbits/sec
[  4]  20.00-21.00  sec  83.9 MBytes   704 Mbits/sec
[  4]  21.00-22.00  sec  83.8 MBytes   703 Mbits/sec
[  4]  22.00-23.00  sec  83.9 MBytes   704 Mbits/sec
[  4]  23.00-24.00  sec  83.9 MBytes   703 Mbits/sec
[  4]  24.00-25.00  sec  83.9 MBytes   703 Mbits/sec
[  4]  25.00-25.20  sec  16.6 MBytes   698 Mbits/sec
╭─debian@debian ~
╰─$ qperf 192.168.0.123 -t 30 -vvu tcp_lat udp_lat tcp_bw udp_bw conf
tcp_lat:
    latency   =  98.7 us
    msg_size  =     1 bytes
    time      =    30 sec
    timeout   =     5 sec
udp_lat:
    latency   =  98 us
    msg_size  =   1 bytes
    time      =  30 sec
    timeout   =   5 sec
tcp_bw:
    bw        =  87.9 MB/sec
    msg_size  =    64 KiB (65,536)
    time      =    30 sec
    timeout   =     5 sec
udp_bw:
    send_bw   =  56.7 MB/sec
    recv_bw   =  56.7 MB/sec
    msg_size  =    32 KiB (32,768)
    time      =    30 sec
    timeout   =     5 sec
conf:
    loc_node   =  debian
    loc_cpu    =  16 Cores: AMD Ryzen 7 1700 Eight-Core   3.0GHz
    loc_os     =  Linux 4.4.0-18362
    loc_qperf  =  0.4.11
    rem_node   =  gateway
    rem_cpu    =  4 Cores: Intel Core i5-6600T @ 2.70GHz
    rem_os     =  Linux 5.4.0-42-generic
    rem_qperf  =  0.4.11

准备买 GS108E V2 或者 GS105E V2,

四网口网卡

为了折腾一下网卡直通、端口汇聚、overlay 网络卸载等特性,后面还要添加一块 intel I350 T4 V2 ,闲鱼上的价格也不是很贵。

阵列卡

由于主板的 SATA 接口最大只支持到 2TB ,为了扩展一下存储,只能额外添加一块阵列卡了,由于主板的 PCIe 有限,而且这么大点的机箱最多也就能塞下 1 块 3.5 寸硬盘和 3 块 2.5 寸硬盘,所以找一块入门级的阵列卡就够了,最终花了 50 块钱捡了一块 ServeRAID H1110 SAS/SATA Controller 阵列卡,看来一下手册里的参数,大概也能暂时满足我的需求。

  • Four internal 6 Gbps SAS/SATA ports
  • One x4 mini-SAS internal connector (SFF-8087)
  • 6 Gbps throughput per port
  • Based on LSI SAS2004 6 Gbps RAID on Chip (ROC) controller
  • x4 PCI Express 2.0 host interface
  • Supports RAID 0, 1, 1E, and 10
  • Connects to up to four SAS or SATA drives
  • SAS and SATA drives are supported, but the mixing of SAS and SATA in the same integrated volume is not supported
  • Supports simple-swap SATA and hot-swap SAS and SATA drives
  • Supports up to two integrated volumes
  • Supports up to two global hot-spare drives
  • Supports drive sizes greater than 2 TB for RAID 0, 1E, and 10 (not RAID 1)
  • Fixed stripe size of 64 KB
  • Compliant with Disk Data Format (DDF)
  • S.M.A.R.T. support

后记

2021 年 五一放假后入手了 M1 MacBook Pro ,使用了一段时间后感觉很满意,于是就准备当作主力机来使用。这样一来家里的一台 Ryzen 5 3600 台式机和一台 6600T 的 NAS 小主机就显得多余了。两个台式夹搬家的时候也不方便携带,于是干脆就把 NAS 小主机卖掉了。

然后又发现 M1 的 GPU 好强,众多评测的解决也展示了 M1 的 GPU 性能要比肩 GTX 1050 Ti。Ryzen 5 3600 台式机上的 GTX 1650 平时也不怎么使用,现在也没有太大的兴趣玩游戏,平时只用来看 4K 电影用。既然有了 M1,那 GTX 1650 不如也拆下来卖掉算了,现在显卡涨了很少,多少还能赚点钱 😂。

  • GTX 1050 vs GTX 1050Ti vs GTX 1650

就这样最终把 NAS 小主机准系统 + 6600T CPU 以及 GTX 1650 显卡拆下来卖掉了,由于今年的显卡价格和 CPU 价格比之前都普遍涨了很多,卖出去这些捡来的洋垃圾之后出去之后稳赚 600¥。然后发现微星 B550M 主板在没有显卡和插显示器的情况下无法完成 BIOS 开机自检启动,导致无法进入 bootloader 启动 ESXi 😭。所以必须要一张亮机卡,于是又在闲鱼上花了 150¥ 买了一张 AMD R5 340x 的亮机卡。光有亮机卡还不行,还需要插上显示器(掀桌儿,无奈又花了十几块钱买了一个显卡欺骗器,用于模拟出一台显示器。

既然把 M1 当作主力机使用了,那么之前的 Ryzen 3600 就改装成 Homelab 机器使用,将之前 NAS 小主机上的一些服务和虚拟机迁移过来,顺带再开几台额外的虚拟机使用。将之前 NAS 小主机上的内存插到台式机上,这样就凑够了 32GB 的内存。当时感觉 32GB 还不够,于是又在闲鱼上花了 320¥ 买了一根 16GB 的 DDR4 内存,不料收到货后就翻车了,插上内存条之后主板 BIOS 里无法识别出内存的型号和序列号,并且进入 ESXi 之后就一直卡住了。尝试拔下该内存条后又恢复了,无奈只能联系卖家退货了。常年捡垃圾为数不多的一次翻车事故 🤣。

  • 虚拟机列表

  • 虚拟机磁盘性能测试

  • Windows 直通用显卡

  • 直通成功之后,使用工具查看显卡状态