局域网内Linux挂载Windows共享文件夹

为实现在 Linux 服务器上的开发环境实时映射局域网内 Windows 的共享文件夹进行开发,我们可以使用 Linux 的 mount 功能把局域网内 Windows 的共享文件夹挂载到指定目录。在此将实现步骤罗列,给需要的人以参考。

Windows

  1. 添加专用于挂载的 Windows 新用户,设置用户名为 <username>,密码为 <password>
  2. 创建 Windows 共享文件夹 <shared_dir>
  3. 共享该文件夹:右键单击文件夹 <shared_dir> 进入 属性 - 共享 - 高级共享 - 共享此文件夹。
  4. 设置共享权限,权限 - 添加,在 选择用户或组 界面的 输入对象名称来选择 输入框内输入用户名 <username> 确定添加,并将 <username> 的权限设置为 完全控制。建议删除 Everyone 用户的共享权限。
  5. 确定 / 固定 Windows 在局域网中的 IP 地址为 <WinIP>
  6. 关闭 Windows 防火墙

Linux

  1. 创建 Linux 挂载文件夹 <mount_dir>
  2. 以 root 权限运行如下命令挂载文件夹
    mount -t cifs -o username="<username>",password="<password>" -o uid=<linuxuser> -o gid=<linuxgroup> //<WinIP>/<shared_dir> /<path>/<mount_dir>

其中的 <linuxuser><linuxgroup> 为 Linux 中具有开发环境配置权限的用户和其所在用户组。
上述方法将 <shared_dir> 内的文件挂载到了 <mount_dir> 中。你也可以根据自己需要对命令进行微调。

排障

如果运行 mount 执行挂载时提示 Host 宕机:

$ mount -t cifs -o username="user",password="passwd" -o uid=user -o gid=usergroup //<WinIP>/dir /path/to
Host is down.

这种情况有可能时由于两端的 Samba 协议不匹配造成的。要解决这个问题,首先需要确认是否时由前述原因造成的。可以执行如下命令:

$ smbclient -L <server_ip> -U <username> -d 256

在显示的 debug 信息中可以看到错误信息:

Connection to <WinIP> failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
Failed to connect with SMB1 -- no workgroup available

这样可以在执行 mount 命令时增加参数 vers=2.0 来指定协议版本,从而解决这个问题:

$ mount -t cifs -o username="user",password="passwd" -o uid=user -o gid=usergroup -o vers=2.0 //<WinIP>/dir /path/to

如果没有任何输出,有可能已经挂载成功。可以执行 mount 命令查看挂载情况:

$ mount

参考链接:
Mount CIFS Host is down