年轻人的第一台服务器(D1581)
# 背景
在日常上网冲浪中,时不时能刷到一些是性能是传统中间件 X 倍的新中间件项目,而我仅有的三台 4c8g 的腾讯云服务器不足以让我随心所欲的拉项目下来跑,而最近一年良心云似乎没有开车的动作,甚至把 24 的 hk 轻量给砍了,云服务器高昂的售价,必然会是本不富裕的我雪上加霜,于是我想到了自己搭建物理服务器,舍弃高可用,All in boom。
# 方案选择
# 服务器
最标准的机柜服务器,从一开始就被我 vote 掉了,无论是声音还是占地面积都达不到我的要求。
# 家用电脑
最开始想到的是,使用家用电脑,因为手上用多年前留下的矿渣: TB250-BTC + 9100F + 8G*2 + 矿龙
,于是我搭了一个 PVE 来玩,而 16G 的内存根本不够玩,而主板又只有两个内存槽。于是乎要升级,要么换主板、要么换内存条,而 9100F 的性能在牙膏厂挤了一大坨牙膏后的 2023 年看来,性能有点落后了,还是得装台新的。
# 寨板 X99
选择装台新的,还是想装个服务器 CPU 的,毕竟专业的事情还是交给专业的人,柜式服务器不考虑了,那么就只剩下塔式的了,主要就两种:品牌工作站、寨板组装机,而品牌工作站高昂的价格劝退。
在攒机过程中,发现 X99 的缺点十分明显:DDR3、功耗高,似乎是上一代的产物。
# D1581
在寻找更好的解决方案时,看到了洋垃圾 D1581 装机记录 (opens new window)这篇文章,他有着和我相似的需求和精力,而他最终选择了 D1581,D1581 是何物?带着疑问我又开始了新一轮的搜寻,发现他仍然有与上面 X99 相似的缺点
- 内存条必须是 DDR3L,插两条 16G 可以 1600MHz。最多支持四条 16G 共 64G,降频到 1333MHz。
- SATA 盘共享带宽。不要插多个 SATA 硬盘。
- CPU 没核显,需要一张亮机卡。(不能无头启动)
- 有用户提到,温度低于 10℃ 时,CPU 会概率性地降频到 800MHz。我复现了这个情况。
在我将要 vote 掉这个方案的时候,我看到了定制 INTEL D-1581 服务器主板预览 (陈多鱼的项目) - 哔哩哔哩 (opens new window),这位大佬众筹的定制 D1581 板 U 给出了一套完全不同的方案:支持 DDR4 最高 128G、支持无头启动、自带 2.5G 网卡等等。
最终我在 2023 年 7 月底选择了参与 tank 1581 的众筹,并在 2023 年 9 月初拿到了首批焊油限定款板 U。
# 配置单
随着 D1581 的到货,其他硬件硬件也该买了,配置如下:
配件名称 | 型号 / 数量 | 价格 |
---|---|---|
CPU | TANK 米多贝克定制 D-1581 | 669 |
主板 | TANK 米多贝克定制 D-1581 | - |
内存条 | 镁光 DDR4 32G 2R×4 ECC REG 2133 * 4 | 700 |
散热器 | AVC 铜芯 下压式 CPU 散热器 | 27 |
硬盘 | 梵想(FANXIANG)S790 2TB | 500 |
电源 | 傻瓜超人 小 1U (FLEX) 300W | 159 |
显卡 | 亮机卡 | 14 |
机箱 | 定制 亚克力定制 | 60 |
合计 | - | 2129 |
# 机箱定制
逛了一圈某宝,都没能找到符合我符合我心意的机械,要么是电源侧放直接会把 PCIE 挡住的,要么是为了兼顾宽度 24.4cm 的主板,把机箱做宽的,在询问了某宝前排做亚克力定制的一个店家后,根据我给出的尺寸 300mm*200mm*100m
,店家的报价是 30 左右,这个价格比起买一个机箱划算多了,并且还是定制的,于是就开始了每天下班的瞎折腾建模。
# PVE 部署
以 8.0.3 为例
由于我这台服务器可能到处搬,可能放在公司、出租屋、家里,因此 PVE 的 ip 地址不打算使用以上任何地方的子网 ip,定义一个子网段用于 pve 里的所有虚拟机,也包括管理端 ip,假设这个 IP 段为 192.168.100.1/24
# 安装
唯一要注意的是,选最后一个网口作为管理网口,并将 IP 设为 192.168.100.254
,安装好后通过手动设置本机 ip 为 192.168.100.1/24
任意 ip 后通过网线连接管理网口,访问 https://192.168.100.254:8006
# PCIE (网卡) 直通
提示
在管理页面的 shell 感觉不是很好用,可以使用 ssh [email protected]
参考:Proxmox VE Administration Guide - 10.9. PCI(e) Passthrough (opens new window)
root@d1581:~# uname -r
6.2.16-3-pve
内核命令行
/etc/default/grub
文件的 GRUB_CMDLINE_LINUX_DEFAULT
变量,将要添加的参数追加在字符串后。
修改后执行 update-grub
刷新,再重启。
# 启用 IOMMU
内核命令行添加:
intel_iommu=on
在文档中提到:
For Intel CPUs, you may also need to enable the IOMMU on the kernel command line (opens new window) for older (pre-5.15) kernels by adding: 对于 Intel CPU,您可能还需要通过添加以下内容在内核命令行上为 ** 旧版(5.15 之前)** 内核启用 IOMMU:
很多教程也会让开启,而我的内核版本在 5.15
之后,那我就不动了。
笔记
即便内核版本是 5.15 之后,也需要开启,不开启报 No IOMMU detected, please activate it.See Documentation for further information.
不可用。
# IOMMU 直通模式
内核命令行添加:硬件支持 IOMMU 直通模式,则启用此模式可能会提高性能
iommu=pt
# 内核模块
编辑 /etc/modules
,添加
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
刷新
update-initramfs -u -k all
# 重启
reboot
# 检查
root@d1581:~# dmesg | grep -e DMAR -e IOMMU -e AMD-Vi
[ 0.012868] ACPI: DMAR 0x0000000079FBE010 0000C4 (v01 ALASKA A M I 00000001 INTL 20091013)
[ 0.012898] ACPI: Reserving DMAR table memory at [mem 0x79fbe010-0x79fbe0d3]
[ 0.255406] DMAR: Host address width 46
[ 0.255408] DMAR: DRHD base: 0x000000fbffc000 flags: 0x1
[ 0.255416] DMAR: dmar0: reg_base_addr fbffc000 ver 1:0 cap 8d2078c106f0466 ecap f020df
[ 0.255420] DMAR: RMRR base: 0x0000007bbc4000 end: 0x0000007bbd3fff
[ 0.255423] DMAR: ATSR flags: 0x0
[ 0.255424] DMAR: RHSA base: 0x000000fbffc000 proximity domain: 0x0
[ 0.255428] DMAR-IR: IOAPIC id 8 under DRHD base 0xfbffc000 IOMMU 0
[ 0.255430] DMAR-IR: IOAPIC id 9 under DRHD base 0xfbffc000 IOMMU 0
[ 0.255432] DMAR-IR: HPET id 0 under DRHD base 0xfbffc000
[ 0.255434] DMAR-IR: x2apic is disabled because BIOS sets x2apic opt out bit.
[ 0.255435] DMAR-IR: Use 'intremap=no_x2apic_optout' to override the BIOS setting.
[ 0.255834] DMAR-IR: Enabled IRQ remapping in xapic mode
笔记
对比了重启前后,打印的都行没什么变化,可能是因为新版默认就是开启直通的原因。
# PVE 硬盘直通
硬盘直通无需像 PCIE 直通那样,开启 IOMMU,不开启就可以实现。
场景:将原来直接跑在硬盘的系统,换到虚拟机环境继续跑。
# 查找要直通的硬盘
ls -la /dev/disk/by-id/|grep -v dm|grep -v lvm|grep -v part
# 直通到虚拟机
qm set <vmid> --scsiX /dev/disk/by-id/xxxxxxx
# qm set 101 --scsi0 /dev/disk/by-id/nvme-INTEL_SSDPE2KX020T8_BTLJ039307142P0BGN
参考:佛西博客 - Proxmox VE pve 硬盘直通 (opens new window)
# 安装 OpenWrt
安装参考:PVE - 旁路由 | NipGeihou's blog
除了上文的安装步骤外,还需要在: 硬件 - 添加 - PCI设备
,按顺序添加两个网卡直通,第一个将默认作为 WAN 口,由于此时这台服务器是不能上网的,因此也就装不了 ethtool
,也就无法通过其判断哪个网卡对应哪个设备 id,那我只能赌一把了。
笔记
在 iStoreOS 中,默认第一个网卡(即桥接网卡)是 wan 口,其他为 lan 口(即两个直通网卡),将网线接入直通网卡调整,eth0 为 lan 口,eth1 为 wan 口
安装完成后,将上级路由接到 WAN 即可上网,建议把 OpenWrt 的 DHCP 关闭,或将 DHCP 的分配范围在 1-100 内,在之后的虚拟机部署中,使用与 VM ID
对应的 ip,如 101 -> 192.168.100.101
提示
如果 PVE 的控制台(noVNC)无法复制粘贴,在硬件添加一个 串行端口
在 PVE 重启即可(虚拟机中 reboot
不生效)。
# 安装代理工具
vernesong/OpenClash: A Clash Client For OpenWrt (opens new window)
# 安装依赖(确保已切换到可靠可用的国内源)
opkg update
#iptables,iStoreOS为了兼容即便是22.03也使用的iptables
opkg install coreutils-nohup bash iptables dnsmasq-full curl ca-certificates ipset ip-full iptables-mod-tproxy iptables-mod-extra libcap libcap-bin ruby ruby-yaml kmod-tun kmod-inet-diag unzip luci-compat luci luci-base
#上传IPK文件至您路由器的 /tmp 目录下,可在iStoreOS的WEB-系统-文件传输中上传,在同页面即可点击安装,或使用下方命令行安装
#执行安装命令
opkg install /tmp/luci-app-openclash_0.33.7-beta_all.ipk
#执行卸载命令
#插件在卸载后会自动备份配置文件到 /tmp 目录下,除非路由器重启,在下次安装时将还原您的配置文件
opkg remove luci-app-openclash
安装完成后刷新LUCI页面,在菜单栏 -> 服务 -> OpenClash 进入插件页面
配置
- 使用 Mata 内核:
全局设置-模式设置
,勾选 使用 Mata 内核,应用配置。- 如果使用了比较新的协议,还需要先更新内核
- 更新内核:
全局设置-版本更新
,将Mata内核
下载到本地,上传到/etc/openclash/core/clash_meta
- 备份
mv /etc/openclash/core/clash_meta /etc/openclash/core/clash_meta.bak
- 参考命令
tar -xf archive.tar.gz
- 备份
- 上传配置:将分流配置写到 yaml 文件中,并在
配置文件管理
中上传,应用配置。- 建议直接复制 Windows 的 Clash Verge 的运行时配置
- 启动:
运行状态
,启动 OPENCLASH - 修改管理页面登录密钥:
全局设置-外部控制
,管理页面登录密钥,应用配置。 - 切换管理 WEB 版本:
全局设置-外部控制
,切换(更新) Yacd 版本,切换至 MATE 版本,应用配置。
测试
# 分别在pve、oepnwrt的shell
curl www.google.com
# 安装 WireGurad
安装参考:基于 WireGuard 实现的云组网 | NipGeihou's blog
# 允许通过 WAN 口访问 LAN 设备
参考:Access web interface on WAN - Installing and Using OpenWrt - OpenWrt Forum (opens new window)
我的网络拓扑大概是这样的,为了能够让 电脑
访问到 服务1
,需如下配置:
路由器 2 允许外部请求进来
添加:
- 名称:
Allow-Admin
(随意) - 协议:按需选择,允许进来的协议,如
tcp、icmp
- 源区域:WAN
- 源地址:不选
- 源端口:任意
- 目标区域:任意区域(转发)
- 目标端口:
22 80 443
- 操作:接收
- 保存
将请求转发到路由器 2
这里有两种方式:
- 在路由器 1 中设置静态路由,将路由器 2 子网(192.168.2.1/24)转发(网关)到路由器 2 的 WAN 口 ip(如 192.168.1.123)。这种方法需要路由器 1 的管理权限,这样操作路由器 1 下的所有设备都可以访问。
- 在
电脑
中将网关设置成路由器 2 的 WAN 口 ip(如 192.168.1.123),这样只有电脑
可以访问。- 或使用:
route add 192.168.2.0 mask 255.255.255.0 192.168.1.123 -p
- 或使用:
笔记
两种方式,视乎场景选择:
- 如果在公司没有路由器 1 的权限,也不想让别人访问到你的服务,则可以使用方法 2。
- 如果是在自己家里,可信任的局域网中,则可以使用方法 1。
# 使用 cloud-init 创建虚拟机
参考:使用 cloud-init 创建虚拟机 | NipGeihou's blog
# 完善 PVE
# 添加 CPU 温度
参考:PVE 篇一:PVE 各项传感器温度 WEB 显示,详细教程_软件应用_什么值得买 (opens new window)
安装查询温度命令
# 安装lm-sensors,一个可以监视CPU和其它的系统温度的工具
apt-get install lm-sensors
# 查看温度
sensors
# 查看温度 json格式
sensors -j
添加到 PVE 变量中
vim usr/share/perl5/PVE/API2/Nodes.pm
# 在vim中搜索并定位到
/$res->{ksm} = {
# 并在其下放添加
$res->{sensinfo} = `sensors -j`;
编辑页面 JS
提示
有别于参考的教程,我觉得没必要显示每一个核心的温度,只需显示其中一个即可。
vim /usr/share/pve-manager/js/pvemanagerlib.js
# 定位到
/Proxmox.Utils.render_cpu_model
# 在其下方添加
{
itemId: 'sensinfo',
colspan: 2,
printBar: false,
title: gettext('CPU Temperature'), // WEB显示内容
textField: 'sensinfo',
renderer: function (value) {
value = JSON.parse(value.replaceAll('Â', ''));
const c0 = value['coretemp-isa-0000']['Package id 0']['temp1_input'].toFixed(1);
return `${c0}℃`; // 输出格式
}
},
重启 WEB 服务
systemctl restart pveproxy
# 添加证书
如果直接通过 ip 访问,总是提示不安全,可使用可靠的域名证书解决,DNS 服务商以 Cloudflare 为例。
添加 DNS API
PVE 首页 - 左侧 数据中心
(而非某一个节点)-ACME - 添加
添加:
插件 ID:随便填,如
Cloudflare
DNS API:
Cloudflare Managed DNS
CF_Account_ID:Find zone and account IDs · Cloudflare Fundamentals docs (opens new window)
CF_Email:https://dash.cloudflare.com/profile (opens new window)
CF_Key:https://dash.cloudflare.com/profile/api-tokens (opens new window),Global API Key
CF_Token:https://dash.cloudflare.com/profile/api-tokens (opens new window),API 令牌,创建证书,编辑区域 DNS,使用模板。
CF_Zone_ID:Find zone and account IDs · Cloudflare Fundamentals docs (opens new window)
添加
创建证书
PVE 首页 - 左侧 d1581
(节点)- 凭证 - 添加
- 质询类型:DNS
- 插件:上面填的插件 ID,
Cloudflare
- 域名:自己定义
添加账号
- 用户名:默认,不填
- 邮件:随便
- ACME 目录:
Let's Encrypt V2
- 注册
下发证书
- 立即预定凭证
出现即为成功
访问
通过 DNS 或 hosts 将域名解析到 pve 服务器的 ip 地址,如 https://pve.abc.com:8006
访问。