给 DS218+ 硬塞一块 SSD 读缓存:把 eSATA 口改造成内置 SATA 盘位

random-pic-api

前言

DS218+ 是我用得最久的那台群晖,2 盘位、J3355、4G 内存(后来偷偷加到 10G),常年跑 Drive、Photos、几个轻量 Docker。用下来最大的槽点只有一个:磁盘太慢了

这货用的是两块 4T HDD 组 SHR,日常浏览照片、翻 Drive 里的老文档,机械盘寻道声噼啪响,Photos 的缩略图滚动起来一顿一顿的。我本来想加块 SSD 做读缓存,结果发现:

DS218+ 在 DSM 里根本没有 SSD 缓存选项

官方给的理由是只有 2 个盘位,”塞 SSD 就等于少一个数据盘”,所以直接把这个功能砍了。但我又不想换 920+ / 923+(那时候价格还没跳水)—— 总觉得这台机器其实硬件是够的,只是被官方软件故意阉割掉了。

然后我盯上了它屁股后面那个从来没用过的 eSATA 接口

思路很简单:如果能把 eSATA 这个接口在系统里”改名”成一个内置 SATA 盘位,那 DSM 就会认为这台 NAS 有 3 个内置盘位,SSD 缓存选项理论上就会亮起来。

折腾了一晚上,方案跑通了。这篇把整个原理和具体参数都记一下,后面谁要是也想干同样的事,直接抄就行。

相关配置文件

群晖系统里有两份同名配置,必须两个都改,不然要么重启后被覆盖,要么运行时读错:

1
2
/etc/synoinfo.conf          # 运行时使用
/etc.defaults/synoinfo.conf # 恢复出厂 / 升级时使用

我第一次只改了 /etc/synoinfo.conf,重启后一切正常。后来 DSM 推了个补丁更新,它顺手把 /etc.defaults/ 里的默认值回写回来,maxdisks 又变回 2 了,缓存配置也丢了,整个存储池直接进入”异常”状态。

所以一定要同时改两份,有备无患。

我关心的四个参数

打开这俩文件,里面其实有上千个参数,但跟盘位相关的就这四个:

1
2
3
4
5
# 默认值(DS218+ 原厂)
maxdisks="2" # 最多支持几个盘位
esataportcfg="0x4" # eSATA 接口位图(十六进制)
internalportcfg="0x3" # 内置 SATA 接口位图(十六进制)
support_ssd_cache="no" # 是否允许 SSD 缓存

前两个好理解:maxdisks 是上限,support_ssd_cache 控制 DSM 里那个菜单项是否可见。

难理解的是 esataportcfginternalportcfg —— 官方文档里压根没解释,但它俩是整件事情的核心。

位图的含义

这两个值虽然写成十六进制,但本质是位图(bitmap):每一个二进制位代表一个接口槽位,1 表示”这个位置上有个接口”,0 表示”没有”。

拿 DS218+ 默认值展开看:

参数十六进制二进制含义
internalportcfg0x30b011第 0、1 位是内置 SATA
esataportcfg0x40b100第 2 位是 eSATA

也就是说,DS218+ 内部一共有 3 个物理 SATA 控制器通道:前两个分配给了盘位 1 和 2,第三个被引出到了背面那个 eSATA 接口。

这就是为什么这个改造在物理上可行 —— 它本来就是一个完整的 SATA 通道,只不过被系统打了”eSATA”的标签。

我的目标值

我想要的效果是:eSATA 那一位”挪”到内置 SATA 这边,总盘位数变 3:

参数改前改后
maxdisks23
esataportcfg0x40x0
internalportcfg0x30x7
support_ssd_cachenoyes

验算一下:0x7 = 0b111,正好是三个内置 SATA 位,eSATA 清零。数学对齐。

实际操作

第一步:SSH 进群晖改配置

DSM 默认 SSH 是关的,去控制面板 → 终端机和 SNMP 打开,然后:

1
2
ssh admin@192.168.1.x
sudo -i # 切 root

两份配置文件都编辑一下:

1
2
vi /etc/synoinfo.conf
vi /etc.defaults/synoinfo.conf

⚠️ 建议先备份一份:cp /etc/synoinfo.conf /etc/synoinfo.conf.bak,改崩了好还原。

找到那四行,按上面的表格改成新值。

第二步:物理上接 SSD

改完别急着重启,先把 SSD 插到 eSATA 口上。

我用的是一个很便宜的 eSATA → 2.5 英寸 SATA 转接盒(某宝大概五六十块),里面塞了一块闲置的 256G MX500。注意:

  • 用外接电源的那种转接盒,不要只靠 eSATA 供电,eSATA 本身没给盘供电的能力;
  • 线材尽量短,长 eSATA 线容易不稳定,会出现盘时断时连。

第三步:重启

改完配置 + 接上盘之后:

1
sudo reboot

重启后登录 DSM,打开存储管理器,直接看 HDD/SSD 列表,能看到多出来一个”磁盘 3“。此时它被认成了一个内置盘,类型会是 SSD。

然后去存储管理器 → SSD 缓存,新建缓存的按钮应该已经可以点了 —— 选择读缓存、挂到你现有的存储池上、分配完整个 SSD,完事。

效果

缓存挂上之后,最直观的两个变化:

  • Photos 里滚动浏览照片几乎不再卡顿,缩略图加载肉眼可见地快了一截;
  • Drive 上经常打开的几个 Office 文档,二次访问基本秒开,不再听到”咔哒咔哒”的机械盘声。

缓存命中率我专门观察了一个月,稳定在 **60% ~ 75%**,对于”经常访问同一批热数据“的家用场景来说够用了。

踩坑记录

过程中翻过几次车,都值得记一下。

坑 1:只改了 /etc/synoinfo.conf

这个前面说过了 —— 一定要同时改 /etc.defaults/synoinfo.conf,不然 DSM 打一次大补丁就回原形,SSD 缓存会被强制卸载,严重的话还会让存储池进入”降级/异常”状态。

坑 2:support_ssd_cache 改了还是没生效

改完重启发现 DSM 里 SSD 缓存选项还是灰的。后来发现是我把 support_ssd_cache="yes" 写成了 support_ssd_cache=yes(没加引号)。这文件语法挺挑剔的,值两边必须有双引号,不然被当成非法值忽略掉。

坑 3:eSATA 线拔掉之后存储池异常

有一次我临时想把 eSATA 盒子搬到另一台机器上,直接把线拔了。结果回来重启 NAS,存储池直接进入”降级”状态 —— 因为系统现在把这块 SSD 当作内置盘,它”突然消失”等同于一块内置盘掉了。

解决办法:

  1. 禁用缓存后再拔:在 DSM 里先把 SSD 缓存”移除”,等它提示安全移除后再拔线;
  2. 如果已经拔了,冷启动时不要装回来,直接进 DSM 把那个”丢失的盘”从存储池里清掉,然后再重新分配缓存。

所以强烈建议这块 SSD 就长期待在机器旁边别动它,把 eSATA 盒子跟 NAS 一起用扎带绑到机柜里,当它不存在就行。

坑 4:DSM 大版本升级前别忘记检查

DSM 7.x 升级 7.1、7.2 这种大版本更新时,我都会提前把配置文件再核对一遍。经验上小版本不会动这个文件,但每次大版本更新之后,最好 ssh 上去 cat 一眼,有被覆盖就再改回来。

最后聊两句

这波操作本质上是在软件层面”告诉 DSM 我有 3 个盘位”,硬件 & 固件上没做任何破坏性改动,DSM 系统升级依然能走官方通道。但这毕竟不是官方支持的用法,风险要自己担:

  • 如果这台 NAS 上存着不可替代的数据,务必先有异地备份再动手;
  • 改完之后别把这事写进工单找群晖官方售后(笑);
  • 我建议只加读缓存,不要加读写缓存——读写缓存一旦 SSD 出问题会直接丢数据,而 eSATA 这种接口稳定性本来就不如内置 SATA。

对了,后来 DS218+ 被我出掉换了 923+,这台 923+ 官方就原生支持 SSD 缓存,还带 NVMe M.2 槽,不用折腾这些奇技淫巧了。但那是另一篇文章的故事了。


参考