Linux SMB/CIFS 网络挂载配置指南
目录
- 前置条件
- 手动挂载(临时)
- 永久挂载(开机自动)
- 常用操作
- 故障排查
- [常见问题 FAQ](#常见问题 FAQ)
前置条件
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