概述
在企业运维工作中,经常需要把远程共享存储挂载到 Linux 本地目录,实现业务读写远程文件。主流两种协议:
CIFS(SMB):Linux 挂载 Windows/Windows NAS 共享,端口 445;
NFS:Linux 服务器之间互相挂载共享目录,端口 2049。
二者底层协议不一样,挂载命令参数不通用;但是本地目录管理、永久挂载方式、故障排查流程可以统一。
一、基础前置操作(两种挂载通用)
挂载前必须先创建本地挂载点目录,目录为空才能正常挂载。
bash
运行
mkdir -p /tlcb/send
mkdir -p /tlcb/recv
注意:不要在有文件的目录直接挂载;挂载成功后,原目录里面的文件会被临时隐藏,卸载后才会重新显示。
二、CIFS 挂载(连接 Windows 共享)
1、临时挂载(服务器重启失效)
bash
运行
mount -t cifs //10.xx.xx.xx/Share/Send /tlcb/send \\
-o username=业务账号,password=密码,vers=3.0,uid=1000,gid=1000
参数说明:
//ip/共享文件夹:Windows 共享路径
vers=3.0:指定 SMB3 协议,兼容性最好
uid、gid:指定 Linux 业务进程用户 ID,解决 Java 业务读写权限报错。
2、永久挂载方案 A:/etc/fstab(生产推荐)
编辑 /etc/fstab,末尾增加一行:
plaintext
//10.xx.xx.xx/Share/Send /tlcb/send cifs username=xxx,password=xxx,vers=3.0,uid=1000,gid=1000,_netdev 0 0
_netdev 至关重要:告诉系统等待网络就绪之后再执行挂载,避免开机网络未启动,挂载失败、目录变成本地空文件夹。
配置完成执行生效:
bash
运行
mount -a
风险提示:fstab 明文保存账号密码;测试环境可用,正式生产建议使用 credentials 密码文件。
3、永久挂载方案 B:rc.local 脚本(测试环境应急)
适合短期测试项目,利用开机脚本延时等待网络。
bash
运行
vi /etc/rc.d/rc.local
#增加内容
sleep 15
mount -t cifs //10.xx.xx.xx/Share/Send /tlcb/send -o username=xxx,password=xxx,vers=3.0,uid=1000,gid=1000
赋予执行权限:
bash
运行
chmod +x /etc/rc.d/rc.local
systemctl enable rc-local
缺点:rc.local 属于脚本实现,系统版本变更有可能失效;正式业务优先使用 fstab。
CIFS 权限重点
CIFS 是 Windows 文件系统,不支持 Linux 原生 chmod 权限修改。
不要挂载完成后执行chmod 777,重启挂载就会复原。权限要在 mount 参数通过uid/gid直接指定。
三、NFS 挂载(Linux 服务器之间共享)
1、服务端配置(提供共享的 Linux 机器)
1. 安装服务
bash
运行
yum install nfs-utils
编辑导出配置:
bash
运行
vi /etc/exports
写入配置:
plaintext
/data/share 192.168.1.0/24(rw,sync,no_root_squash)
含义:把/data/share目录共享,允许 192.168.1 段 IP 读写访问。
启动服务并放行防火墙:
bash
运行
systemctl enable –now nfs-server
firewall-cmd –add-service=nfs –permanent
firewall-cmd –reload
2、客户端挂载
临时挂载:
bash
运行
mount -t nfs 192.168.1.xx:/data/share /tlcb/send
永久挂载写入 /etc/fstab:
plaintext
192.168.1.xx:/data/share /tlcb/send nfs defaults,_netdev 0 0
执行生效:
bash
运行
mount -a
NFS 权限:支持 chown、chmod 修改目录权限;建议服务端客户端业务用户 UID/GID 尽量保持一致,减少权限异常。
四、权限规范:不推荐滥用 0777
chmod 0777代表服务器所有用户均可读写删除文件,安全风险高,仅允许临时调试故障,禁止生产长期使用。
业务目录推荐权限:
bash
运行
chown java:java /tlcb/send
chmod 0770 /tlcb/send
770 代表:属主、同组用户可读写,其他用户无访问权限。
CIFS 场景不要依靠 chmod,优先挂载参数 uid/gid;NFS 可以正常使用 chown/chmod 管理权限。
五、通用运维排查命令(CIFS、NFS 全部适用)
bash
运行
#查看当前全部挂载列表
df -h
#正常卸载挂载点
umount /tlcb/send
#目录卡住无法卸载,强制卸载
umount -l /tlcb/send
#端口连通性检查
telnet 10.x.x.x 445 #CIFS
telnet 10.x.x.x 2049 #NFS
六、高频踩坑总结
开机挂载失效:fstab 必须增加_netdev;rc.local 增加 sleep 延时,等待网络。
业务程序读写报错权限不足:
CIFS:检查 mount 的 uid/gid 是否匹配业务运行用户;
NFS:检查 exports 配置,以及目录属主权限。
挂载目录出现空文件夹:网络没就绪导致挂载失败,实际访问本地空目录。
CIFS 不要事后 chmod;修改权限要在挂载参数处理。
七、选型建议
1. 对接 Windows 存储、Windows NAS:选用 CIFS 协议;
2.Linux 集群服务器之间文件共享:选用 NFS 协议;
3. 正式业务持久挂载优先 /etc/fstab + _netdev;rc.local 只适合测试环境临时使用;
4. 尽量避免 0777 全局开放权限,遵循最小权限原则。


