``
我自己用的是锁定文件的方法 sudo chattr +i /etc/samba/users/1001.share.conf 其他两个未验证,大家慎重!!!
问题描述
在飞牛OS 中创建团队共享时,明明设置的名字是 abc,但实际在 SMB 中访问时却变成了 团队文件-abc。
比如你在 Web 界面创建了一个叫 abc 的团队共享,Windows 里访问 \\NAS_IP\abc 是不通的,只能用 \\NAS_IP\团队文件-abc。
公司很多电脑之前映射的盘符全部失效,影响面比较大。
排查过程
1. 确认现象
查看 Samba 配置文件 /etc/samba/users/*.share.conf,发现团队共享的 section 名确实被加了前缀:
[团队文件-abc]
path = /vol2/@team/abc
writeable = yes
browseable = yes
...
路径是 /vol2/@team/abc(没前缀),但共享名是 团队文件-abc(有前缀)。
2. 查 share_service 日志
查看 /usr/trim/logs/share_service.log,找到了关键日志:
[info] [WebDavFS] [webdav] Need to create share folder '/vol2/@team/abc', name '团队文件-abc'
[info] [WebDavFS] [webdav] Need to create share folder '/vol2/@team/backup', name '团队文件-backup'
[info] [WebDavFS] [webdav] Need to create share folder '/vol2/@team/xx', name '团队文件-xx'
可以看到:路径没前缀,共享名有前缀,说明前缀是程序运行时动态拼接上去的。
3. 搜索前缀来源
用 grep -a 搜索飞牛OS 核心二进制和配置文件(飞牛OS 精简系统没有 strings 命令):
grep -a "团队文件" /usr/trim/bin/share_service
结果:二进制中搜不到完整的"团队文件"字符串,但能搜到"团队"和"文件"是分开存储的字符串常量。
进一步搜索发现了关键格式字符串:
%s-%s
这是一个 C/C++ 格式化字符串,位于 share_service 二进制的 offset 2010428(6字节:25 73 2d 25 73 00)。
4. 查数据库
飞牛OS 用 PostgreSQL 存储配置,查了 trim 库的所有表:
sudo -u postgres psql -d trim -c "\dt"
发现 storage、user_storage、sysdata、kv_storage 等表均无共享名相关数据,说明共享名不是从数据库读取的,而是 share_service 运行时根据路径类型动态生成的。
5. 确认根因
综合以上排查,前缀生成逻辑在 /usr/trim/bin/share_service 这个二进制程序里:
share_service 扫描 /vol2/@team/ 目录
- 发现路径含
@team → 判断为团队类型共享
- 查内置类型标签表 → team 类型对应标签"团队文件"("团队"和"文件"分开存储,运行时拼接)
- 用
%s-%s 格式拼接 → "团队文件" + "-" + "abc" = 团队文件-abc
- 写入
/etc/samba/users/{UID}.share.conf
解决方案
以下方案按推荐程度排列,大家根据自己的情况选择:
方案一:手动加别名共享 + chattr 锁定配置文件(推荐)
同一个目录可以有多个共享名,手动在 .share.conf 里加一个不带前缀的 section,然后用 chattr +i 锁定文件防止飞牛OS 覆盖。
步骤:
- 编辑对应用户的配置文件,在
[团队文件-abc] 后面加一个 [abc],配置完全一样:
[abc]
path = /vol2/@team/abc
writeable = yes
browseable = yes
available = yes
- 重启 Samba:
sudo systemctl restart smbd
- 锁定配置文件(内核级锁定,飞牛OS 写不进去):
sudo chattr +i /etc/samba/users/1001.share.conf
- 以后要在 Web 界面改共享时,先解锁:
sudo chattr -i /etc/samba/users/1001.share.conf
# 改完后再锁回来
sudo chattr +i /etc/samba/users/1001.share.conf
优点: 简单粗暴,不需要常驻进程,一行命令搞定。
缺点: 锁定期间 Web 界面改共享不会生效(但不影响已有共享正常使用)。
方案二:守护脚本自动补回
写一个后台脚本,监控 .share.conf 文件变化,一旦飞牛OS 重写了配置导致别名丢失,几秒内自动补回。
可以用 inotifywait 实时监控,也可以用 cron 每分钟检查一次。
优点: 不影响 Web 界面正常操作。
缺点: 需要常驻进程,依赖 inotifywait(可能需要额外安装)。
方案三:二进制补丁(最彻底但有风险)
直接修改 share_service 二进制中的 %s-%s 格式字符串,替换为 %2$s(POSIX 位置参数,跳过前缀只输出名称):
原始: 25 73 2d 25 73 00 → "%s-%s" → "团队文件-abc"
补丁: 25 32 24 73 00 00 → "%2$s" → "abc"
优点: 从根本上去掉前缀,所有团队共享都生效。
缺点: 飞牛OS 系统更新会覆盖补丁,需要重新打;有一定风险。
方案四:客户端批量重映射(应急用)
如果服务器暂时不方便操作,可以在客户端用脚本批量清理旧映射、重新映射新路径:
@echo off
net use Z: /delete /y
net use Z: \\192.168.10.104\团队文件-abc /persistent:yes
发到工作群让大家跑一下就行。
总结
| 方案 |
难度 |
持久性 |
风险 |
| chattr 锁定配置文件 |
低 |
锁定期间有效 |
低 |
| 守护脚本自动补回 |
中 |
持续有效 |
低 |
| 二进制补丁 |
高 |
系统更新前有效 |
中 |
| 客户端重映射 |
低 |
一次性 |
无 |
个人建议: 如果只是几台电脑的问题,先用方案一(chattr 锁定)最快。如果团队共享经常变动,用方案二(守护脚本)更省心。
补充信息
- 飞牛OS 版本:测试于 2026年7月,
share_service 编译于 2026.7.1
- 前缀生成逻辑在
/usr/trim/bin/share_service 二进制中,不是配置文件或数据库
- 飞牛OS 应用开放平台目前没有提供管理 SMB 共享名的 API,无法通过开发应用来直接控制前缀行为
- 希望飞牛官方能在后续版本中考虑:让用户选择是否加前缀,或者直接在 Web 界面支持自定义共享名
如果各位有更好的方案欢迎跟帖交流!