Samba 文件共享
适用于 CentOS Stream 9 & 10 / AlmaLinux 9.x & 10.x / Rocky Linux 9.x & 10.x
Samba 在 EL 系统上实现 SMB/CIFS 协议,让你的 Linux 服务器对外提供文件共享,并能与 Windows、macOS 和其他 Linux 客户端互通。如果说 NFS 是 Linux/Unix 之间的共享首选,那么 Samba 就是面向混合环境(尤其有 Windows 设备)的补充方案。
- 安装 Samba 服务端与客户端工具
- 编辑
/etc/samba/smb.conf并用testparm校验 - 创建 Samba 用户与共享目录
- 正确处理 SELinux 布尔值和文件标签
- 配置 firewalld、启动服务并从客户端测试
- 排查权限被拒、看不到共享、SMB1 等常见问题
- 一台运行 EL 9.x 或 EL 10.x 的系统
- 具有
sudo权限的用户账号 - 了解基本的 文件权限 概念
各发行版中的版本
Section titled “各发行版中的版本”安装 Samba
Section titled “安装 Samba”samba 提供服务端守护进程,samba-client 提供 smbclient 等测试工具。
$ sudo dnf install samba samba-client安装完成后会引入两个守护进程:
smb(smbd):处理文件共享和认证nmb(nmbd):提供 NetBIOS 名称解析与网络浏览(老式 Windows 网络邻居)
创建共享目录
Section titled “创建共享目录”这里用 /srv/samba/shared 作为示例,并把它开放给 smbgroup 组。先创建这个组:
$ sudo groupadd smbgroup再创建目录并设置 POSIX 权限(此时 chgrp 用到的组已经存在):
$ sudo mkdir -p /srv/samba/shared$ sudo chmod 2770 /srv/samba/shared$ sudo chgrp smbgroup /srv/samba/shared配置 smb.conf
Section titled “配置 smb.conf”主配置文件是 /etc/samba/smb.conf,分为全局段 [global] 和若干共享段。下面是一个最小可用配置。
[global] workgroup = WORKGROUP server string = Samba Server on EL security = user server min protocol = SMB2 map to guest = Never
[shared] comment = Shared Folder path = /srv/samba/shared browseable = yes writable = yes valid users = @smbgroup各项含义:
| 配置项 | 说明 |
|---|---|
workgroup | 工作组名,需与 Windows 客户端一致(默认 WORKGROUP) |
security = user | 要求用户名+密码认证(EL 默认推荐) |
server min protocol = SMB2 | 禁用不安全的 SMB1,强制最低 SMB2 |
path | 共享对应的本地目录 |
browseable = yes | 共享在网络浏览列表中可见 |
writable = yes | 允许写入(等价于 read only = no) |
valid users | 允许访问的用户/组,@smbgroup 表示该组所有成员 |
修改后务必用 testparm 校验语法:
$ testparmLoaded services file OK.Server role: ROLE_STANDALONE只要看到 Loaded services file OK 就说明语法没有问题。
创建 Samba 用户
Section titled “创建 Samba 用户”Samba 用户必须先是系统用户,然后再用 smbpasswd 单独设置 Samba 密码。Samba 密码与系统登录密码相互独立。
-
创建系统用户(这里用
-M不创建家目录、-s /sbin/nologin禁止登录,仅用于文件共享):创建系统用户 $ sudo useradd -M -s /sbin/nologin -G smbgroup alice -
为该用户设置 Samba 密码:
设置 Samba 密码 $ sudo smbpasswd -a alice交互输出 New SMB password:Retype new SMB password:Added user alice. -
确认用户已加入 Samba 数据库:
列出 Samba 用户 $ sudo pdbedit -L
配置 SELinux
Section titled “配置 SELinux”EL 系统默认启用 SELinux,它会阻止 Samba 访问没有正确标签的目录。这一步是新手最容易踩坑的地方,请不要用关闭 SELinux 来”解决”问题。
打开读写布尔值
Section titled “打开读写布尔值”让 Samba 能够读写它导出的目录:
$ sudo setsebool -P samba_export_all_rw on如果共享只读,可用:
$ sudo setsebool -P samba_export_all_ro on为自定义路径打标签
Section titled “为自定义路径打标签”对于不在默认位置的自定义目录,需要赋予 samba_share_t 类型标签:
$ sudo semanage fcontext -a -t samba_share_t "/srv/samba/shared(/.*)?"$ sudo restorecon -Rv /srv/samba/sharedRelabeled /srv/samba/shared from unconfined_u:object_r:var_t:s0 to unconfined_u:object_r:samba_share_t:s0firewalld 内置了 samba 服务定义(包含所需端口),直接放行即可:
$ sudo firewall-cmd --add-service=samba --permanent$ sudo firewall-cmd --reload确认规则已生效:
$ sudo firewall-cmd --list-services启用并立即启动两个守护进程,让它们开机自启:
$ sudo systemctl enable --now smb nmb查看运行状态:
$ sudo systemctl status smb从本机列出共享
Section titled “从本机列出共享”用 smbclient 以指定用户身份列出服务器上的共享,验证服务端可用:
$ smbclient -L //localhost -U alice Sharename Type Comment --------- ---- ------- shared Disk Shared Folder从 Linux 客户端挂载
Section titled “从 Linux 客户端挂载”在另一台 Linux 机器上,用 cifs 文件系统类型挂载共享。先安装挂载工具:
$ sudo dnf install cifs-utils$ sudo mkdir -p /mnt/samba$ sudo mount -t cifs //server/shared /mnt/samba -o username=alice挂载时会提示输入 Samba 密码。
使用 credentials 文件(更安全)
Section titled “使用 credentials 文件(更安全)”在命令行或 fstab 里写明文密码不安全。更好的做法是把凭据放进受保护的文件:
$ sudo install -m 600 /dev/null /etc/samba/creds-alice编辑 /etc/samba/creds-alice:
username=alicepassword=你的Samba密码然后挂载时引用它:
$ sudo mount -t cifs //server/shared /mnt/samba -o credentials=/etc/samba/creds-alice要开机自动挂载,可在 /etc/fstab 中添加:
//server/shared /mnt/samba cifs credentials=/etc/samba/creds-alice,_netdev 0 0可选:匿名访客共享
Section titled “可选:匿名访客共享”如果某个共享需要无需密码即可访问(如公共只读资料区),可以开启访客访问。修改 [global] 让映射在认证失败时回退到访客,并在共享段加上 guest ok = yes:
[global] map to guest = Bad User
[public] comment = Public Read-Only path = /srv/samba/public browseable = yes read only = yes guest ok = yes访客访问对应的本地用户通常是 nobody,请确保目录的 POSIX 权限和 SELinux 标签允许该用户读取。
权限被拒(写入失败)
Section titled “权限被拒(写入失败)”按顺序排查三层权限:
-
SELinux:确认布尔值已开、目录已打
samba_share_t标签。查看目录标签 $ ls -dZ /srv/samba/shared确认布尔值 $ getsebool samba_export_all_rw -
POSIX 权限:用户必须对目录有写权限(检查组所有权和模式位)。
-
valid users:确认
smb.conf里valid users包含了该用户或其所属组。
客户端看不到共享
Section titled “客户端看不到共享”- 确认
browseable = yes,且smb与nmb都在运行。 - 用
smbclient -L //server -U <user>直接列出共享,绕过浏览机制定位问题。 - 检查 firewalld 是否放行了
samba服务。
老设备连不上(SMB1 被禁用)
Section titled “老设备连不上(SMB1 被禁用)”现代 Samba 默认禁用不安全的 SMB1。某些老旧设备(如老款 NAS、打印机)只支持 SMB1,会连接失败。请优先升级设备固件。如确实必须兼容,可在 [global] 临时降低最低协议版本:
[global] server min protocol = NT1确认你用的是 smbpasswd 设置的 Samba 密码,而不是系统登录密码。两者相互独立。可用 sudo pdbedit -L 确认用户是否存在于 Samba 数据库中。
- NFS 与挂载 —— Linux/Unix 之间的共享方案
- 文件权限与 ACL —— 理解 POSIX 权限层
- SELinux 入门 —— 排查文件标签与布尔值
man smb.conf/man smbclient