Build a poor man's X79 server with aisuneko

Build a poor man's X79 server with aisuneko

事情还得从去年十月左右开始讲起……

做备份时看到手上仅有的一块 256GB WD GREEN 快被塞爆,就萌生了买一台外置存储设备的想法(为什么不是移动硬盘?因为主要是放家里)。最开始的想法是 WD My Book / WD Elements Desktop,但因资金问题和父母开始了长达两个月的拉锯战,直到 2021 年底也没敲定方案。后来认真想了想,觉得还是 NAS 更符合我的需求,看到这个视频就有点动心了(其实只是借助 PiCM4 加入的原生 SATA 支持实现的)。朋友看不下去了,给我介绍了一入深似海的垃圾硬件圈,令我大受震撼 - “我怎么就没想到性价比这么高的方案呢?!”

正值新年父母给了我一笔压岁钱,便决定在家组一台 X79 服务器别问我为什么 2022 年还玩 X79,问就是没钱上 X99,事实证明这台机子在迄今近半年里出色的完成了我能想到的大部分需求(早就不止存储了),最重要的是开销也很低,可谓值回票价。

硬件

因为这是我第一次从零开始组装台式机,下单之前花了一个月左右的时间调研(不如说是学习,因为确实没经验),也去我市电脑城实地探访了一次(不知为何总比线上贵)

硬件清单大致如下,均为网购:

组件 描述 价格
CPU Intel Xeon E5-2670v2 (10 Cores, 20 Threads @ 2.5Ghz) CNY132
主板 某华强北杂牌寨板(要组 X79 用寨板是不可避免的,省预算才没用华南) CNY283
散热器 随便找的一个双风扇塔式四热管 CNY53
导热硅脂 Arctic MX-4 2g CNY22
内存 拆机镁光DDR3 REG ECC 8GB *2 CNY144
显卡 (从家里台式机上拆下来的一块 GTX650Ti) Free
SSD ADATA XPG SX6000 Lite (256GB) CNY219
HDD Toshiba P300 4TB (HDWD240) CNY449
电源/机箱 随便找的大水牛(电源250W,还有一个一直没装上去的机箱风扇) CNY159
总计 (不含运费) ~CNY1461

最后成功把预算控制在了1k5以内(比较勉强,直接把我钱包掏空了)。我也没想到这套配置主要的支出会在那块HDD上…… 别骂了别骂了,我知道这个配置很阴间

因为第一次装机没经验,对照LTT的这个视频加上自己摸索前后花了近一周才点亮…… 而且购买体验真的不算好。开箱主板发现 CPU 插座有几个针脚直接被折弯 (只有少数几个针脚弯折了非常大的角度,基本不可能是我操作失误),无奈申请退货,与商家简单对线后对方给换了一块。几天后再次拿到主板继续组装,而可能是手上这块拆机老显卡的问题,又耗费近两个小时反复插拔显卡调试 HDMI 输出才终于进了 BIOS……

所以算是给各位一个忠告:就算是在垃圾硬件圈也最好尽量认准比较有名的品牌买(比如华南和火神),一味图便宜难免会像我这样出事…… 以及售后就是另外一回事了。

其他配件(除了内存,见下文)倒还行,比如散热器性能还是很给力(亲测cpu温度一直稳定在 60 °C 上下,还是在我没装机箱风扇的情况下),MX-4 果然名不虚传,其他的就贯彻了能用就行的原则
还是那个熟悉的 AMI

BIOS 里的 CPU 信息

sensors看散热性能

系统配置

系统我选择了 Proxmox VE。

当时开机看到这个菜单还激动了好一会儿

U盘启动后按理说要做一遍 memtest (毕竟是拆机内存条),但引导菜单里选择 Test Memory 之后画面直接卡死,半分钟左右后又会自动回到引导菜单。插拔内存发现是其中一条内存的问题,无奈继续换货…… 这回对方倒是很爽快,但我决定先继续安装,等拿到另外一条内存后再插上。

本以为这下万事大吉,结果启动安装程序后 kernel panic 了……

Google 发现是 C-State 的问题(LTT有一期视频讲过,可能是这块 CPU 对电压比较敏感吧)。解决方式也很简单,在 BIOS 里禁用掉即可(在我这里是设置为 C0);实在不行就再参考这篇文章 改一下 GRUB boot args。 之后安装就比较顺畅,过一会总算进了 WebUI。

PVE 的一大优势就在于这个强大的 WebUI - 绝大部分操作都能直接通过它完成,维护方便不少。

使用

给这台 PVE 挖掘出了不少用法。尽管如此还是没发挥出它的全部潜能,只能说这块 CPU 到现在(至少对我来说)还是很强……

折腾的过程中 Uptime 倒是没了保证……

TrueNAS

第一大需求肯定是存储,所以先安排上了一个 TrueNAS 虚拟机。
TrueNAS 安装程序检测到内存不到 8GB 会有警告,不过亲测分配 4GB 也能稳定运行(是因为我这台机子只有 16GB 内存,否则还是开大一点好;平时在PVE里看到它把可用内存几乎占满也不必惊慌,其中大部分都是缓存)。
得益于 FreeBSD 底层和 OpenZFS 文件系统,TrueNAS 运行的确稳如狗,WebUI 也足够强大,真的很不错。
虽然目前也就用了500GB左右

SMR 生存指南

采购硬件时找来找去就没几块足够便宜的 HDD,我最后饥不择食在东芝的京东自营店买了上面那块 P300 4TB。最后到货了我才发现这是一块 SMR (P300 似乎只有 4TB 型号是 SMR),而据说东芝以前只做 CMR……
有点后悔(众所周知 SMR 的写入速度明显低于 CMR),但想来想去还是觉得至少是块完全能用的正品,买个心安也好。
那有什么办法可以应对写入速度低下的问题?Linux 下可以用 bcache 在 SSD 上搞磁盘缓存,但 TrueNAS 有个类似的东西:Data VDev。SSD上开一块足够大的虚拟磁盘(我的是32GB)丢给 TrueNAS 再在 Pool 里设置为 Data VDev 就行,亲测这样一来读写速度就相差不大了。

下载机

搭好 TrueNAS 之后就可以安排个配套的下载机了。
为轻量起见开了个 Alpine VM - 这也是我第一次用 Alpine Linux,花了一点时间熟习 OpenRC (以前一直都在被 systemd 拖底裤),用 apk 时也总是会下意识的打成 apk install 而不是 apk add
大致配了一个 aria2(用的是那个多线程 fork 版 + AriaNg 做 WebUI),不过在这之前有个问题要解决:如何连接到TrueNAS?smb 4k性能比较低下,NFS 又嫌不够安全(毕竟无需验证),怎么办?我的做法是在 PVE 上新建一个 dummy 网络接口,分别加到两个 VM 上(它们就有了一个新的本地 IP),再在 TrueNAS 的 NFS 共享里允许下载机上的这个 IP(后来想了想这样做也没见得安全到哪里去)。此外还要注意 Alpine 上自动挂载 NFS share 的问题(也许是 OpenRC 不太好的一点):开机自动读取 /etc/fstab 中的 NFS share 这个操作由 netmount 服务负责,因此需要确保这个服务已经被启用。
aria2 的(远程)前端千千万,甚至不用 WebUI 也行;比如我在 Android 上就用 Aria2App。下完种子再 smb 传输到手机上,追番体验好多了。

我的番剧资料库。是的,我看番习惯了英文字幕(

家人有看电影的需求,所以配完 aria2 又去 TrueNAS 上专门开了个 pool 存电影,还单独配了个 headless Transmission,开了一个共享到家里小米盒子的 VLC 上 - 观影体验也是不错的。有些种子没有附带字幕,VLC内置的字幕下载器也能搞定。

OpenWRT 软路由

懒得给家里路由器刷 OpenWRT 了,就通过在 PVE 上开软路由的方式实现了路由器翻墙。
使用非常方便,去官网下一个镜像下来丢到 VM 里即可,甚至免安装。不过有一点十分离谱:对于 x86 虚拟机似乎至少需要 256MB 的 RAM 才能正常启动(尽管128MB RAM的实体路由器就能刷)。
配置好网络就可以安排上 OpenClash;客户端配置也简单,改个网关就能直接用。我就是这么给家里的小米盒子实现翻墙的,再adb装个NewPipe上去就能相对愉快的刷油管了(NewPipe毕竟没有针对Android TV优化,体验有点打折扣就是)

运行几个月后莫名其妙炸了,因为上面提到的官方镜像只自带 128MB 左右存储空间,不知怎地塞满了。尝试扩大虚拟磁盘等等无果,正当我心灰意冷准备从头配起时,忽然想起之前做过一个备份…… 还原之后立马恢复了。这里就不得不吹一下 PVE 强大的快照和备份系统,方便又可靠。

打印服务器

家里有一台 EPSON L3156, 在这之前一直苦于打印文件不方便 - 虽然这玩意自带打印机共享功能但我家路由器不支持 WPS,Direct AP 模式又很显然不好用,要打印什么东西还得费大劲传到家里 Win7 上…… 这次终于借助 CUPS 实现了一个打印服务器。

配的过程一波三折,在客户端上测试的过程也比较漫长,最后在浪费了十几张打印测试页之后配好了

Syncthing

以前一直是 Resilio Sync 用户,这次借这个机会迁移到了 Syncthing。开了个容器作为 Syncthing server,用来同步我的音乐库和 KeePass 数据库之类。
不过 Syncthing 相比 Resilio Sync 还是缺了一个好用的功能:Selective Sync。好像有本地插件实现了,但还没试。

音乐推流

想在不同设备上共享同一个音乐库好在家里随时听歌,就简单搭了个 Jellyfin。安装有点一波三折:alpine 下目前只有 edge 源有这个包,等进 stable 恐怕还要几个月;尝试 docker,但pull完提示 No space left on device (看了下存储空间还有不少) ,不知道是什么神奇 bug;只能暂时下载 binary 直接运行,当然还要记得装 ffmpeg 和 libicu。

使用体验还很不错,该有的功能基本都有,MD风的WebUI也耐看。因为没有可用显卡(见下文)就没打算拿它同时推流视频(软解能看?),而是用 caddy file_server 代替,用来把 http 链接丢到 VLC 里 实现推流。

…意料之外的用途

装好机子不久就开学了。有几天晚上我在家熬夜 debug 上面说的那个 CUPS 服务器(虽然也没熬太久),结果刚配完就被老妈发现了在熬夜…… 于是乎,我的笔记本以文化课成绩太差的借口被老妈没收了。

用家里卡的不行的台式机干活实在太难受,怎么办?我就这么开始了四个月来通过 RDP 日用 VM 的日子……

Windows 虚拟机

之前就把笔记本上的 QEMU Windows 虚拟机迁移到了 PVE 上。实际体验还……行,得益于 RDP 在本地渲染画面且低延迟的特性没感觉有很严重的卡顿和性能损失,但因为无法显卡直通(见下文)所以看视频只能软解,CPU 负载不小。

显卡直通

因为BIOS里找不到相关选项,一直以为这块寨板不支持 VT-d (IOMMU),因此苦恼于如何用上这块 GTX650Ti(虽然Kepler架构老到Tensorflow都不支持了)。试过 LXC 容器直通,最后果然成功了,但因为用的 RDP 一直找不到 use case(反正都 RDP 了,对提高桌面体验也是于事无补)。写这篇文章时尝试了下手动写 kernel parameter 开启 (intel_iommu=on iommu=pt),好家伙,真的可以!

之后就大致依照这篇教程操作(其实不少人都写了关于 PVE N卡直通的教程)。

稍微提一句,需要确保显卡的VGA Controller和Audio Device两部分 lspci -nnk 时显示的 Kernel driver in use: 都是 vfio-pci ,我因为后者是snd_hda_intel 而遇到了一启动 VM 就 kernel panic (?) 的问题,解决方法就是把这个模块blacklist掉。

结果卡在了最后一步:devmgmt.msc 里报 Error 43。之后尝试了各种奇奇怪怪的 hack - 从改 qemu cpu flags,重装驱动到加载外部 romfile 等等 - 都无果,甚至朋友帮忙配了个全新的 Win10 21H2 LTSC VM (之前用的是 1809 LTSC) 都继续报错,认定是这块显卡本身的问题,这次显卡直通的尝试也以失败告终。看来这块卡也只能当亮机卡用了吧…… F**k NVIDIA。

Arch Linux LXC 容器

作为一个坚定的 GNU/Linux 用户,只有 Windows 用当然是不行的。怎么办?同时用上了一个 Arch LXC 容器 - 你没听错,是作为桌面日用……
配这个容器的过程也是一波三折。首先是桌面环境/WM的问题 - 我一开始还没听说过 xrdp,选择用 X2Go 作为远程桌面,结果从 i3 到 LXDE 几乎都在炸,不知为何只有 LXQt 能用…… 后来了解到 X2Go 虽说安全但在内网使用性能损失严重,就转而使用 xrdp,而此时遇到了新的问题:timedatectl等几乎所有要用到 DBus 的服务都无法使用,换句话说 DBus 炸了。Google 未果,最后朋友在他的 PVE 上没复现问题,索性直接重配了一个容器打包发给我才顺利用上……

顺便又折腾了一下桌面美化:



WM: xfwm4 (感觉比Openbox好用,比如自带的compositor就很香)
LXQt Theme: Black Beauty by Nudnik
Icon Theme: Tela-dark
GTK/Qt Theme: Arc w/ Kvantum
WM Theme: Arc-Darker
壁纸在这里

我尽力了……

一般也就是 VSCode 做点开发,Inkscape画点图这种工作,体验还说得过去。也尝试玩了一些开源2D游戏,体验都一般,毕竟没有GPU只能软件渲染…… Simutrans 这种还算流畅,但 Mindustry 狂降到 ~30FPS (还是在分配十核的情况下)。至于3D的,比如 SuperTuxKart?想都别想,连地图都加载不出来。不过考虑到是临时救急用(虽然 “临时” 用了四个月有余),这个性能损失也不是不能接受。

使用 xrdp 一个要命的问题就是没有声音。 虽然官方提供了 pulseaudio-module-xrdp 模块,但安装完并不是开箱即用,当时费了一番功夫才配好;而且滚包之后似乎又不工作了。除此之外还有各种大大小小的感到使用不顺的地方,但毕竟是个容器,what do you expect?

Misc.

性能测试

无聊跑了两个benchmark玩玩。

Linux 内核编译速度测试

为控制变量,测试环境是八核 Rocky Linux 8 容器 + alpine-virt build config,选择的内核版本是 5.15.2;最后用时约十分钟(9m55s)。
测试结果

Linux 内核编译测试的一般步骤 (感谢朋友指导)

  1. 参考这个列表安装依赖(依发行版而异)。比如我这里需要安装的依赖有:
    kmod patch bash coreutils tar git-core which bzip2 xz findutils gzip m4 perl-interpreter perl-Carp perl-devel perl-generators make diffutils gawk gcc binutils redhat-rpm-config hmaccalc bison flex gcc-c++ net-tools hostname bc elfutils-devel python3-devel zlib-devel binutils-devel newt-devel perl bison flex xz-devel gettext ncurses-devel libcap-devel libcap-ng-devel openssl-devel
  2. 下载内核源码(注意版本要和 config 对上,否则编译时会弹一堆提示),将上面的 config (用其他的config应该也没问题) 复制到目录下的 .config
  3. time make -j<core_count>

Geekbench

之后又用一个八核 Ubuntu 21.04 容器运行了 Geekbench,测试结果在这里。可以看到 E5-2670v2 - 或者说这一类淘汰服务器CPU - 单核性能比较一般,就是靠堆核心数取胜。

状态监控

平常时不时也需要监控运行状态(尤其是内存使用),但每次都要登录PVE看很麻烦,也想把每个VM独立的运行状态也汇总到一起呈现。Graphana + Promethus 一类的现成方案太臃肿,就自己写了一个出来……

是基于 python curses 的一个小项目,目前功能也就只有查看了......

GitHub仓库在这里,欢迎 star/pr。

内网穿透

有时出门在外可能需要用到服务器的某些功能,比如提前挂个种子下载,抑或是方便随时随地 ssh 进行维护。像这种内网穿透的配置方案有很多(比如 Cloudflare Argo Tunnel),但我用的是ZeroTier,主要是配置很方便。
大体流程在 Arch Wiki 上有写,这里不再赘述。只是需要注册账号这点有点烦人,不想的话可以尝试自建 controller(至少我没试过)。

后记

装完这台机子之后,我和一位群友有了一些争论。他认为 2022 年没必要再组 X79(比如说我用的 E5-2670v2 的性能放到现在只跟 i3-10100F 大致相当),并给我推荐了类似下面这种配置:

配件 型号
CPU Intel Core i3-10100F
主板 GALAX H510M FANTAXY
内存 CUSO CS4U2666D19G81C
SSD GALAX BA1M0250F
机箱 MSI PAG SHIELD M301
电源 Seasonic SSR-500RA

他同时表示 HDD 方面其实我可以直接去淘宝(认准一些比较popular的商家)买希捷的 ST4000VX000:4TB CMR 还只要300左右,等等。

这套配置相比我的要稍微贵一点,但也还是合理的。我只能说也许我是受到了 Tunnel effect 的影响:在此之前我对台式机硬件市场几乎一无所知,就算让我去挑我也不知道挑什么,怎么挑(比如我以前评价CPU性能只知道频率这一个指标)和去哪里挑;而在这时朋友介绍了垃圾硬件圈和 X79,我就顺着这一思路专找 X79 而忽略了其他更主流的可能性。也许一个原因是人穷志短吧,手头的预算限制了我的想象力,但归根结底还是我技术力不够,知道的东西还是太少…… 看来今后还是得学习一个。不过虽然也许没达到最高性价比,但这台 X79 目前也能很好的满足我的需求,而且强悍到几年之后依旧够用 - 所以我其实并不后悔入手(虽然购买体验极差,再次凸显出这其中水有多深),就当第一次装机积累经验吧。也许以后就不会再装出这么 cursed 的配置了。

甚至在这一过程中我也学到了别的东西,比如在笔记本被没收后我焦头烂额的尝试解决 PVE 上的 GPU 问题时 - 以前我一直在吐槽 rmbp 上的 Iris Pro 集显性能有多么垃圾,有时显存炸了就直接 kernel panic(?)等等,但等到我连集显都没得用的时候(这个芯片组当然不带集显),我才意识到有一块至少能用的显卡是多么美好的事情…… 也许有时只有失去才能发觉事物的珍贵吧。

哎,千言万语最后还是汇成一句话:在这个万物中心化,人们的数据越来越多集中到所谓“云端”(很喜欢那句话:There’s no “cloud”, it’s just someone else’s computer)的时代,家里有台自己的服务器,真的很爽啊