收起左侧

"团队文件-"前缀,根因定位与解决思路分享

0
回复
41
查看
[ 复制链接 ]

1

主题

2

回帖

0

牛值

江湖小虾

``

我自己用的是锁定文件的方法 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"

发现 storageuser_storagesysdatakv_storage 等表均无共享名相关数据,说明共享名不是从数据库读取的,而是 share_service 运行时根据路径类型动态生成的。

5. 确认根因

综合以上排查,前缀生成逻辑在 /usr/trim/bin/share_service 这个二进制程序里

  1. share_service 扫描 /vol2/@team/ 目录
  2. 发现路径含 @team → 判断为团队类型共享
  3. 查内置类型标签表 → team 类型对应标签"团队文件"("团队"和"文件"分开存储,运行时拼接)
  4. %s-%s 格式拼接 → "团队文件" + "-" + "abc" = 团队文件-abc
  5. 写入 /etc/samba/users/{UID}.share.conf

解决方案

以下方案按推荐程度排列,大家根据自己的情况选择:

方案一:手动加别名共享 + chattr 锁定配置文件(推荐)

同一个目录可以有多个共享名,手动在 .share.conf 里加一个不带前缀的 section,然后用 chattr +i 锁定文件防止飞牛OS 覆盖。

步骤:

  1. 编辑对应用户的配置文件,在 [团队文件-abc] 后面加一个 [abc],配置完全一样:
[abc]
    path = /vol2/@team/abc
    writeable = yes
    browseable = yes
    available = yes
  1. 重启 Samba:
sudo systemctl restart smbd
  1. 锁定配置文件(内核级锁定,飞牛OS 写不进去):
sudo chattr +i /etc/samba/users/1001.share.conf
  1. 以后要在 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 界面支持自定义共享名

如果各位有更好的方案欢迎跟帖交流!


收藏
送赞 1
分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则