跳转到内容

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 权限的用户账号
  • 了解基本的 文件权限 概念
版本数据实时来自 pkgseek.com

samba 提供服务端守护进程,samba-client 提供 smbclient 等测试工具。

安装 Samba
$ sudo dnf install samba samba-client

安装完成后会引入两个守护进程:

  • smb(smbd):处理文件共享和认证
  • nmb(nmbd):提供 NetBIOS 名称解析与网络浏览(老式 Windows 网络邻居)

这里用 /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

主配置文件是 /etc/samba/smb.conf,分为全局段 [global] 和若干共享段。下面是一个最小可用配置。

/etc/samba/smb.conf
[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 校验语法:

校验配置语法
$ testparm
输出(节选)
Loaded services file OK.
Server role: ROLE_STANDALONE

只要看到 Loaded services file OK 就说明语法没有问题。

Samba 用户必须先是系统用户,然后再用 smbpasswd 单独设置 Samba 密码。Samba 密码与系统登录密码相互独立。

  1. 创建系统用户(这里用 -M 不创建家目录、-s /sbin/nologin 禁止登录,仅用于文件共享):

    创建系统用户
    $ sudo useradd -M -s /sbin/nologin -G smbgroup alice
  2. 为该用户设置 Samba 密码:

    设置 Samba 密码
    $ sudo smbpasswd -a alice
    交互输出
    New SMB password:
    Retype new SMB password:
    Added user alice.
  3. 确认用户已加入 Samba 数据库:

    列出 Samba 用户
    $ sudo pdbedit -L

EL 系统默认启用 SELinux,它会阻止 Samba 访问没有正确标签的目录。这一步是新手最容易踩坑的地方,请不要用关闭 SELinux 来”解决”问题。

让 Samba 能够读写它导出的目录:

允许 Samba 读写共享(持久)
$ sudo setsebool -P samba_export_all_rw on

如果共享只读,可用:

只读场景
$ sudo setsebool -P samba_export_all_ro on

对于不在默认位置的自定义目录,需要赋予 samba_share_t 类型标签:

设置并应用 SELinux 文件上下文
$ sudo semanage fcontext -a -t samba_share_t "/srv/samba/shared(/.*)?"
$ sudo restorecon -Rv /srv/samba/shared
restorecon 输出
Relabeled /srv/samba/shared from unconfined_u:object_r:var_t:s0 to unconfined_u:object_r:samba_share_t:s0

firewalld 内置了 samba 服务定义(包含所需端口),直接放行即可:

放行 Samba 服务
$ sudo firewall-cmd --add-service=samba --permanent
$ sudo firewall-cmd --reload

确认规则已生效:

查看放行的服务
$ sudo firewall-cmd --list-services

启用并立即启动两个守护进程,让它们开机自启:

启动 smb 和 nmb
$ sudo systemctl enable --now smb nmb

查看运行状态:

检查服务状态
$ sudo systemctl status smb

smbclient 以指定用户身份列出服务器上的共享,验证服务端可用:

列出共享
$ smbclient -L //localhost -U alice
输出(节选)
Sharename Type Comment
--------- ---- -------
shared Disk Shared Folder

在另一台 Linux 机器上,用 cifs 文件系统类型挂载共享。先安装挂载工具:

安装 CIFS 工具
$ sudo dnf install cifs-utils
挂载共享
$ sudo mkdir -p /mnt/samba
$ sudo mount -t cifs //server/shared /mnt/samba -o username=alice

挂载时会提示输入 Samba 密码。

在命令行或 fstab 里写明文密码不安全。更好的做法是把凭据放进受保护的文件:

创建凭据文件
$ sudo install -m 600 /dev/null /etc/samba/creds-alice

编辑 /etc/samba/creds-alice

/etc/samba/creds-alice
username=alice
password=你的Samba密码

然后挂载时引用它:

用凭据文件挂载
$ sudo mount -t cifs //server/shared /mnt/samba -o credentials=/etc/samba/creds-alice

要开机自动挂载,可在 /etc/fstab 中添加:

/etc/fstab
//server/shared /mnt/samba cifs credentials=/etc/samba/creds-alice,_netdev 0 0

如果某个共享需要无需密码即可访问(如公共只读资料区),可以开启访客访问。修改 [global] 让映射在认证失败时回退到访客,并在共享段加上 guest ok = yes

/etc/samba/smb.conf(节选)
[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 标签允许该用户读取。

按顺序排查三层权限:

  1. SELinux:确认布尔值已开、目录已打 samba_share_t 标签。

    查看目录标签
    $ ls -dZ /srv/samba/shared
    确认布尔值
    $ getsebool samba_export_all_rw
  2. POSIX 权限:用户必须对目录有写权限(检查组所有权和模式位)。

  3. valid users:确认 smb.confvalid users 包含了该用户或其所属组。

  • 确认 browseable = yes,且 smbnmb 都在运行。
  • smbclient -L //server -U <user> 直接列出共享,绕过浏览机制定位问题。
  • 检查 firewalld 是否放行了 samba 服务。

现代 Samba 默认禁用不安全的 SMB1。某些老旧设备(如老款 NAS、打印机)只支持 SMB1,会连接失败。请优先升级设备固件。如确实必须兼容,可在 [global] 临时降低最低协议版本:

仅在不得已时使用
[global]
server min protocol = NT1

确认你用的是 smbpasswd 设置的 Samba 密码,而不是系统登录密码。两者相互独立。可用 sudo pdbedit -L 确认用户是否存在于 Samba 数据库中。