Linux SMB/CIFS 网络挂载配置指南

Linux SMB/CIFS 网络挂载配置指南

目录


前置条件

1. 安装 CIFS 工具包

不同 Linux 发行版安装命令:

bash 复制代码
# CentOS / RHEL
sudo yum install -y cifs-utils

# Ubuntu / Debian
sudo apt-get install -y cifs-utils

# Fedora
sudo dnf install -y cifs-utils

2. 确认远程共享目录可访问

在挂载前,先验证远程共享目录是否可访问:

bash 复制代码
# 方法1:使用 smbclient 测试(需安装 samba-client)
smbclient -L //x.x.x.x -U admin

# 方法2:Windows 本机访问测试
# 在 Windows 资源管理器地址栏输入:
\\x.x.x.x\Kingdom\KIDM

3. 创建本地挂载点目录

bash 复制代码
# 创建挂载目录
sudo mkdir -p /usr/local/fs/file/KIDM/

# 设置目录权限(根据实际需求调整)
sudo chmod 777 /usr/local/fs/file/KIDM/

手动挂载(临时)

手动挂载在系统重启后会失效,适用于临时测试或短期使用。

命令格式

bash 复制代码
sudo mount -t cifs //<服务器IP>/<共享路径> <本地挂载点> -o <挂载选项>

完整示例

bash 复制代码
sudo mount -t cifs //x.x.x.x/Kingdom/KIDM/ /usr/local/fs/file/KIDM/ \
  -o username=admin,password=123456,uid=0,gid=0,dir_mode=0777,file_mode=0777,vers=2.0

参数说明

参数 说明
-t cifs 指定文件系统类型为 CIFS(通用 Internet 文件系统)
//x.x.x.x/Kingdom/KIDM/ 远程共享路径(Windows 服务器上的共享目录)
/usr/local/fs/file/KIDM/ 本地挂载点目录
username=admin 远程服务器的登录用户名
password=123456 远程服务器的登录密码
uid=0,gid=0 挂载后文件的所属用户和组(0 为 root)
dir_mode=0777 目录权限(所有用户可读写执行)
file_mode=0777 文件权限(所有用户可读写执行)
vers=2.0 SMB 协议版本(1.0/2.0/3.0,根据服务器支持选择)

SMB 协议版本选择

版本 说明
vers=1.0 SMBv1,较老系统(Windows Server 2003/XP),安全性较低,不推荐
vers=2.0 SMBv2,Windows Vista/Server 2008 及以上支持
vers=2.1 SMBv2.1,Windows 7/Server 2008 R2
vers=3.0 SMBv3,Windows 8/Server 2012 及以上,推荐使用(如服务器支持)

永久挂载(开机自动)

通过配置 /etc/fstab 实现开机自动挂载。

步骤一:创建凭据文件(推荐)

将敏感信息(用户名密码)单独存放,提高安全性:

bash 复制代码
# 创建凭据文件
sudo vim /etc/smbcred.txt

写入以下内容:

ini 复制代码
username=admin
password=123456
# 可选:指定域
# domain=WORKGROUP

设置文件权限(仅 root 可读):

bash 复制代码
sudo chmod 600 /etc/smbcred.txt

步骤二:编辑 fstab 文件

bash 复制代码
sudo vim /etc/fstab

在文件末尾添加挂载配置:

fstab 复制代码
//x.x.x.x/Kingdom/KIDM/  /usr/local/fs/file/KIDM/  cifs  credentials=/etc/smbcred.txt,uid=0,gid=0,dir_mode=0777,file_mode=0777,vers=2.0,_netdev  0  0

fstab 配置字段说明

字段 示例值 说明
设备/远程路径 //x.x.x.x/Kingdom/KIDM/ 远程共享目录路径
挂载点 /usr/local/fs/file/KIDM/ 本地挂载目录
文件系统类型 cifs CIFS/SMB 文件系统
挂载选项 credentials=...,vers=2.0,_netdev 挂载参数(见下表)
dump 备份标志 0 是否被 dump 备份,0 表示不备份
fsck 检查顺序 0 开机时 fsck 检查顺序,0 表示不检查

常用挂载选项

选项 说明
credentials=/etc/smbcred.txt 指定凭据文件路径
uid=0,gid=0 文件所属用户/组
dir_mode=0777 目录权限
file_mode=0777 文件权限
vers=2.0 SMB 协议版本
_netdev 等待网络就绪后再挂载(重要!)
nofail 挂载失败不阻止系统启动
iocharset=utf8 设置字符集,避免中文乱码
rw 读写模式(默认)
ro 只读模式

步骤三:验证挂载

bash 复制代码
# 挂载所有 fstab 中定义的文件系统
sudo mount -a

# 查看挂载结果
df -h | grep KIDM

# 或者查看详细挂载信息
mount | grep cifs

常用操作

查看当前挂载

bash 复制代码
# 查看所有挂载
df -h

# 仅查看 CIFS 挂载
mount -t cifs

# 查看 CIFS 挂载(mount newer syntax)
findmnt -t cifs

卸载挂载

bash 复制代码
# 普通卸载
sudo umount /usr/local/fs/file/KIDM/

# 如果提示 "target is busy",强制卸载(谨慎使用)
sudo umount -l /usr/local/fs/file/KIDM/

# 或者先查看占用进程
lsof /usr/local/fs/file/KIDM/
# 根据输出 kill 掉占用进程后再卸载

重新挂载

bash 复制代码
# 重新挂载(修改选项后生效)
sudo mount -o remount /usr/local/fs/file/KIDM/

测试 fstab 配置

bash 复制代码
# 检查 fstab 语法错误(不会实际挂载)
sudo mount -a -f

# 实际挂载并测试
sudo mount -a

故障排查

常见错误及解决方案

1. mount error(13): Permission denied

原因:用户名密码错误或权限不足

解决

bash 复制代码
# 验证凭据是否正确
smbclient -L //x.x.x.x -U admin

# 检查远程共享权限
# Windows: 右键共享文件夹 -> 属性 -> 共享 -> 高级共享 -> 权限
2. mount error(112): Host is down

原因:网络不通或 SMB 协议版本不匹配

解决

bash 复制代码
# 测试网络连通性
ping x.x.x.x

# 测试 SMB 端口
telnet x.x.x.x 445

# 尝试不同协议版本
sudo mount -t cifs //x.x.x.x/Kingdom/KIDM/ /mnt/test -o username=admin,password=123456,vers=1.0
sudo mount -t cifs //x.x.x.x/Kingdom/KIDM/ /mnt/test -o username=admin,password=123456,vers=2.0
sudo mount -t cifs //x.x.x.x/Kingdom/KIDM/ /mnt/test -o username=admin,password=123456,vers=3.0
3. mount error(2): No such file or directory

原因:共享路径不存在或共享名错误

解决

bash 复制代码
# 列出服务器上所有共享目录
smbclient -L //x.x.x.x -U admin

# 检查路径大小写(Windows 不区分,但 CIFS 可能区分)
4. CIFS VFS: cifs_mount failed with return code = -22

原因:挂载选项参数错误

解决

bash 复制代码
# 检查是否安装了 cifs-utils
rpm -qa | grep cifs-utils  # CentOS
dpkg -l | grep cifs-utils  # Ubuntu

# 检查 fstab 语法
sudo mount -a -v
5. 开机挂载失败

原因:网络未就绪时就尝试挂载

解决

  • 确保添加了 _netdev 选项
  • 可添加 nofail 避免阻塞启动
fstab 复制代码
//x.x.x.x/Kingdom/KIDM/  /usr/local/fs/file/KIDM/  cifs  credentials=/etc/smbcred.txt,_netdev,nofail  0  0

查看详细日志

bash 复制代码
# 查看内核日志
dmesg | tail -20

# 查看系统日志
journalctl -xe

# 实时监控挂载
sudo mount -a -v

常见问题 FAQ

Q1: 密码包含特殊字符怎么办?

使用转义符或凭据文件:

bash 复制代码
# 方法1:密码中特殊字符用 \ 转义
password=P@ss\!123

# 方法2:使用凭据文件(推荐)
# /etc/smbcred.txt 中直接写原始密码
password=P@ss!123

Q2: 如何让普通用户也能读写挂载目录?

bash 复制代码
# 设置 uid 和 gid 为普通用户的 ID
id username  # 查看用户 uid 和 gid

# 修改挂载选项
uid=1000,gid=1000,dir_mode=0755,file_mode=0755

Q3: 如何挂载 Windows 隐藏共享(如 C$)?

bash 复制代码
# Windows 管理共享使用 $ 结尾
sudo mount -t cifs //x.x.x.x/C$ /mnt/c-drive -o username=admin,password=123456,vers=3.0

Q4: 如何查看远程服务器支持的 SMB 版本?

bash 复制代码
# 使用 nmap 扫描 SMB 协议
nmap -p 445 --script smb-protocols x.x.x.x

Q5: 挂载后中文文件名乱码?

添加字符集选项:

bash 复制代码
sudo mount -t cifs //x.x.x.x/Kingdom/KIDM/ /usr/local/fs/file/KIDM/ \
  -o username=admin,password=123456,iocharset=utf8,vers=2.0

快速参考

bash 复制代码
# === 安装 ===
sudo yum install -y cifs-utils          # CentOS
sudo apt-get install -y cifs-utils      # Ubuntu

# === 手动挂载 ===
sudo mount -t cifs //server/share /mnt/point \
  -o username=user,password=pass,vers=2.0

# === 永久挂载 ===
echo "username=user" | sudo tee /etc/smbcred.txt
echo "password=pass" | sudo tee -a /etc/smbcred.txt
sudo chmod 600 /etc/smbcred.txt

echo "//server/share /mnt/point cifs credentials=/etc/smbcred.txt,vers=2.0,_netdev 0 0" \
  | sudo tee -a /etc/fstab

sudo mount -a

# === 查看 ===
df -h | grep cifs

# === 卸载 ===
sudo umount /mnt/point

参考资料

相关推荐
A小辣椒13 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒17 小时前
TShark:基础知识
linux
AlfredZhao19 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式