原来的 Samba 配置把文件分成 data、media 和 develop 三个共享,分别指向数据目录、媒体盘和开发目录。账户通过 pdbedit 加入 Samba,改完配置再重载。这里保留这套做法,并补齐安装、目录权限和 Windows 连接步骤。
我使用的 Linux 账户是 dex,数据放在 /mnt/data/samba/dex,媒体盘和开发盘分别挂在 /mnt/media、/mnt/develop。下面保留这些实际目录;只有密码改成交互输入。命令按 Ubuntu 的 Samba 服务编写,其他发行版要核对包名和服务名。
安装并添加共享账户
按 Ubuntu Samba 文件服务器文档安装:
sudo apt update
sudo apt install samba
id dex如果最后一条确认用户不存在,先执行 sudo adduser dex;已有用户不需要重建。我通过下面的命令加入 Samba 账户库:
sudo pdbedit -a dexpdbedit -a 的官方手册说明,它会添加账户并交互式询问密码;默认后端要求对应 Unix 用户已经存在。sudo smbpasswd -a TARGET_USER 也是常见入口,选择一种即可,不需要连续添加两次。
先把目录和权限对齐
我当时留下了这两条命令:
sudo mkdir -p /mnt/media/samba
sudo chown dex:dex /mnt/data/samba/dex这里创建的是媒体目录,改属主的却是数据目录,它们是两处不同路径,不能把第二条当成第一条的权限设置。按后面的共享配置补齐目录时,需要分别处理。
下面示例只为新建的个人共享目录设置属主,不递归改写已有文件:
id -gn dex
sudo mkdir -p /mnt/data/samba/dex /mnt/media/samba/dex
sudo chown dex:dex /mnt/data/samba/dex /mnt/media/samba/dex
sudo chmod 0775 /mnt/data/samba/dex /mnt/media/samba/dex这里沿用原配置的目录权限 0775,属主和同组用户可写,其他本地用户可读和进入;Samba 侧再用账户规则限制访问。媒体盘需要先确认已挂载,避免目录实际创建在系统盘上;其挂载配置可以参考《Linux fstab 配置与按需挂载》。
开发目录按已有目录处理,不在这里批量修改权限。用目标用户身份检查是否能进入并读写共享目录,同时确认所有上级目录都有必要的执行权限。
保留三个共享的配置方式
先备份现有配置,在 /etc/samba/smb.conf 中修改对应段落。同名备份已经存在时另选文件名:
sudo cp -a /etc/samba/smb.conf /etc/samba/smb.conf.before-share-change
sudoedit /etc/samba/smb.conf原笔记也记录了直接复制模板的命令。只有已经核对模板和现有服务用途时,才适合整份替换:
sudo cp soft/smb.conf /etc/samba/smb.conf我的模板按独立文件服务器配置,限定 192.168.* 和回环来源,并把新文件和目录权限设为 0664、0775。下面恢复这些实际选项;已经作为域控制器或域成员运行的服务器不能直接套用:
[global]
workgroup = WORKGROUP
server role = standalone server
hosts allow = 192.168. 127.
guest account = nobody
passdb backend = tdbsam
load printers = no
create mask = 0664
directory mask = 0775
force create mode = 0664
force directory mode = 0775
max log size = 50
dns proxy = no三个共享保留原来的目录安排,并显式限定登录账户:
[data]
path = /mnt/data/samba/dex
read only = no
guest ok = no
valid users = dex
[media]
path = /mnt/media/samba/dex
read only = no
guest ok = no
valid users = dex
[develop]
path = /mnt/develop
read only = no
browseable = yes
guest ok = no
valid users = dexdata、media 沿用原来的 dex 账户限制;develop 原来只有 guest ok = no,上面的 valid users = dex 是整理时补上的显式限制。create mask 限定可创建的权限位,force create mode 再补上强制权限位,目录对应另外两项;它们不会修正已有文件权限。Samba 的 smb.conf 手册解释了这些选项,访问仍然受底层文件系统权限约束。
检查配置与监听
先运行配置检查,确认通过再启动服务:
testparm -s
sudo systemctl enable --now smbd.service
sudo smbcontrol all reload-config
sudo systemctl status smbd.service --no-pager
sudo ss -ltnptestparm 不能证明目录可写或客户端可连接。核对 SMB 监听端口后,再按实际客户端地址设置主机防火墙;只在可信局域网提供共享时,不应把 SMB 端口映射到公网。
我记录过的性能参数
另一份旧记录把 use sendfile、异步 I/O、缓存和 socket 选项放在一起,称作性能优化模板。当时没有留下开启前后的吞吐、CPU 或磁盘数据,所以这些值只能证明曾经记录过这种配置,不能证明它们改善了性能。
这些参数都放在 [global] 下:
deadtime = 30
use sendfile = yes
write cache size = 262144
min receivefile size = 16384
aio read size = 1
aio write size = 1
socket options = IPTOS_LOWDELAY TCP_NODELAY IPTOS_THROUGHPUT SO_RCVBUF=131072 SO_SNDBUF=131072保留具体数值,才能在恢复旧环境时核对哪些设置与默认行为不同。这是旧模板的参数记录,是否沿用要看当前版本的支持情况和实际测试结果。
Samba 的 socket options 说明明确提醒,手动指定接收和发送缓冲区会覆盖系统自动调优,可能降低性能。旧例里固定 SO_RCVBUF、SO_SNDBUF 的做法不作为新配置默认值。
其他参数也要按本机版本查默认值、适用范围和是否仍被支持。先运行 smbd --version 和 testparm -s 检查未知选项;不要为了消除告警把一份旧模板反复套进新版本。deadtime 管理空闲连接,也不能直接解释为传输加速。
排查速度时,先固定同一客户端、文件和磁盘路径,分别测网络基线与实际文件复制;可以用iperf3 网络测试方法排除链路瓶颈。随后一次只改变一个确有依据的参数,重新建立客户端连接再比较。没有对照结果时,保留默认配置比给旧参数附加性能结论更可靠。
从 Windows 连接
原 Windows 记录连接的是 192.168.1.50 上的 Share,使用该机器的 Administrator 账户,和上面 Linux 的 data 共享不是同一个目标。服务名、地址、账户及盘符可以保留;原命令里的明文密码换成 *:
net start lanmanworkstation
net start lmhosts
net use Z: \\192.168.1.50\Share * /user:192.168.1.50\Administrator这两条 net start 在服务未运行时才需要,可能要求管理员终端;lmhosts 是旧记录里的 TCP/IP NetBIOS Helper,不应把它视为所有现代 SMB 连接的必要条件。
在 Windows 命令提示符中映射 data 共享,使用 * 让密码交互输入:
net use Z: \\HOST\data * /user:TARGET_USER /persistent:yes
net use早期 Windows 记录把密码直接放在连接命令中,这里的示例改用 * 交互输入。原来的工作站服务启动命令也保留在上述记录里;遇到服务未运行时,可以在管理员命令提示符执行 net start lanmanworkstation 后重试。
这里 data 是共享段名,不是 Linux 完整目录。换成 media 或 develop 就连接另外两个共享。Microsoft net use 文档说明了交互式密码、持久映射和删除连接的语法。
验证时,在共享内新建一个测试文件,确认 Linux 端能看到;再从 Linux 修改该文件,检查 Windows 端是否可读取。这个双向检查比只看到盘符更能说明权限是否正确。
关闭使用该盘符的文件和程序以后,可以删除映射并重新连接:
net use Z: /delete
net use Z: \\HOST\data * /user:TARGET_USER /persistent:yes遇到同一服务器使用不同账户的凭据冲突,先用 net use 查看其他共享连接,再逐个处理对应连接;只删 Z 盘不一定清除了该服务器的全部会话,不要直接删除所有服务器的映射。
访问失败时查哪里
服务端先看日志:
sudo journalctl -u smbd.service -b -n 100 --no-pager
testparm -s
sudo pdbedit -L发行版配置也可能把认证或客户端错误写入 /var/log/samba/,按 testparm 显示的日志配置继续检查。认证失败时确认账户已加入 Samba、Windows 使用的是预期账户;能读不能写时检查 read only、目录属主、上级目录权限和挂载是否只读。原笔记提到过 exFAT 写入问题,但没有保留结论,不能把普通 Linux 文件系统上的 chown 行为直接套到所有挂载类型。