Linux下通过/etc/fstab挂载Windows共享目录的最佳实践


阅读 2 次

问题场景描述

最近在Ubuntu系统上需要挂载公司文件服务器上的共享目录,该服务器运行Mac OS X系统,同时开启了AFP和Windows文件共享(SMB/CIFS)协议。需求要点:

  • 需要通过/etc/fstab实现自动挂载
  • 使用普通用户权限操作
  • 每次挂载时需要密码验证

基础配置方法

最基本的/etc/fstab配置如下:

//服务器IP/共享名  /挂载点  cifs  credentials=/path/to/credentials  0  0

其中credentials文件内容格式:

username=你的用户名
password=你的密码
domain=工作组或域名(可选)

处理特殊字符的共享名

当共享名包含空格等特殊字符时,需要进行转义处理:

//10.1.0.15/G4\\040320  /media/G4  cifs  credentials=/etc/cifs_creds  0  0

这里\\040是空格的ASCII码八进制表示。

解决权限问题

要实现普通用户挂载,需要:

  1. 确保挂载点目录存在且用户有权限
  2. 在fstab中添加user选项
//10.1.0.15/share  /mnt/share  cifs  credentials=/etc/cifs_creds,user,uid=1000,gid=1000  0  0

其中uid和gid可通过id -uid -g命令获取。

安全存储凭据

推荐两种安全存储密码的方式:

1. 使用credentials文件

chmod 600 /etc/cifs_creds

2. 使用密钥环(keyring)

安装必要工具:

sudo apt-get install cifs-utils keyutils

创建密钥:

sudo /sbin/request-key create cifs.spnego * * /usr/sbin/cifs.upcall %k
sudo /sbin/request-key create dns_resolver * * /usr/sbin/cifs.upcall %k

然后在fstab中使用:

//server/share  /mnt/share  cifs  _netdev,user,uid=1000,sec=krb5  0  0

常见错误排查

遇到挂载失败时,可按以下步骤排查:

1. 检查服务端共享设置

smbclient -L //server -U username

2. 手动测试挂载

sudo mount -t cifs //server/share /mnt/share -o user=username

3. 查看详细错误信息

dmesg | tail -20
journalctl -xe

完整示例配置

以下是一个生产环境可用的完整配置示例:

# /etc/fstab 配置
//192.168.1.100/开发文档  /mnt/dev_docs  cifs  credentials=/etc/smbcreds,user,uid=1000,gid=1000,file_mode=0775,dir_mode=0775,noperm  0  0

# /etc/smbcreds 内容
username=dev_user
password=Complex@Pass123
domain=WORKGROUP

# 设置权限
sudo chmod 600 /etc/smbcreds
sudo mkdir -p /mnt/dev_docs
sudo chown dev_user:dev_user /mnt/dev_docs

高级选项说明

选项 说明
vers=3.0 指定SMB协议版本
iocharset=utf8 支持中文文件名
cache=none 禁用缓存
noserverino 防止inode冲突
rw/ro 读写/只读

实际使用时可根据需要组合这些选项。