资讯动态

Linux 搭建 Samba 服务器实现跨平台文件共享

发布时间:2026/9/29 12:56:13 来源:尧图企业网站定制
前言NFS 好用但Windows 访问 NFS 极其麻烦要装客户端、要配身份映射、中文还容易乱码。如果共享目录需要 Windows 同事直接双击打开那就得上Samba。Samba 是 SMB/CIFS 协议的开源实现Windows 资源管理器原生支持Linux 和 macOS 也能挂载。本文讲清楚怎么搭、怎么配权限以及最容易卡住人的 SELinux 问题。环境Rocky Linux 8 / CentOS 7 服务端Ubuntu 差异已标注Windows 10 和 Linux 客户端验证。一、安装# Rocky / CentOS dnf install -y samba samba-client # Ubuntu / Debian # apt install -y samba # 确认版本 smbd -V二、先搞定用户和目录Samba 的账号体系和 Linux 系统账号是两套这点必须先理解否则后面一定踩坑。2.1 创建系统用户# -M 不创建家目录-s 指定不可登录的 shell useradd -M -s /sbin/nologin smbuser # 也可以直接在创建时同时加入 samba # useradd -M -s /sbin/nologin smbuser为什么要建系统用户Samba 需要一个系统账号来映射文件属主。用户本身不需要能登录系统所以 shell 设成/sbin/nologin更安全。2.2 设置 Samba 密码smbpasswd -a smbuser # 输入两次密码这是最关键的一步useradd建的密码 Samba不认必须在 Samba 自己的密码库/var/lib/samba/private/passdb.tdb里单独设一次。pdbedit -L # 查看已添加的 Samba 用户2.3 准备共享目录mkdir -p /data/samba_share chown -R smbuser:smbuser /data/samba_share chmod 775 /data/samba_share三、配置 smb.conf先备份这个习惯很重要很多发行版有默认配置cp /etc/samba/smb.conf /etc/samba/smb.conf.bak/etc/samba/smb.conf内容如下 —— 我直接给一份精简可用的完整配置比在默认的几百行里找地方插入清晰得多[global] workgroup WORKGROUP server string Samba Server %v netbios name fileserver security user map to guest bad user # ---- 中文文件名不乱码的关键 ---- unix charset UTF-8 dos charset CP936 display charset UTF-8 # ---- 日志 ---- log file /var/log/samba/log.%m max log size 1000 [share] comment Public Share path /data/samba_share browseable yes writable yes valid users smbuser create mask 0664 directory mask 0775参数说明参数作用security user用 Samba 自己的用户库认证最常用map to guest bad user用户名不存在时当访客处理配合guest ok yes做匿名共享valid users白名单只有这里列出的用户能访问。强烈建议写browseable是否在网络邻居里可见writable是否可写等价于read only nocreate mask/directory mask新建文件的权限掩码unix charset UTF-8中文乱码的根源就在这行务必设成 UTF-8校验配置改完一定要用testparm校验能提前发现语法错误testparm -s它会打印最终生效的配置如果有语法问题会直接报错。四、SELinux 配置90% 的人栽在这里如果你确认共享目录死活访问不了先看这里。即使smb.conf写对了、目录权限 777 了SELinux 依然会拦。因为 SELinux 看的是安全上下文不是传统权限位。getenforce # 先看状态 # ① 允许 Samba 读写共享目录 setsebool -P samba_export_all_rw on # ② 给共享目录打上正确的 SELinux 标签 semanage fcontext -a -t samba_share_t /data/samba_share(/.*)? restorecon -Rv /data/samba_share # ③ 验证 ls -Z /data/samba_share # 输出里应该是 samba_share_t比如 # unconfined_u:object_r:samba_share_t:s0 file.txtsemanage命令来自policycoreutils-python-utils包没有的话先装dnf install -y policycoreutils-python-utils注意顺序semanage fcontext只是写入规则必须再执行restorecon才会真正应用到文件上。这两步缺一不可。五、启动服务与防火墙systemctl enable --now smb nmb # Ubuntu 上服务名是 smbd / nmbd # systemctl enable --now smbd nmbdsmb和nmb的区别smb提供文件共享服务nmb负责 NetBIOS 名称解析就是让 Windows 的网络邻居能看到你的机器名。只启 smb 不影响访问但网络邻居里可能看不见建议两个都启。放行防火墙firewall-cmd --permanent --add-servicesamba firewall-cmd --reload # samba 这个 service 已经包含了 137/138/139/445不用单独加端口六、客户端访问6.1 Windows资源管理器地址栏输入\\192.168.1.10\share或者用命令行映射网络驱动器net use Z: \\192.168.1.10\share /user:smbuser踩坑Windows 会缓存凭据。如果第一次密码输错了后面怎么改都不对。清缓存net use * /delete /y然后到「控制面板 → 凭据管理器 → Windows 凭据」里把对应条目删掉。6.2 Linux 客户端dnf install -y cifs-utils mkdir -p /mnt/smb mount -t cifs //192.168.1.10/share /mnt/smb \ -o usernamesmbuser,password你的密码,vers3.0,iocharsetutf8几个参数别漏vers3.0Windows 10 1709 之后默认禁用了 SMBv1不指定版本可能协商失败。老设备用vers2.0很老的 NAS 才需要vers1.0。iocharsetutf8中文文件名正常显示。开机自动挂载建议把密码放独立文件而不是写在 fstab 里fstab 是全局可读的cat /etc/samba/cred EOF usernamesmbuser password你的密码 EOF chmod 600 /etc/samba/credfstab 加一行//192.168.1.10/share /mnt/smb cifs credentials/etc/samba/cred,vers3.0,iocharsetutf8,_netdev 0 0验证mount -a df -h | grep smb七、常见问题排查7.1 输入密码后提示拒绝访问或反复弹认证框排查顺序# ① Samba 用户真的加了吗 pdbedit -L # ② valid users 里有这个用户吗 testparm -s | grep -A5 \[share\] # ③ 看日志日志是最直接的线索 tail -f /var/log/samba/log.smbuser7.2 能连上但提示没有权限访问按顺序查ls -ld /data/samba_share # 文件系统权限 ls -Z /data/samba_share # SELinux 上下文应为 samba_share_t getsebool samba_export_all_rw # 应为 on如果ls -Z显示default_t或user_home_t那就是 SELinux 没配对回到第四节重做。7.3 中文文件名乱码服务端确认unix charset UTF-8客户端挂载加iocharsetutf8。Windows 那边如果还有问题通常是老系统的编码问题dos charset CP936是为兼容老客户端准备的。7.4 网络邻居里看不到服务器systemctl status nmb # nmb 起了吗如果是跨网段Windows 和 Samba 不在同一广播域NetBIOS 广播过不去这是正常现象直接用\\IP\share访问即可。7.5 共享目录里有软链接失效Samba 默认禁止跟随符号链接安全考虑。确实需要的话在[share]段加follow symlinks yes wide links yes unix extensions no但请注意wide links yes有安全风险符号链接可以指向目录外的文件等于绕过了共享限制。只在你完全信任共享用户时开。八、进阶多用户隔离共享每个人只能访问自己的目录需要[homes]段[homes] comment Home Directories browseable no writable yes valid users %S create mask 0600 directory mask 0700%S是变量代表当前登录的用户名。用户连上来默认看到的就是自己的家目录互相隔离。前提是每个用户都要执行过smbpasswd -a。环节关键点用户useradd后必须再smbpasswd -a配置/etc/samba/smb.conf改完testparm -s校验SELinuxsetsebool -P samba_export_all_rw onsemanage fcontextrestorecon服务smb文件nmb名称解析防火墙--add-servicesambaWindows凭据缓存用net use * /delete清Linux 挂载vers3.0,iocharsetutf8一句话记住排查顺序用户库pdbedit→ 配置白名单valid users→ 文件系统权限 → SELinux 上下文 → 看日志。前四个都过了还不行日志一定会告诉你原因。作者水平有限文中如有错误欢迎评论区指正。觉得有用的话点个赞再走。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑