Hint: this post is also available in English.

前言

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脚的连接器,关键的引脚定义如下:

  1. SCL-B
  2. SCL-A
  3. SDA-B
  4. SDA-A
  5. GND
  6. 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设计

1602023319338-photo_2020-10-04_23-54-17.jpg

这个倒确实是个很次要的点了。考虑到这个设备是装在机箱里的,大部分时间是看不见屏幕的。UI比较简单直白,三列数据,分别是SMC请求的转速,风扇设定的转速,和风扇实际的转速。一共14行,分别对应14个风扇。

最终安装及效果

1602023317362-photo_2020-10-04_23-54-15.jpg

安装完成如图。在环境噪音约为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来支持显示启动界面。

源代码

https://github.com/zephray/XserveFanSpeedController