ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CentOS与Mac文件共享:Samba/NFS/SSHFS配置实战指南

CentOS与Mac文件共享:Samba/NFS/SSHFS配置实战指南 1. 先搞清楚你到底需要哪种共享方式先说个现象不少朋友在CentOS和Mac之间传文件第一反应是U盘拷贝或者开个FTP甚至有人直接在虚拟机里装个图形界面拖拽结果小文件还行大文件动不动就断目录层级一深就乱。其实局域网内两台机器互相访问文件成熟方案就那么几个关键是你要先想明白自己的使用场景。这里说的CentOS共享Mac文件我理解包含两层意思一是CentOS作为服务端把目录共享出来让Mac通过访达Finder直接访问二是反过来让CentOS能挂载Mac上分享的目录。绝大多数人实际遇到的是第一种也就是服务器上跑着CentOS可能是虚拟机也可能是一台闲置PC编译产物、日志、下载的镜像文件都在上面Mac是日常工作机希望像访问本地磁盘一样访问远程目录。如果你只是想偶尔传个文件scp一条命令就够了没必要搞共享。但如果你是想在Mac上直接编辑CentOS里的代码工程、把构建产物拖到桌面、或者让两台机器保持目录同步那就必须上共享协议了。主流的选择有三个SambaSMB协议、NFS、SSHFS/SFTP。我用一张表先给你看清楚它们的本质区别免得你选错方向折腾半天方案协议Mac端体验适合场景主要坑点SambaSMBFinder原生支持左侧边栏直接出现日常文件编辑、拷贝、媒体播放配置项多SELinux和防火墙容易拦截NFSNFS原生支持mount_nfs大数据量、频繁读写、服务器间共享跨越网段或macOS版本升级时兼容性需要调参数SSHFSSFTP需安装FUSE挂载后如本地目录习惯SSH、追求快速部署丢包率高时不稳重连要手动处理我的建议很简单日常桌面访问用Samba追求传输性能且有固定内网环境用NFS偶尔应急用SSHFS。这篇文章重点拆解Samba的完整配置链路因为它在CentOS和Mac这对组合里踩坑最多、配置细节也最琐碎我会把NFS和SSHFS作为备选方案讲清楚。2. 环境准备IP、防火墙、SELinux这三件事不先做后面全是玄学很多人配置完Samba发现连不上第一反应是改配置文件改来改去还是不行最后发现是防火墙在作怪。所以我建议按顺序先把地基打好。2.1 确认两台机器的网络互通和IP规划在CentOS上执行ip addr show或者旧命令ifconfig记下这台机器的局域网IP比如192.168.31.206。然后在Mac上打开终端输入ping 192.168.31.206能通再继续。这一步看似废话但我真的遇到过有人把CentOS网卡配成了10.0.2.xVirtualBox默认NAT网段Mac在192.168.31.x网段两边完全不在一个世界怎么配Samba都没用。这里特别提醒一下虚拟机的情况如果你在Mac上用VirtualBox或VMware Fusion跑CentOS默认NAT模式下宿主机可以访问虚拟机但局域网里其他设备访问不了。如果想让Mac本机和CentOS互通NAT就够了但如果你想手机、平板、其他电脑都能访问必须把虚拟网络改成桥接模式Bridge让CentOS直接获取局域网IP。2.2 防火墙必须显式放行服务端口而不是关防火墙CentOS 7及以后默认用firewalldSamba涉及四个端口和服务137/udp、138/udp、139/tcp、445/tcp。最省事的做法是直接放行samba服务systemctl start firewalld firewall-cmd --permanent --zonepublic --add-servicesamba firewall-cmd --reload注意firewall-cmd --add-servicesamba这个服务名是firewalld内置的它会把上面那四个端口一起放行不用一个个加。检查是否生效firewall-cmd --list-services如果你用的不是firewalld而是iptables那就手动加规则iptables -I INPUT -p tcp --dport 139 -j ACCEPT iptables -I INPUT -p tcp --dport 445 -j ACCEPT iptables -I INPUT -p udp --dport 137 -j ACCEPT iptables -I INPUT -p udp --dport 138 -j ACCEPT service iptables save有人说我直接把防火墙关了行不行行是行但如果你这台CentOS还跑着别的服务全开等于裸奔。只放行所需端口才是正规做法排查问题时也更容易定位。2.3 SELinux最容易被忽略的隐形拦路虎CentOS 7默认SELinux是Enforcing状态。Samba的进程smbd在SELinux里有一套独立的策略如果没给共享目录打上正确的标签客户端会看到共享名称但一访问就报没有权限或者干脆连不上。判断你当前SELinux状态getenforce如果输出Enforcing你需要给共享目录设置samba共享所需的上下文标签semanage fcontext -a -t samba_share_t /data/share(/.*)? restorecon -Rv /data/sharerestorecon会递归重建安全上下文这步不执行前面那条规则等于白发。如果提示semanage命令不存在需要先装policycoreutils-python-utils:yum install -y policycoreutils-python-utils如果你实在不想折腾SELinux也可以对samba相关进程放宽松限但我不推荐直接setenforce 0因为重启后还是会恢复而且长期关闭SELinux本身就是在给这台服务器埋雷。正确思路是给目录打标签这是官方支持的做法。3. Samba服务端配置从安装到共享目录暴露的全部细节3.1 安装并启动服务CentOS 7上安装Samba很简单yum install -y samba samba-client systemctl start smb systemctl enable smbCentOS 8/Stream系列注意包名略有不同但依然是samba和samba-client用dnf安装即可。启动后用systemctl status smb确认状态是active (running)。等一下这里有个容易混淆的点smb服务是文件共享主进程还有一个nmb服务负责NetBIOS名称解析。如果你的Mac端通过Finder浏览共享时找不到设备但直接输IP能连上多半是nmbd没起来或端口被拦systemctl start nmb systemctl enable nmb大多数情况下Mac端直接输IP连接所以smb是必须的nmb锦上添花。3.2 创建共享用户系统用户和Samba密码是两套账Samba的认证机制比较特殊它需要的是一个系统用户但这个用户的登录密码由Samba独立管理。也就是说即使你在系统里给用户设置过密码那只是SSH登录用的Samba有自己的一套密码数据库。很多新手在这里卡住明明用户是对的密码怎么输都不对因为根本没用smbpasswd设置过Samba密码。创建专用用户比如shareuseruseradd shareuser passwd shareuser # 设置系统密码可以设置一个稍复杂的 smbpasswd -a shareuser # 设置Samba密码这一步才是Mac连接时用的密码 smbpasswd -e shareuser # 确保用户启用注意smbpasswd -a添加用户后默认该用户是启用的但如果你之前创建过又禁用过用-e重新启用。把用户加到samba组更方便管理groupadd sambashare usermod -G sambashare shareuser3.3 编写smb.conf核心配置逐项拆解Samba主配置文件在/etc/samba/smb.conf。先备份原文件再动手这是好习惯cp /etc/samba/smb.conf /etc/samba/smb.conf.bak一个适合CentOS共享给Mac的最小可用配置长这样[global] workgroup WORKGROUP server string CentOS Samba Server security user map to guest Bad User guest account nobody # 让macOS能正常读写这两个参数很关键 veto files /.DS_Store/ delete veto files yes [share] comment Shared Folder path /data/share browseable yes writable yes valid users shareuser create mask 0664 directory mask 0775逐项解释一下security user按系统用户验证。map to guest Bad User无效用户映射为guest这样匿名访问能列出共享名但实际操作还是要密码。如果你希望完全匿名访问把valid users删掉改成guest ok yes但我不建议在内网乱开匿名共享风险太大。veto files /.DS_Store/和delete veto files yesmacOS访问SMB共享时会在每个目录生成.DS_Store元数据文件在CentOS里看到一堆这种文件很碍眼这两行直接让Samba屏蔽它。实测很管用强烈建议加上。path /data/share共享目录路径。这里有个容易忽略的细节目录本身的文件系统权限要跟valid users对得上。比如我们用shareuser这个用户那么目录属主可以设成它或者给它读写权限mkdir -p /data/share chown -R shareuser:sambashare /data/share chmod -R 0775 /data/share如果你忘了改权限Samba配置得再对客户端也会因为shareuser对这个目录没有写权限而报错。配完后验证一下配置语法testparm这个命令会列出最终生效的配置如果有语法错误它直接提示。然后重启smb服务systemctl restart smb3.4 多用户或多目录场景的扩展思路如果你需要给不同用户开不同目录Samba的做法是写多个share段。比如再开一个[backup]指定不同的valid users和path。有个实用写法是支持用户组[team] path /data/team valid users sambashare write list sambashare组名表示整个组。这样以后加人只用usermod -G sambashare 新用户Samba配置不用动。团队协作场景下这比逐用户改配置高效得多。4. Mac端连接与自动挂载Finder操作和开机自动访问4.1 Finder连接直接输地址最省事Mac连SMB共享有多种入口我推荐最稳的方式打开Finder按Command K弹出连接服务器输入smb://192.168.31.206/share然后点连接。这时候弹出认证框输入你在第3.2节创建的shareuser和对应的Samba密码。如果一切正常Finder左侧边栏会出现共享位置共享里的目录就在眼前了。有几个细节值得说如果提示不允许操作或无法连接到服务器先别急着怀疑密码按第2和3节的顺序排查一遍防火墙、SELinux、目录权限。这三个是九成问题的根源。如果Finder左列表不出现设备但在网络里能看到稍微等等刷新即可不影响的直接输IP永远是判断问题最直接的方式。如果你希望访达里的图标看起来像本地磁盘可以在连接时点偏好设置勾选挂载后在桌面显示。4.2 挂载到指定挂载点及开机自动挂载Finder挂载是会话级的重启后不会自动恢复。如果你希望CentOS的共享目录每次开机都自动出现在Mac上需要写fstab或者用launchd。我试过几种方案后觉得对于绝大多数人来说写进fstab最直白可控。创建本地挂载点sudo mkdir -p /Volumes/centos_share然后编辑/etc/fstabsudo nano /etc/fstab加入一行//shareuser192.168.31.206/share /Volumes/centos_share smbfs rw,nobrowse,noatime,_netdev 0 0注意这里有个容易踩的坑nobrowse选项表示挂载后不在Finder边栏显示但你直接open /Volumes/centos_share照样能打开。我建议开发机加上nobrowse避免边栏杂乱点击路径访问即可。fstab的smbfs挂载在macOS上有个知名问题如果密码包含特殊字符要在地址里做URL转义。比如密码是ab#c写成shareuser:a%40b%23c192.168.31.206。如果你嫌麻烦可以用keychain存凭据fstab里不写密码系统挂载时自动从钥匙串读取。我第一次配置时没转义特殊字符折腾了二十分钟才明白是分号;被解析成配置分隔符了。写入fstab后手动测试sudo mount /Volumes/centos_share没问题的话重启后macOS会自动尝试挂载。这里有另一个小经验macOS在启动阶段网络可能还没完全就绪_netdev选项就是告诉系统等网络通了再挂一定要写。4.3 局域网内浏览共享而不是输IP如果你就想在Finder左侧网络里看到CentOS主机名需要NetBIOS名称解析正常。在smb.conf的[global]里设置netbios name CENTOS-SRV然后重启nmb。同时Mac端要在系统设置 - 网络里确认所在网络启用了文件共享发现。实测下来同一VLAN内Finder能在一两分钟内自动发现设备但跨VLAN、AP隔离的网络下直接输IP永远是最可靠的所以我会优先推荐IP连接方式。5. NFS方案追求性能和低延迟时的另一条路说完Samba说说NFS。如果你要在Mac上直接编译CentOS里的代码、或者来回搬运好几个G的镜像、日志文件SMB的往返延迟其实是有点高的NFS在这个场景下表现明显更好。5.1 服务端设置CentOS安装NFS服务yum install -y nfs-utils systemctl start nfs-server systemctl enable nfs-server编辑/etc/exports定义共享目录和允许访问的网段/data/nfs 192.168.31.0/24(rw,sync,no_subtree_check,no_root_squash)参数解读rw读写。sync同步写数据更安全但性能略低于async。内网环境我建议用sync图个心里踏实。no_subtree_check禁用子树检查提升稳定性官方推荐。no_root_squash允许Mac端root用户拥有root权限。如果没这个参数Mac端root会被映射为nobody有时会导致权限奇怪的错误。导出并检查exportfs -a exportfs -v防火墙放行NFSfirewall-cmd --permanent --zonepublic --add-servicenfs firewall-cmd --permanent --zonepublic --add-servicemountd firewall-cmd --permanent --zonepublic --add-servicerpc-bind firewall-cmd --reloadNFS涉及的端口比较多firewalld的这三个服务别名基本覆盖了常规端口。5.2 Mac端挂载及对NFS版本的处理Mac端挂载NFS非常简单sudo mkdir -p /Volumes/nfs_share sudo mount_nfs -o resvport,soft,intr 192.168.31.206:/data/nfs /Volumes/nfs_share这里有个专属坑必须提醒很多人在Mac上挂NFS总是报mount_nfs: cant mount ...或者能挂上但一访问就Input/output error。原因大多和版本选择有关。macOS默认可能协商到NFSv4但某些老的CentOS内核或者特定网络环境下NFSv3反而更稳定。你可以手动指定版本sudo mount_nfs -o vers3,resvport,soft,intr 192.168.31.206:/data/nfs /Volumes/nfs_shareresvport是macOS的一个历史遗留兼容参数某些服务器要求客户端使用保留端口源端口。加上它不会有什么副作用遇到诡异的端口拒绝问题就靠它解决。还有一点要特别说明NFS没有内置的用户认证机制它靠IP和UID/GID来识别权限。也就是说共享目录里文件的属主属组你是以什么UID在Mac上访问的显示出来的权限就是那个UID对应的。如果你在CentOS上的目录属主是shareuser假设UID是1001而你的Mac用户UID是501那写出来的文件归你Mac用户所有但读取CentOS上shareuser建的1001属主文件时可能受权限限制。配合no_root_squash和合适的目录权限平常使用问题不大该知道有这么回事。6. SSHFS不装Samba/NFS服务端的轻量备选最后说说SSHFS。如果你不想在CentOS上安装任何额外服务、只想快速把远程目录挂载成Mac本地目录SSHFS是利用SSH通道实现的文件系统挂载方案。macOS上安装SSHFS需要先有Homebrewbrew install macfuse brew install gromgit/fuse/sshfs-mac装完后挂载mkdir -p ~/mnt/centos_ssh sshfs shareuser192.168.31.206:/data/share ~/mnt/centos_ssh -o reconnect-o reconnect很关键网络闪断后会自动重连。如果你有SSH密钥建议配置密钥登录这样SSHFS挂载时不用输密码配合自动化脚本非常方便。SSHFS的优点是不用额外开放SMB或NFS端口安全审计时SSH口本来就要开。缺点是性能受限于SSH加密开销大文件连续读写时CPU占用偏高而且macFUSE依赖在macOS每次大版本升级后可能要重新安装兼容版本。我自己会在没有GUI权限的远程服务器上用它快速取文件日常办公还是Samba更顺手。顺手提一句如果只是偶尔传一个小文件scp和sftp足够解决不要再绕路搭共享。传多了、频繁了可重复用的共享方案才值得投入时间。7. 问题排查链路从Mac端看不到共享到权限EOF按这个顺序找无论前面配置多仔细运行时总会出现各种奇奇怪怪的问题。我把实操中最常见的四类问题和排查顺序写出来你按这个思路走比瞎试快得多。7.1 问题一能ping通但Finder连不上smb://排查链路检查smbd是否监听端口。在CentOS上执行ss -tlnp | grep -E 139|445如果没输出说明smb服务没起来journalctl -u smb看日志。检查防火墙firewall-cmd --list-services如果没有samba先放行。这一步最常见改了smb.conf忘了reload防火墙规则也常发生。检查SELinuxgetenforce为Enforcing时看/var/log/audit/audit.log里有没有denied关键字关联smbdausearch -m avc -ts recent | grep smbd有货就去为共享目录设置samba_share_t标签上面第2.3节有写。7.2 问题二能看到共享文件夹但打开是空目录或拒绝访问这种现象说明Samba认证已经通过了问题出在目录自身的权限上。执行sudo -u shareuser ls /data/share以shareuser身份列出目录如果能列出但客户端还是空检查SELinux标签ls -Z /data/share如果标签不是samba_share_t重新执行restorecon -Rv。如果客户端提示没有权限写文件检查目录写权限和create mask、directory mask是否给了组用户写权限。7.3 问题三Mac端提示操作失败或Input/output error这个通常和NFS相关按第5.2节加上vers3和resvport九成能解决。如果还是不行用nfsstat -m查看实际挂载参数是啥再查服务器端journalctl -u nfs-server看rpc错误。7.4 问题四传输大文件时速度忽快忽慢或中断优先考虑SMB协议版本。老CentOS默认SMB1在某些组合下性能很烂而且极不安全强烈建议在[global]里禁用SMB1显式开启SMB2/3server min protocol SMB2 server max protocol SMB3同时Mac端在Finder里连接时如果网络环境有AP隔离无线路由器隔离了客户端之间通信SMB广播发现会失败传输也可能受影响。这种情况用网线或者5G频段能改善。8. 几个让你少走弯路的实操心得文章最后说几句掏心窝的话都是我在这类配置上踩过坑换来的经验。第一不要把密码写在共享地址里长期使用。虽然smb://user:passip/share这种写法能省事但明文密码会出现在你的终端历史和系统日志里内网也不该这么干。用钥匙串存凭据、或者直接用fstab配合keychain安全性高得多。第二备份配置文件并且用版本管理。这一条适用于所有服务器运维场景不只是Samba。/etc/samba/smb.conf这种配置改动出问题想回滚有备份和没有备份是两回事。第三注意时间同步。Mac和CentOS如果时间差太多SMB会话的Kerberos相关验证可能抽风表现为时好时坏。CentOS上配好chronyd或者ntpdate定期校时Mac本身一般没问题两者同步好能省掉一类很诡异的故障。第四尽量用独立账号做共享专用用户别拿root直接共享。虽然valid users root配置也能用但一旦smbd被利用攻击面直接就是root权限。单独建用户、单独设目录权限是对这台机器最基本的尊重。第五如果你长期靠Samba日常使用留意CentOS端的磁盘空间和inode占用。Mac端的文件系统会产生大量小文件频繁读写后CentOS目录的inode可能被耗尽表现为明明还有磁盘空间却写不进去。定期清理临时文件、监控df -i比等到报错再来抢救舒服得多。按这套配置和排错逻辑走下来一台CentOS服务几台Mac共享文件是完全够用的。实在还有问题带着这台机子的日志和配置贴出来聊肯定能定位到具体的坑在哪。
返回列表