linux文件夹共享首选samba(跨平台)或nfs(linux间高效共享),windows访问必须用samba,linux互访优先nfs,kvm中windows客户机推荐virtiofs;关键配置如path、writable、valid users、browsable等须准确,权限建议chmod 2775配合sgid保障组协作,配置后必先testparm验证再重启服务,并开放防火墙端口及处理selinux策略。

直接说结论:Linux 设置文件夹共享,**首选 Samba(跨平台)或 NFS(Linux 间高效共享)**,具体选哪个取决于你的客户端类型。Windows 访问必须用 Samba;两台 Linux 互访,NFS 更轻量、权限更自然;KVM 虚拟机里 Windows 客户机想挂载主机目录,用 virtiofs 比 Samba 更快更稳。
怎么选协议:Samba 还是 NFS?
别凭感觉选,看实际场景:
- 对方是 Windows 或 macOS —— 只能用
smbd(Samba),nfsd默认不被识别 - 对方是另一台 Linux(比如服务器集群、开发机互传)—— 优先配
nfs-kernel-server,不用额外用户认证,UID/GID 映射直通 - KVM + Windows 客户机 —— 别折腾 Samba 共享,改用
virtiofs,它走 vhost-user 通道,性能接近本地磁盘,且无需网络配置 - 需要访客免密访问(比如局域网打印机共享)—— Samba 的
guest ok = yes可快速实现;NFS 没真正意义上的“访客”,得靠no_root_squash(危险!不推荐)
smb.conf 里哪些配置项不能写错
smb.conf 看似简单,但几个关键参数一旦写反或遗漏,Windows 就连不上,或者能连但无法写入:
-
path = /srv/samba/shared:路径必须真实存在,且 Samba 进程(smbd)有读取权限(检查ls -ld /srv/samba/shared,组要包含sambashare或nogroup) -
writable = yes和read only = no必须同时设对 —— 前者控制 Samba 层写开关,后者是旧式写法,两者冲突时以read only为准 -
valid users = @sambashare:用@组名比列一堆用户名更易维护;确保系统用户已加入该组(usermod -aG sambashare alice),再跑smbpasswd -a alice -
create mask = 0664和directory mask = 0775:决定新建文件/目录的权限。如果客户端上传后权限不对(比如 Windows 用户创建的文件变成0600),就是这里没调好 - 千万别漏
browsable = yes—— 否则共享名不会出现在 Windows “网络”里,只能靠\192.168.x.xshared手动输入地址访问
为什么 chmod 2775 比 chmod 777 更安全
共享目录权限不是越开放越好。chmod 777 /srv/samba/shared 表面省事,实则埋雷:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 新文件默认继承父目录的组,但不会自动属于
sambashare组 —— 导致其他组员无法修改别人创建的文件 -
chmod 2775中的2是 SGID 位:任何人在该目录下新建文件或子目录,自动继承父目录的组(sambashare),且目录有rwx,文件有rw- - 配合
chgrp sambashare /srv/samba/shared和usermod -aG sambashare alice,才能保证“组内协作”真正生效 - SELinux 启用时(如 CentOS/RHEL),还需执行
sudo semanage fcontext -a -t samba_share_t "/srv/samba/shared(/.*)?"并restorecon -Rv /srv/samba/shared,否则即使权限全开也会被拦截
testparm 和 systemctl restart smbd 之间必须做这一步
改完 smb.conf 后,别急着重启服务 —— 先验证语法:
sudo testparm -v(加 -v 看详细解析)会输出所有生效配置,并在出错行标红。常见失败点:
- 拼错关键字,比如把
writable写成writablee - 共享段名含空格或中文(Windows 访问时可能解析失败),应写成
[shared_docs]而非[Shared Docs] - 路径中用了符号链接且没配
follow symlinks = yes,testparm会警告“path not found” - 全局段漏了
security = user(Samba 4.12+ 默认值,但老版本或自定义配置可能失效)
只有 testparm 不报错,才执行 sudo systemctl restart smbd nmbd(nmbd 负责 NetBIOS 名称解析,Windows 浏览网络邻居依赖它)。
真正容易被忽略的,是防火墙和 SELinux 的双重拦截 —— 即使配置全对、服务启动成功,ufw status 或 firewall-cmd --list-ports 里没放开 137-139/tcp 和 445/tcp,Windows 就连不上;而 SELinux 在 RHEL/CentOS 上默认启用,setsebool -P samba_export_all_rw=1 只是临时绕过,长期要用 semanage 配策略。










