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

参考资料

相关推荐
XmasWu12252 小时前
【Hermes Agent进阶】开发自定义技能
网络·数据库
wang09072 小时前
Linux性能优化之内存管理基础知识
java·linux·性能优化
科技牛牛2 小时前
IP定位误差导致封号_深度解析
网络·网络协议·tcp/ip
杰 .2 小时前
闲暇时刻对LinuxOS的部分理解(一)
linux·服务器
Olivia051405142 小时前
Voohu:音频变压器在平衡传输与地环路隔离中的设计要点
网络·机器人·信息与通信
俺不要写代码2 小时前
线程启动、结束,创建线程多法、join,detach,线程的移动语义
服务器·开发语言·网络·c++
摩斯电码2 小时前
深入 perf 第二版(二):用原始事件编号解锁 CPU 的隐藏指标
linux·性能优化
老鱼说AI2 小时前
CSAPP深入理解计算机系统第三章:汇编语言基础
网络
代码中介商2 小时前
Linux 基础命令完全指南:从文件操作到进程管理
linux·运维·服务器