前言
Xserve是苹果停产多年的服务器产品线,搭载了Mac OS X Server操作系统。在Xserve停产后,OS X Server也慢慢变成了只剩下了一个app。虽然在2019年苹果推出了新的机架式Mac Pro,也可以作为机架式服务器使用,不过价格就不是我等可以随便消费得起的了。另外一点是,ARM Mac发布在即,基于x86-64的Mac Pro可能会在近几年被淘汰,在这个时间点花大价购入Mac Pro可能并不太划算。另外一方面,老旧的Xserve价格已经十分便宜,性能和价格和同期的Dell PowerEdge R610类似,而不像2009年的Mac Pro,不知道为什么现在价格仍然很高。为此作为Mac homelab或者是台式机使用,末代Xserve可以算是个不错的选择。以下是末代Xserve的主要配置:
Xserve 3,1 (Xserve 2009)
- CPU: 2x Intel Xeon E/X/W5500 series
- RAM: 12x DDR3 REG ECC (Up to 192GB)
- HDD: 3x SAS/SATA
- GFX: nVIDIA GeForce GT120 (MXM-A upgradable)
Xserve in 2020
如果需要在家用条件中使用Xserve,主要存在以下几个问题:
作为服务器使用
- 硬盘仓位太少,且SATA硬盘容量限制在1TB
作为工作站使用
- 5500系列处理器性能已经严重过时
- 风扇噪音严重
- GPU太弱
共通的问题
- 已经无法支持最新的macOS,如果需要使用macOS
本文主要只讲关于风扇噪音的问题。
风扇噪音
就如同大部分1U服务器一样,Xserve的风扇噪音还是很明显的。Xserve内部一共有14个小风扇,默认的转速设定范围为6000 RPM ~ 18000 RPM。在最低转速设定下距离服务器半米的噪音级别大约是52dB。从数值上讲并不过分,在服务器中也不算特别吵的,但是放在家中,特别是如果放在卧室中,还是比较烦人的级别。
风扇改造方案
以下是一些Xserve的风扇的改造方案,包括我可以预见到的优缺点:
在风扇电源上串入电阻 或者 降低风扇供电电压
优点:
简单
缺点:
Xserve的SMC会检测到风扇转速异常,进而把所有风扇设定到全速运行。如果需要使用这种方法减速,即必须要把所有风扇的最高转速降低到6000RPM以下以得到静音效果,但是这样的话整体散热能力将无法应对高负载情况下的发热。
改造风扇的PWM转速控制和转速反馈线
优点:
方法通用性较强,可以用于各种类型风扇的改造。如果改造得当可以自适应转速。
缺点:
Xserve的SMC仍然有可能检测到风扇转速异常,进而使得所有风扇全速运行。Xserve内部一共有14个风扇且均使用专有接口,接入14个转速调节模块还是很麻烦的事情。且并不清楚是否存在现有方案,可能需要自己设计电路板。
在SMC和风扇控制器间加入单片机中间人调节转速
优点:
只需要连接几条I2C线,接线简单。SMC将不会检测到异常转速。普通的单片机开发板即可使用,不需要特地开发电路。可以自适应转速,在低负载下降低噪音,在高负载下保证散热。
缺点:
单片机开发可能较为繁琐。最终方案仅适用于Xserve,不具备通用性。
这里采用第三种方案,即在SMC和风扇控制器中间加入一个单片机作为中间人,截取SMC请求的RPM和风扇控制器返回的RPM进行调整。
硬件实现
单片机
硬件方面直接使用了便宜的Longan Nano开发板,搭载了GD32VF103CB RISC-V单片机,板载了一个160x80分辨率的IPS小屏幕,正好可以用于显示转速。
Xserve风扇模块
Xserve的风扇模块到主板的接口是一个12脚的连接器,关键的引脚定义如下:
- SCL-B
- SCL-A
- SDA-B
- SDA-A
- GND
- VDD (5V)
其中A和B分别表示两个不同的I2C/SMBus 1.x总线。其中A总线上的设备有:
- 0x50: 风扇控制器3,控制风扇6-7
- 0x51: 风扇控制器2,控制风扇4-5
- 0x52: 风扇控制器1,控制风扇2-3
- 0x53: 风扇控制器0,控制风扇0-1
其中B总线上的设备有:
- 0x2C: 未知,但是并不位于风扇模块上
- 0x2D: 位置,但是并不位于风扇模块上
- 0x41: PCA9536,I2C总线GPIO,不确定具体用途
- 0x51: 风扇控制器6,控制风扇12-13
- 0x52: 风扇控制器5,控制风扇10-11
- 0x53: 风扇控制器4,控制风扇8-9
进行中间人攻击也就是需要从这两个I2C总线入手,截获到0x50 - 0x53设备的消息。
硬件连接
将主板的I2C和风扇模块的I2C分别接上单片机板。
我这里的连接为:
- PB6 - Fan module SCL-A
- PB7 - Fan module SDA-A
- PB10 - Fan module SCL-B
- PB11 - Fan module SDA-B
- PA12 - MB SCL-A
- PA13 - MB SDA-A
- PA14 - MB SCL-B
- PA15 - MB SDA-B
软件
I2C接收
由于每个I2C总线上单片机都需要模拟4个I2C设备,即响应4个不同的地址。而GD32的硬件I2C只能响应最多两个地址,一共2个I2C控制器,即合计最多只能响应4个地址,为此并不能满足需求。所以这里选择使用软件GPIO中断驱动的做法。I2C的时钟率为100kHz,单片机主频为100MHz,单片机通常有半周期的时间准备响应,即每个I2C时钟边沿单片机有大约500时钟周期可以准备响应。考虑到单片机流水线较浅,也没有cache的问题,IPC应该是十分可预测的,应该可以在满足性能需求。
实现的话,维护一个状态机,根据SCL和SDA的状态进入不同的状态,输出不同的信号,需要的时候调用上层的设备模拟函数读取或者写入数据。具体可以参考代码。
I2C发送
直接使用GD32的硬件I2C控制器进行发送即可。
风扇控制器模拟
风扇控制器本身拥有很多功能,但是BMC并没有使用这些高级功能。BMC只是把风扇控制器设定到了手动模式,随后设置RPM。模拟控制器主要的工作还是模拟寄存器读写接口,包括批量读写一类的功能。除此之外没有什么太多值得注意的东西。
整体逻辑
Xserve SMC每秒会读取一次所有风扇的转速,并设定一次所有风扇的转速。程序代码在收到所有的风扇转速后,对转速进行调整,发送给风扇控制器。随后读取所有风扇的转速,进行反向调整后,等待下一次SMC读取的时候返回给SMC。
UI设计
这个倒确实是个很次要的点了。考虑到这个设备是装在机箱里的,大部分时间是看不见屏幕的。UI比较简单直白,三列数据,分别是SMC请求的转速,风扇设定的转速,和风扇实际的转速。一共14行,分别对应14个风扇。
最终安装及效果
安装完成如图。在环境噪音约为36dB的室内开机后噪音级别为48dB,注意到此时主要的噪声来源于电源上的小风扇,而本次改造并未涉及到电源风扇的改造。如果有必要这个会是下一个改造的目标。
其它改造
讲完风扇改造之后,这里也讲讲其它可能的改造:
升级5500处理器
5500系列的处理器性能最高的是W5590,4C8T 3.33GHz。Xserve使用的处理器是没有IHS(金属顶盖)的,但是也可以安装带有IHS的处理器,或者也可以选择开盖。
升级5600处理器
5600系列处理器使用了和5500系列相同的LGA1366插槽,然而Xserve的固件并不支持5600系列处理器。由于5500和5600已经是集成了内存控制器的处理器,为此仅仅只是更新微码并不足以让BIOS支持新的处理器。由于我并不了解更复杂的EFI固件修改,所以这部分我就无能为力了。目前为止,唯一可行的让Xserve支持5600系列处理器的方法是刷入MacPro5,1的固件。刷入5,1固件后会带来以下的问题:
- 无法再支持5500系列处理器
- 只能使用8个内存槽(一共12个)
- 服务器前面板LED无法使用(包括CPU负载和硬盘状态)
- 序列号和型号不符会造成无法使用iCloud等服务(可以使用OpenCore注入型号解决)
- 无法使用SATA硬盘托架,只能使用SAS(但是可以在SAS托架中使用SATA硬盘)
显卡升级
Xserve支持使用一张MXM-A的显卡。推荐升级为AMD Radeon Pro WX4150、AMD Radeon RX560等的MXM-A显卡以获得Metal支持。可以参考iMac 2011显卡升级帖来刷入修改版的VBIOS来支持显示启动界面。