问题现象
- SMB 挂载后,`/vol1`(RAIDZ2,6块 HDD)上的个人文件夹(Bak、Clips、Documents、Downloads、Media、stash)每天自动消失,无法通过 SMB 访问。
- 文件本身并未丢失,在 NAS 本地文件系统上完好存在。
- 通过飞牛管理界面重新配置「文件管理设置 → SMB → 可见文件夹范围」后,文件夹重新出现。
- 问题每天发生,发生时间约为 00:00(午夜)。
根本原因
`share_service`(飞牛核心 SMB 配置管理服务)在每日 ZFS 快照任务触发后重新生成 SMB 配置文件,但在重新写入 `/usr/trim/var/share_service//smb.conf` 时,产生了**不完整的 JSON**,缺少 `items`、`mounted`、`appShare`、`external`、`team` 等字段。
对比:正常(FTP)vs 损坏(SMB)
**`/usr/trim/var/share_service/1000/ftp.conf`(正常)**:
`json
{
"updated": 1776528015525,
"encoding": "",
"mode": 2,
"extended": {
"teamShareMode": 2,
"mounted": [],
"appShare": [],
"external": [],
"team": []
},
"items": [[], []]
}
`
**`/usr/trim/var/share_service/1000/smb.conf`(损坏状态)**:
`json
{
"updated": 1776528015513,
"encoding": "",
"mode": 2,
"extended": {
"teamShareMode": 2
}
}
`
`items` 字段缺失时,`share_service` 不为用户的个人文件夹生成 Samba share 定义,导致这些文件夹在 SMB 连接下不可见。
触发时序(以 2026-04-19 00:00 为例)
| 时间 | 事件 |
|------|------|
| 00:00:00 | ZFS 快照任务(`trim.snapshots`)触发 |
| 00:00:15 | 磁盘 sdf、sdg 唤醒(vol2 镜像组)|
| 00:00:15 | `share_service` 重新写入 `1000.share.conf`(此时 smb.conf 已损坏)|
| 00:00:15 | 所有用户的 `smb.conf` 被截断写入(uid=1000、1001、1002 均受影响)|
| 之后 | 新的 SMB 连接找不到个人文件夹 shares;已建立的连接暂时不受影响 |
**Bug 位置**:`share_service` 在处理 ZFS 快照完成事件时,重新生成 `/usr/trim/var/share_service//smb.conf` 的逻辑中存在缺陷,导致 JSON 被截断写入(缺少 `items` 字段和 `extended` 子字段)。FTP/NFS/WebDAV 的同名配置文件写入正确,仅 SMB 受影响。
**重现条件**:
- 飞牛 NAS 配置了「每日 ZFS 快照」
- SMB「可见文件夹范围 → 我的文件」设为「全部允许」
- 等待每日 00:00 快照任务执行后,断开并重新连接 SMB
**建议修复**:在 `share_service` 写入 `smb.conf` 前验证 JSON 结构完整性,确保 `items` 字段始终被写入。