跳转到内容
搜索 RunEntLinux 文档

仅搜索 RunEntLinux 通用文档,各发行版文档使用各自的搜索入口。

    浏览当前文档目录

    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.conf 里 valid users 包含了该用户或其所属组。

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

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

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

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