CentOS 服务器之间相互挂载(Samba)
在运维里常会遇到这种需求:两台 CentOS 服务器,一台跑应用、一台存数据,或者一台负责采集、一台负责归档,两边要共享同一个目录。最省事的方案之一就是用 Samba(SMB 协议)共享,然后通过 mount -t cifs 把共享目录挂载到本地。下面整理几种常见场景和对应的挂载写法。相比 NFS,SMB 的好处是和 Windows 客户端天然兼容,很多混合环境里两边都能用;缺点是协议本身有一定开销,不适合对 IO 延迟极其敏感的场景。对绝大多数应用间共享(备份目录、上传目录、日志汇聚)来说,性能完全够用。
前置准备:确认 cifs 工具
挂载前先确认系统里有 mount.cifs 工具:
# 查看是否已安装
which mount.cifs
# 未安装则安装(CentOS 7/8)
yum install cifs-utils -y
缺少 cifs-utils 是最常见的报错原因之一,提示 "mount: unknown filesystem type 'cifs'" 时,先装这个包。顺便确认防火墙放行:被挂载的 Samba 服务端要开放 TCP 445(老版本还有 139),挂载端一般不需要额外放行。可以先在挂载端用 nc -vz 192.168.2.2 445 测一下端口通不通,把网络问题在动手前排除掉。
一、挂载匿名 Samba 共享
mount -t cifs //192.168.2.2/share /151.2_share -o guest
-o guest:以匿名访客身份访问共享,无需用户名和密码;//192.168.2.2/share:远程共享路径,格式是//服务器IP/共享名;/151.2_share:本地挂载点,需要事先创建好(mkdir -p)。
匿名挂载适合内网里不敏感的数据交换,生产环境建议至少使用账号认证。还有一点:匿名挂载通常意味着“任何能连到该共享的人都能读写”,务必确认共享目录本身做了权限限制(如只读或限定网段),否则挂载后等于把目录敞开了。
二、挂载非匿名 Samba 共享
mount -t cifs //192.168.2.2/share /151.2_share -o username=samba,password=samba,iocharset=utf-8
username/password:指定访问账号;iocharset=utf-8:保证中文文件名正常显示,不指定时中文名可能变成乱码。
明文密码出现在命令行里,history 会记录。临时测试没问题,长期使用建议用凭据文件:
# 创建凭据文件,权限收紧
vi /root/.smbcredentials
# 内容:
# username=samba
# password=samba
chmod 600 /root/.smbcredentials
mount -t cifs //192.168.2.2/share /151.2_share -o credentials=/root/.smbcredentials,iocharset=utf-8
凭据文件配合 chmod 600 后,即使其他运维人员看到 fstab 或历史命令,也看不到明文密码,比直接写在命令行里安全得多。要更换密码时,只改这一个文件再 umount 重新挂载即可,不用动 fstab。
三、开机自动挂载(fstab)
编辑 /etc/fstab:
vi /etc/fstab
添加一行(匿名):
//192.168.151.2/share /151.2_share cifs defaults,guest 0 0
非匿名则把 guest 换成 credentials=/root/.smbcredentials:
//192.168.2.2/share /151.2_share cifs defaults,credentials=/root/.smbcredentials,iocharset=utf-8 0 0
fstab 是开机挂载的推荐方式,但注意:网络在启动早期可能还没就绪,导致挂载失败。如果遇到这种情况,可以给 fstab 行加 _netdev 选项,让系统在网络可用后再挂载。写 fstab 时字段顺序是固定的六个:设备、挂载点、文件系统类型、选项、dump、fsck。0 0 表示不做 dump 和开机 fsck 检查。改完 fstab 先别急着重启,可以 mount -a 手动触发一次挂载验证写法是否正确,出错了也容易回退。
四、通过 rc.local 开机挂载
也可以把挂载命令写进 /etc/rc.local:
chmod +x /etc/rc.local
vi /etc/rc.local
添加(注意把密码换成你自己的):
mount -t cifs -o username=root,password='你的密码' //192.168.1.101/mnt/test/ /home/ceshi
rc.local 是在系统启动后期执行的,天然避开“网络未就绪”的问题,但可维护性不如 fstab。
五、指定 SMB 版本挂载
某些老旧的 SMB 服务端(比如只支持 SMB1)或新的 Windows 系统默认禁用 SMB1,都可能出现挂载失败。此时需要显式指定协议版本:
mount -t cifs -o vers=1.0,username=www,password=密码 //10.10.10.2/web /www/source
常用版本参数:vers=1.0、vers=2.0、vers=3.0。具体用哪个,取决于服务端支持的 SMB 协议版本。CentOS 7 以后的默认 SMB 版本较高,跨版本互访时最容易出现“能 ping 通但挂载报错”的情况,此时先试 vers=3.0,再逐步降级排查。
六、验证与排查
挂载完成后,用下面的命令确认:
df -h | grep 151.2_share
mount | grep cifs
常见错误速查:
| 报错特征 | 大概率原因 | 处理 |
|---|---|---|
| unknown filesystem type 'cifs' | 缺 cifs-utils | 安装 cifs-utils |
| mount error(13): Permission denied | 认证失败/匿名不允许 | 检查账号密码或换认证方式 |
| mount error(112): Host is down | 网络不通或端口(445)被挡 | 检查防火墙和安全组 |
| 中文文件名乱码 | 缺 iocharset | 加 iocharset=utf-8 |
排查顺序建议从下往上:先确认网络和端口(112 号错基本是网络问题),再确认认证(13 号错通常是账号密码),最后才怀疑协议版本。挂载成功后还可以 ls -la /151.2_share 快速确认读写权限和中文文件名是否正常,测完再放进生产路径。
小结
- 匿名共享:
-o guest; - 非匿名共享:
-o username=xxx,password=xxx,建议加iocharset=utf-8,长期使用用凭据文件; - 开机自动挂载:写
/etc/fstab(推荐,加_netdev)或/etc/rc.local; - 版本不兼容:通过
-o vers=1.0/2.0/3.0指定 SMB 协议版本。
以上是“被挂载”一端的操作。如果要在一台 CentOS 服务器上搭建 Samba 服务、把目录共享给其他机器访问,可以参考CentOS 7 Samba 共享配置。更多服务器配置与运维内容请查看云服务器分类,例如服务器运维技巧。
参考:Samba 官方文档 https://www.samba.org/samba/docs/current/man-html/mount.cifs.8.html、Linux cifs 挂载手册 https://linux.die.net/man/8/mount.cifs
原文链接:https://www.cnblogs.com/cqzhuomi/articles/17284369.html(博客园 CQZHUOMI,转载)