文章列表
4 分钟阅读
更新于

Samba 安装与配置指南:Linux 和 Windows 文件共享


系列:文件共享与传输

第 3 / 5 篇

  1. 用 vsftpd 在 Ubuntu 上搭建文件共享服务器
  2. SCP 和 SFTP 使用指南:远程文件传输基础
  3. Samba 安装与配置指南:Linux 和 Windows 文件共享
  4. NFS 安装与配置指南:Linux 系统间文件共享
  5. Syncthing 异地同步指南:多设备文件同步不带公网 IP

背景

局域网内多台设备之间传文件,U 盘太麻烦,FTP 需要客户端(参见 用 vsftpd 在 Ubuntu 上搭建文件共享服务器),SCP 主要用于命令行环境(详见 SCP 和 SFTP 使用指南:远程文件传输基础),Windows 原生支持差。如果有一台 Linux 服务器,想让 Windows 和 macOS 都能像访问本地文件夹一样读写文件,Samba 是最成熟的选择。

Samba 实现了 SMB/CIFS 协议,可以把 Linux 目录共享出来,在 Windows 的文件资源管理器里直接映射为网络驱动器。本文基于 Ubuntu 22.04,从零安装 Samba,配置一个可供多用户读写的共享目录,并处理常见的权限问题。

前置条件:一台 Ubuntu 22.04 服务器,已配置静态 IP,SSH 能正常登录。

步骤

1. 安装 Samba

Terminal window
sudo apt update
sudo apt install samba -y

安装完成后检查版本:

Terminal window
smbd --version

Samba 服务会自动启动,可以用 systemctl 确认状态:

Terminal window
sudo systemctl status smbd

如果显示 active (running),安装就完成了。更多安装细节参考 Samba 官方 Wiki

2. 创建共享目录

在 /srv 下创建一个共享目录,这里以 shared 为例:

Terminal window
sudo mkdir -p /srv/shared
sudo chmod 2775 /srv/shared

2775 中的 2 是 setgid 位,保证在该目录下创建的新文件继承目录的所属组,方便多用户协作。

3. 创建 Samba 用户

Samba 使用独立的用户认证体系,但用户必须先在系统中存在。为共享目录创建一个专用系统用户,不分配登录 shell:

Terminal window
sudo useradd -M -s /usr/sbin/nologin shareduser

然后将其加入一个组(这里用 sambashare):

Terminal window
sudo groupadd sambashare
sudo usermod -aG sambashare shareduser

将共享目录的所属组改为 sambashare

Terminal window
sudo chown -R :sambashare /srv/shared

现在给 shareduser 设置 Samba 密码:

Terminal window
sudo smbpasswd -a shareduser

输入两次密码,这个密码独立于系统登录密码。Samba 用户管理参考 smbpasswd 手册

如果已有系统用户需要访问共享,直接用 sudo smbpasswd -a username 添加即可,不需要重复创建系统用户。

4. 配置共享

编辑 Samba 配置文件:

Terminal window
sudo nano /etc/samba/smb.conf

在文件末尾追加以下内容:

[Shared]
comment = Shared Folder
path = /srv/shared
browseable = yes
read only = no
valid users = @sambashare
force group = sambashare
create mask = 0664
directory mask = 2775

关键参数说明:

  • valid users = @sambashare:只有属于 sambashare 组的用户能访问
  • force group = sambashare:强制所有新文件归属这个组
  • create maskdirectory mask:确保新建文件和目录的权限一致

保存后检查配置语法:

Terminal window
testparm

会列出生效的配置,确认无误后重启服务:

Terminal window
sudo systemctl restart smbd

5. 配置防火墙

如果启用了 ufw,需要放行 Samba 端口:

Terminal window
sudo ufw allow samba

allow samba 是 ufw 预定义的规则,相当于放行 139/tcp、445/tcp、137-138/udp。更多信息见 Samba 端口说明

6. 从 Windows 访问共享

在文件资源管理器地址栏输入:

\\192.168.x.x\Shared

将 IP 替换为服务器的实际地址。会弹出登录窗口,输入之前设置的 Samba 用户名和密码。连接成功后可以右键选择“映射网络驱动器”,之后就能像本地盘一样使用了。

macOS 在 Finder 中按 Command+K,输入 smb://192.168.x.x/Shared 连接。

7. 添加只读用户

实际场景中可能需要给某些用户只读权限。创建另一个共享配置:

[SharedReadOnly]
comment = Read Only Share
path = /srv/shared
browseable = yes
read only = yes
valid users = @sambashare

read only = yes 会覆盖底层文件系统的写权限,即使用户对目录有写权限,通过 Samba 也只能读取。

重启服务后,用户访问 \\IP\SharedReadOnly 就只是只读。

常见问题

1. Windows 提示“找不到网络路径”

先确认 smbd 服务运行正常,端口监听无异常:

Terminal window
sudo systemctl status smbd
sudo ss -tlnp | grep -E '139|445'

如果服务正常,检查防火墙是否放行了 Samba 端口(sudo ufw status)。现代 Samba 默认使用 SMB 2/3 协议,如果客户端是较新的 Windows,不需要启用已废弃的 SMB 1.0。如果确实有旧系统必须使用 SMB1,可以在 /etc/samba/smb.conf[global] 段添加 server min protocol = SMB2 强制使用 SMB2 或更高版本;若必须启用 SMB 1.0,请注意该协议存在已知安全漏洞,仅作为最后手段并在隔离网络中使用。

2. 能连接但提示“拒绝访问”

最常见的原因是 valid users 配置没包含当前用户。检查用户在不在对应组内:

Terminal window
groups username

如果不在目标组,用 sudo usermod -aG sambashare username 添加,然后重新连接。还可能是共享路径的文件系统权限不足,确认目录的组权限为 rwx 或至少 r-x

Terminal window
ls -ld /srv/shared

总结

Samba 配置的核心是用户、权限和共享定义三者的对齐。系统用户与 Samba 用户分离,通过组统一管理目录访问,再配合 force group 和权限掩码保证协作写入的一致性。记住每次改完配置后跑一次 testparm,能省掉很多排错时间。