Linux Samba 共享配置与 Windows 网络驱动器映射

太阳作者太阳
原创内容采用 CC-4.0 协议发布,转载请注明出处
SambaSMBLinux

原来的 Samba 配置把文件分成 datamediadevelop 三个共享,分别指向数据目录、媒体盘和开发目录。账户通过 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 dex

pdbedit -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.* 和回环来源,并把新文件和目录权限设为 06640775。下面恢复这些实际选项;已经作为域控制器或域成员运行的服务器不能直接套用:

[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 = dex

datamedia 沿用原来的 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 -ltnp

testparm 不能证明目录可写或客户端可连接。核对 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_RCVBUFSO_SNDBUF 的做法不作为新配置默认值。

其他参数也要按本机版本查默认值、适用范围和是否仍被支持。先运行 smbd --versiontestparm -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 完整目录。换成 mediadevelop 就连接另外两个共享。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 行为直接套到所有挂载类型。