返回星港

在 RK3588 盒子上重做 SMB 共享:音乐与录像目录映射到 Windows 盘符

OBSERVER又菜又爱玩的小朱 LAUNCH JUMPS0 次跃迁
在 RK3588 盒子上重做 SMB 共享:音乐与录像目录映射到 Windows 盘符 · 封面

盒子跑起来之后,最先被填满的往往是那块外接硬盘:音乐、录像、网盘同步下来的资料都堆在上面。可这些文件如果只能在设备终端里用命令行翻,等于白存。我需要的其实很简单——在 Windows 里像插了一块移动硬盘那样,直接双击播放。

这台 RK3588 盒子(ztl A588,Ubuntu 24.04 arm64,主机名 dcztl)本来就已经装了 Samba,也有一份老的共享配置。但老配置里的共享指向「我的文件」这种大杂烩目录,权限和访问范围也没收紧。这一次我把它重做成两个用途明确的共享:一个放音乐,一个放录像。

先看清目标:两个共享,两个盘符

Windows 盘符共享名服务器目录网络地址
Z:music/media/ztl/LinuxDate/files/歌曲与音乐\\192.168.10.62\music
Y:video/media/ztl/LinuxDate/video\\192.168.10.62\video

服务器地址是 192.168.10.62(dcztl),授权账号为 xiaozhu,密码沿用原值,只存在 Samba 自己的密码库里,不写进文档、不进归档、不写进命令行。

有一点必须提前说明:旧的 myfiles 共享已经移除,但原来那个「我的文件」目录和里面的内容没有删除、也没有搬动。移除的是访问入口,不是数据。

环境与前提

  • 系统:Ubuntu 24.04 arm64,内核 5.10.198,Samba 4.19.5,smbd、nmbd 运行中并保持开机自启。
  • 存储:外接盘为 ext4,实际设备 /dev/sda1,UUID 8b9cbec5-c4d7-466f-acea-d1c9531ccada。
  • 目录权限:两目录原有权限保持不动,文件访问身份保持 ztl:ztl,没有递归调整数据权限。
  • 这次改造没有新增服务或端口,仍沿用 SMB 原有的 139/445。

外接盘原有 /etc/fstab 固定自动挂载配置保持不变:

UUID=8b9cbec5-c4d7-466f-acea-d1c9531ccada /media/ztl/LinuxDate ext4 defaults,nosuid,nodev,nofail,x-systemd.automount,x-systemd.device-timeout=15s 0 2

按 UUID 挂载而不是按设备名,是为了避免插拔顺序变化导致 /dev/sdX 漂移。缺盘时绝不能向同名目录写入,否则数据会落到系统盘的空目录里。

实施步骤

1. 确定共享目录与账号

音乐目录和录像目录都落在那块 1.8T 外接盘上,避免占用板载 eMMC。授权账号沿用已有的 Samba 账号 xiaozhu,只更新它自己的 SMB 密码,不去动系统用户。

2. 收紧共享配置

两个共享都保留了下面这组限制:

  • valid users 与 write list 白名单:只有指定账号能进、能写;
  • guest ok = no:不允许匿名访问;
  • 私网来源 hosts allow / hosts deny 限制(见下一节,这是本次最关键的一处);
  • 禁止符号链接;
  • 沿用原有的创建掩码 0666 / 0777。

下面是 /etc/samba/smb.conf 里实际生效的全部配置语句(已省略 Samba 默认的注释行,只保留实际生效部分;原文件中以 ; 开头的示例项和说明性注释没有改动,这里不重复列出):

[global]
   workgroup = WORKGROUP
   server string = %h server (Samba, Ubuntu)
   log file = /var/log/samba/log.%m
   max log size = 1000
   logging = file
   panic action = /usr/share/samba/panic-action %d
   server role = standalone server
   obey pam restrictions = yes
   unix password sync = no
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
   pam password change = yes
   map to guest = bad user
   usershare allow guests = yes
[printers]
   comment = All Printers
   browseable = no
   path = /var/tmp
   printable = yes
   guest ok = no
   read only = yes
   create mask = 0700
[print$]
   comment = Printer Drivers
   path = /var/lib/samba/printers
   browseable = yes
   read only = yes
   guest ok = no
[music]
   comment = 歌曲与音乐
   path = /media/ztl/LinuxDate/files/歌曲与音乐
   browseable = yes
   read only = no
   guest ok = no
   valid users = xiaozhu
   write list = xiaozhu
   force user = ztl
   force group = ztl
   create mask = 0666
   force create mode = 0666
   directory mask = 0777
   force directory mode = 0777
   nt acl support = no
   follow symlinks = no
   wide links = no
   hosts allow = 127.0.0.1 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
   hosts deny = 0.0.0.0/0
[video]
   comment = 录像
   path = /media/ztl/LinuxDate/video
   browseable = yes
   read only = no
   guest ok = no
   valid users = xiaozhu
   write list = xiaozhu
   force user = ztl
   force group = ztl
   create mask = 0666
   force create mode = 0666
   directory mask = 0777
   force directory mode = 0777
   nt acl support = no
   follow symlinks = no
   wide links = no
   hosts allow = 127.0.0.1 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
   hosts deny = 0.0.0.0/0

这个文件里没有任何口令:SMB 口令保存在 Samba 自己的密码库里,由 smbpasswd 写入,不落在配置文件,也不进版本库与普通归档。

[global] 段相对 Ubuntu 发行版默认值的改动只有一处:unix password sync = no。本次改造之前的配置备份里这一行还是默认的 yes,把它关掉是为了让以后改 SMB 口令时只更新 Samba 密码库,不连带修改系统登录口令——后一篇的运维脚本也会在执行改密码前再校验一次这一项。

两个自定义共享段里的安全相关项是这样用的:browseable = yes 允许在网络邻居里看到共享名;read only = no 配合 write list = xiaozhu,只有白名单账号可写;guest ok = no 关闭匿名;valid users = xiaozhu 只放行这一个账号;force user / force group 把落地文件身份固定为 ztl:ztl;follow symlinks = no 与 wide links = no 禁止通过符号链接跳出共享目录;hosts allow 只放行回环与三个私网段,hosts deny = 0.0.0.0/0 作为兜底拒绝。[printers] 与 [print$] 是发行版自带的打印共享段,保持 guest ok = no、read only = yes。

3. 让已有 smbd 进程读到新配置

改完配置后,Samba 已有的子进程起初并没有读取到新共享。因为不想重设口令、也不想重启设备,我用 HUP 信号让全部 smbd 进程重新加载配置:

systemctl kill --kill-whom=all --signal=HUP smbd.service

需要回滚时,本次修改前的就地备份在 /etc/samba/smb.conf.bak.20261009-141605,审阅后复制回 /etc/samba/smb.conf,再执行 testparm 与 systemctl reload smbd。回滚只改配置,不删除任何数据。

使用:Windows 端怎么连

当前这台电脑已经创建了持久化的 Z:、Y: 映射,注册表对应的 Network 项也已核对过。其他电脑可以直接在资源管理器里输入上面的网络地址,或者用空闲盘符做映射(密码交互输入,不写在命令里):

net use Z: \\192.168.10.62\music /user:xiaozhu * /persistent:yes
net use Y: \\192.168.10.62\video /persistent:yes

不要「删除全部网络连接」,也不要覆盖其他盘符或删除其他服务器的凭据——那些可能是你在用的别的共享。

macOS / Linux 端更简单,直接在文件管理器里填 smb://192.168.10.62/music 或 smb://192.168.10.62/video。

实测踩到的一个坑:Windows 重启后认证失败

电脑重启后 Y:/Z: 一度全部断开。排查下来服务器侧完全正常:服务在跑、端口在听、外盘 UUID 与挂载也没问题。问题出在客户端——Windows 把这台服务器的网络凭据错存成了 admin,而共享只允许 xiaozhu。

处理方式是先删掉那条错误的网络凭据,然后在本机 CMD 里交互输入原密码并重建映射:

cmdkey /add:192.168.10.62 /user:xiaozhu /pass
net use Y: \\192.168.10.62\video /persistent:yes
net use Z: \\192.168.10.62\music /persistent:yes

顺带记录两个反常识的实测结论,省得你也绕进去:

  • net use 的 /savecred 与 /user 不能同时使用,实测报 NET HELPMSG 3510。
  • CredRead 返回的 Domain Password 密码内容长度是 0,不能据此判断「用户没保存密码」;持久映射的 UserName 字段为空,也照样能由保存的网络凭据完成认证。

修复后只读复核:Y:/Z: 均正常,可以列根目录(Y: 0 项、Z: 2 项);Windows 网络凭据账号显示为 xiaozhu;HKCU\Network\Y/Z 持久项存在;服务端确认客户端 192.168.10.202 以 xiaozhu 通过 SMB3_11 登录。注销/重启后的自动重连还需要单独实测。

验证结果

  • testparm 校验通过,两个共享的名称与路径正确,旧的 myfiles 已经无法访问。
  • 使用 Windows 现有的 xiaozhu 会话映射成功,两个盘符状态 OK。
  • 两个共享均完成列目录、创建目录、写入、读取下载、重命名、删除测试,且客户端与服务器 SHA256 一致,测试文件已清理。
  • 两个共享的匿名访问均返回 NT_STATUS_ACCESS_DENIED。

安全边界:为什么一定要写私网白名单

这是整件事里最容易被忽略、也最危险的一点。

Samba 的 smbd 默认同时监听通配的 IPv4 和 IPv6 地址,而这台设备的 eth0 除了内网 IPv4,还持有一个公网 IPv6 地址。也就是说,如果只靠「它在内网」这个印象来判断安全性,445 端口很可能已经在 IPv6 上对着整个互联网敞开。

本次的做法是:两个数据共享沿用私网来源限制(hosts allow 私网白名单 + hosts deny),再加 guest ok = no 与 valid users 白名单,层层收紧。最终匿名访问被明确拒绝。

务必分清「来源被共享配置拒绝」和「端口被防火墙封死」——两者不是一回事。本机 ufw 并未启用,iptables 默认策略是 ACCEPT,所以服务端口默认是对外可达的,安全性完全依赖共享自身的来源限制与应用层认证。SMB 绝对不要做公网映射或内网穿透。

另外,服务器 IP 来自 DHCP,建议在路由器上做地址保留,否则地址一变,所有盘符映射都会失效。

日常管理与还原

testparm -s
systemctl is-active smbd nmbd
systemctl is-enabled smbd nmbd
findmnt -T '/media/ztl/LinuxDate/files/歌曲与音乐'
smbclient '//192.168.10.62/music' -U xiaozhu
smbclient '//192.168.10.62/video' -U xiaozhu

最新的还原归档在 /root/AI/backup/smb-music-video/,默认执行 ./restore.sh 只是预演,必须明确写 ./restore.sh --apply 才会落盘;它只恢复 SMB 配置,不带口令库、不带业务文件、也不改 fstab。重装系统时的顺序是先恢复固定挂载、ztl/xiaozhu 系统用户和 Samba 账号,再恢复共享配置。旧的 smb-share 归档是历史快照,它会恢复旧的 myfiles,所以只能先应用旧的基础归档、最后再应用新归档,不能反向覆盖。

本次所有远程改动都是通过单文件或明确命令完成的,没有使用工作区全量 push/sync。整机重启后的自动重连仍属于未验证项。