naivekun @ c/scavenger ·
edit-2
13 days ago

80块钱的双盘NVMe RAID卡解锁RAID0/1/JBOD和EFI菜单(附带RGB加速效果)

pin
pin

main_pic

最近逛闲鱼发现这个WD AN1500非常便宜,本身这个卡是捆绑两个WD NVMe固态硬盘卖的,卖家把SSD拆了之后,外壳+板子只要80块钱

插电,开机,RGB拉满

main_pcb

它有PCIe 3.0 x8的端口,下面通过两个PCIe 3.0 x4接两个M.2 NVMe 2280固态硬盘

这个卡不是PCIe Switch, 是NVMe HBA/Raid控制器

1. 通电瞅瞅

PCIe信息如图,其中pid vid是Marvell 88NR2241控制器,sub pid vid是WD的,vid=1b96,pid=4000。Option ROM禁用了

因为它并不是PCIe Switch,所以呈现给系统的只是一个NVMe设备。通过id-ctrl可以看到控制器信息

因为没有装硬盘所以没显示容量

2. 看看怎么玩

这个卡原本是捆绑两个WD的NVMe盘开raid0用的。固件写死了raid0

但是这个主控方案能做的远远不止raid0 。超微 惠普 联想 还有一些国产厂商用这个芯片设计了2盘甚至4盘的NVMe raid控制器,有的用于服务器系统盘raid1高可用,有的用于JBOD大容量扩展,有的用于raid0高性能。而且部分卡还有BIOS配置界面,可以方便的创建阵列。例如

ThinkSystem M.2 RAID B540i-2i SATA/NVMe Adapter https://lenovopress.lenovo.com/lp0769-thinksystem-m2-adapters

Supermicro NVMe M.2 RAID Carrier Riser Card AOC-SMG3-2M2-B https://www.supermicro.com/products/accessories/addon/AOC-SMG3-2M2-B.php

HPE NS204i‑p x2 Lanes NVMe PCIe3 x8 OS Boot Device https://buy.hpe.com/us/en/options/boot-devices/os-boot-devices/boot-cards-devices-drives/hpe-ns204i‑p-x2-lanes-nvme-pcie3-x8-os-boot-device/p/p12965-b21

这样看来,80快钱的AN1500虽然有RGB加成,但是缺少

  1. Option ROM/BIOS菜单
  2. raid1
  3. JBOD

3. 搞定固件刷写

拆了看看,显然这个卡有一个SPI Flash用来存储固件,量了一下是1.8V的,而且编程器夹子读起来怪怪的,可能是直接把主控部分逻辑带起来了,影响固件读写。所以想要折腾,首先要搞定固件方便的刷写

因为夹子不能用,我既懒得用风枪拆,又懒得焊flash emulator座子,所以研究一下怎么从PCIe设备上刷固件。作为一个正常的设备,支持从PCIe固件更新应该是个非常常见的功能

3.1 搞到刷写工具

上面几家厂商的扩展卡不仅开放了固件下载,还附送了固件刷新工具/命令行管理工具,例如联想的在这里

https://support.lenovo.com/us/en/downloads/ds547074-mnvcli-command-line-tool-for-linux

H3C的在这里

https://www.h3c.com/cn/BizPortal/DownLoadAccessory/AccessoryDetail.aspx?ID=aa0abafe-8f95-4fc4-a57c-365fc7ccab05

解包瞅瞅,可以拿到两个工具

  1. mvf_64:这个东西用来直接操作SPI控制器,读写flash。看起来是给研发用的,即使固件坏了也能直接通过操作MMIO控制SPI读写固件

  1. mnv_cli:这个东西用来配置raid信息,看起来是给用户用的,能刷固件,但是没找到在哪读

3.2 回读固件

那么首先,用mvf_64备份固件。从flash丝印可以看到这个卡是16M的flash,所以

./mvf_64 mvf -rfb an1500_backup_20241107.bin -addr 0x00000000 -sz 0x1000000

成功回读

4. 分析固件结构

其实这个卡还有个串口,不过接了看了一眼没啥东西,也没有cli,跳过

这种东西的固件大概率是个bootloader+rtos的结构

和上面几家不同厂商的卡的固件对比了下,发现

  1. 有多级bootloader,多个region

这个卡在0x1_0000 0x2_0000这种地方有很规律,很明显的头部结构特征

  1. AN1500在0x60_0000缺少UEFI Option ROM

前面的那个legacy ROM也没有配置菜单,只管让BIOS能把卡当作启动设备

  1. 没找到哪里控制了raid0/1的支持情况

大概率不是硬件熔丝,因为Marvell通常不是License收钱大师

5. 如果直接把别的卡刷进去呢

直接说结论,刷进去之后PCIe Option ROM能出来,BIOS能出菜单,也能配置raid0 raid1 jbod

但是

不 认 盘

不认盘通常有这几种可能

  1. serdes配置不对。比如不同卡因为硬件设计差异,部分pcie ep或者rc支持复用
  2. GPIO小信号不对。比如PERST或者时钟开启这种信号,也是因为硬件设计差异

6. 先把Option ROM改出来

合理猜测,原厂AN1500固件里面写了针对AN1500的外设分配/初始化代码,所以必须基于原厂固件修改

通过之前的分析,发现option rom在固件的0x60_0000位置

所以找个别家的卡,把option rom搬过去即可

7. 把固件刷回去

7.1 直接刷一下

卧槽,俩工具都不给刷。这个时候应该吹flash下来刷了,但是我还是懒。所以逆一下咋回事

看起来就是4字节小端加一遍,看看是不是0。这校验也不是CRC32 ,就是个土制checksum

另外注意到其他卡(戴尔,惠普等)固件都是7MB,而且正好在7MB末尾有个4字节的东西

合理猜测,这个卡是AB分区,前8M和后8M各一个固件

  1. mnv_cli:给卡上固件发指令,把固件传输到卡上,卡固件验证CRC并操作SPI刷入
  2. mvf:程序内验证crc ,然后直接通过mmio操作卡的spi控制器,刷固件

7.2 制作一下固件

这样来看,只需要把AN1500固件前7MB切出来,并在最后面塞个CRC就行了,写个脚本

from struct import unpack, pack
import sys

filename = sys.argv[1]

with open(filename, "rb") as f:
    d = f.read()

crc = 0
for i in range(0, len(d)-4, 4):
    dd = d[i:i+4]
    crc += unpack("<I", dd)[0]

print(pack("<I", (0x100000000-crc&0xffffffff)).hex())

发现改完以后mnv_cli就能刷了

刷到最后100%会卡比较久,别急

重启瞅瞅

成功免拆+把option rom干出来了

8. 解锁其他raid模式

ida启动,逆固件,然而看了半天没找到哪里判断的

还是猜一下,看到一个有意思的命令dump hba

结果是

看命令帮助,这个"hba info data structure"很有可能存了raid支持信息。既然都读出来了,直接去原始固件里面搜,开头这几个4e 45 56 4f

发现在0x20000 ,合理猜测这里就是hba info data。故技重施,找个别的功能全的卡把这个区域搬回来,然后重新算一下checksum

刷完重启,发现raid开全了,raid0 raid1 jbod都支持

这样就能开raid1扔服务器里当系统盘了

9. Tips and Release

  1. mvf_64工具需要改内核cmdline,加一行iommu=relaxed 。原因是这个工具直接open /dev/mem访问的设备mmio
  2. 没研究明白怎么改serdes分配,例如改成4个x2端口,解锁四盘和raid10

修改好的固件,以及工具放在

https://github.com/naivekun/wd_an1500_mod

使用方法参考仓库里的README.md

33
message-square
45
  • cybertruck
    4 days ago

    没装linux,用windows的mnv_cli.exe刷一直卡1%,mvf又没有,最后直接上编程器刷上了

  • 9M113
    7 days ago

    这张卡折腾了几天,有几个问题:1.我的主板是X670E Carbon wifi,刷了楼主的固件后,bios出来不子菜单,CSM也无效,native ami nvme driver这个选项找不到所以也无法关闭,但是在cli下该干嘛干嘛,还是能用;2.后来想等楼主的rgb固件,就拆下来闲置了几天,今天再插上去,不管带不带盘,都不认了,cli下-info直接提示no nvme controller is found,不知道真的炸了还是只是固件炸了,是否需要编程器固件来刷…

  • Proton
    7 days ago

    我也买了一个,借宝地问一下,linux 上怎么控制它的 rgb ?有编程能力,对硬件不太了解,给点文档就行 😆

  • null
    9 days ago

    🤤 🤤 🤤 已刷,有空搞几个盘插上去试试

  • karminski-牙医MA
    17 days ago

    看完了👍 感觉工程师过于追求便利也不是啥好事,要么是直接用了provider提供的程序把dumphba直接打包进了工具,要么debug完毕忘了把dumphba去掉了 ( ﹁ ﹁ ) …

    • chraav
      17 days ago

      也有可能是sdk就没给开关关掉这个命令吧

  • Ack
    14 days ago

    二进制大佬,佩服佩服!!!

  • karminski-牙医MA
    17 days ago

    补一下 Marvell 88NR2241 的 Product Brief:

    新款 Marvell 88NR2241 智能 NVMe 交换机可以替代 PCIe 交换机的部分用途:它具有 PCIe x8 主机接口,交换机后面最多可以连接四个 NVMe SSD。与常规 PCIe 交换机不同,主机系统无法单独访问 88NR2241 交换机后面的 SSD。相反,交换机本身实现 NVMe 1.3 协议,并提供交换机后面各个 SSD 的抽象。每个单独 SSD 的存储都可以作为交换机 NVMe 控制器上的单独命名空间呈现给主机系统,或者存储可以通过 RAID 0、1 和 10 模式进行池化。

    由于交换机是与主机系统进行 NVMe 事务的端点,因此它可以提供单个 SSD 可能不支持的高级功能,例如冗余双端口支持、多个命名空间、SR-IOV 虚拟化和 NVMe-MI 管理支持。

    88NR2241 实现了 NVMe 协议,但不执行任何 NAND 闪存管理的艰苦工作,因此它是一个开销非常低的中介,不需要任何外部 DRAM。与简单的 PCIe 交换机相比,它可能会增加稍多的延迟,但额外的延迟对于基于闪存的 SSD 来说不太可能产生影响。 Marvell 使用 PCIe 3 x8 主机接口测得随机读取速度为 1.6M IOPS,顺序读取速度为 6.4GB/s

    Marvell 88NR2241 可以在任何标准 NVMe SSD 前面工作,甚至是那些使用竞争对手控制器的 SSD。 Marvell 设想的一个用例是利用消费级 NVMe 控制器和 SSD 创建企业级存储解决方案。

    与许多服务器中使用的大型扇出 PCIe 交换机相比,Marvell 88NR2241 的端口和通道数相对较少,而且 Marvell 的交换机并不是旨在完全取代那些大型交换机。相反,88NR2241 可能用于较小的热插拔存储模块,这些模块仍可能连接到扇出交换机,或者直接连接到具有大量 PCIe 通道的平台上的 CPU。

    88NR2241 可以与较大 SSD 外形尺寸上的多个 SSD 控制器一起使用,例如源自 Intel Ruler 的新型 EDSFF Long 卡,或者在 PCIe 附加卡上作为带有 SSD 电缆的 HBA,或者在同一块 SSD 上与多个 SSD 控制器一起使用。卡片。像三星 NF1 和 M.2 这样的较小外形尺寸不太可能有足够的空间让 88NR2241 值得使用。

    NVMe 的硬件 RAID 并不像使用 SATA 和 SAS 接口的驱动器那样流行。部分问题在于缺乏能够提供 RAID 功能而又不会造成性能瓶颈的控制器,从而消除 NVMe 的优势。

    Broadcom/Avago/LSI 的一些最新顶级 RAID 控制器可以将四个 SAS/SATA 链路绑定在一起以连接到 NVMe SSD,但这给它们带来了令人失望的端口数量和其他一些不便的限制。 Marvell 88NR2241 并不能满足 NVMe RAID 功能的所有需求(特别是在不支持 RAID5/6 的情况下),但它是向前迈出的一大步。它与现有 NVMe 主机驱动程序的兼容性将使得从软件角度来看部署非常容易。

    Marvell 没有讨论其他 NVMe 交换机的未来计划,但他们很可能正在计划更大的变体,以争夺更多传统 PCIe 交换机市场和一些 SAS/SATA HBA 市场。

  • AlphaAreaA
    17 days ago

    CH341A套1.8V电平转换夹子读完全没问题

    你怕不是3.3V硬怼的读出异常

    • naivekunOP
      16 days ago

      CH341A没事但是太慢了,调试起来费劲。CH347很快但是有问题。都转1.8V了

      • AlphaAreaA
        16 days ago

        是不是垃圾电平转换跟不上CH347T的频率 🤣

        • naivekunOP
          16 days ago

          很可能,所以还是把Marvell主控变成大号编程器比较省事

  • chraav
    13 days ago

    发现个问题就是JBOD模式好像只能出现在单盘的情况下,尝试用不同容量的2块盘,只有raid0和raid1模式,没有jbod模式了,但是单盘创建vd就有

    • 9M113
      11 days ago

      你装两块盘会默认给你创建R0,这个时候用CLI是没办法JBOD的,你需要删除当前R0的VD,然后分别对两款盘创建JBOD的VD就可以了

  • karminski-牙医MA
    17 days ago

    话说这个卡的RGB是固定的还是也有软件可以调整?

    • Apocalypse-Long
      17 days ago

      如果是官方固件,试过是用西数的nvme盘,才能在西数那个软件里调整rgb,第三方盘插进去就用不了rgb控制了

    • naivekunOP
      17 days ago

      PC软件可以开启关闭。不过这个MCU固件有空可以读出来瞅瞅,重写一个RGB逻辑

      • karminski-牙医MA
        17 days ago

        其实按说PC有软件可以改灯效,是不是就意味着有接口可以从pcie直接hack后刷固件

        • naivekunOP
          13 days ago

          在整了,别急

          • maomu
            10 days ago

            大佬牛逼

  • Daoban
    edit-2
    17 days ago

    涨价了,看到要卖108了

    哦哦,咸鱼卖解锁的要199,看到最低77

  • yfeng445
    17 days ago

    牛逼, an1500用很久了从没想到还能这么玩