Linux 上挂载 Samba(Windows & macOS 共享文件夹)的正确姿势


一、操作环境

  • 服务器 1:Windows 7 家庭版的 PC
  • 服务器 2:macOS 10.12.4 的 MacBook Pro
  • 客户端:CentOS 7.3.1611 已安装好 cifs-utils 软件包


二、查看服务器共享出来的资源

在 Linux 命令行界面中,必须手动指定共享出来的资源,不像 Windows 以及 macOS 可以自动列出。

2.1 smbclient 命令用法

smbclient -L <服务器IP或主机名>  -U  <用户名>

以 Windows 7 服务器为例,macOS 用法一样

2.2 举例

smbclient -L 192.168.100.2 -U zenandidi
Enter zenandidi's password:   #输入密码,不回显
Domain=[WIN7] OS=[Windows 7 Home Basic 7601 Service Pack 1] Server=[Windows 7 Home Basic 6.1]
   #共享点名称#      #类型#      #描述# 
    Sharename       Type      Comment
    ---------       ----      -------
    ADMIN$          Disk      远程管理
    C               Disk      
    C$              Disk      默认共享
    IPC$            IPC       远程 IPC
Connection to 192.168.100.2 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND) 
NetBIOS over TCP disabled -- no workgroup available #可能会出现一些错误警告,不过可以列出的话就不用管

上面列出来的表格就是共享点信息,下面将连接 C 这个共享点。

2.3 解决错误

如果执行完上面的命令后出现 Server does not support EXTENDED_SECURITY but 'client use spnego = yes and 'client ntlmv2 auth = yes' 那么说明服务器不支持扩展性安全认证,通常出现在 Windows XP 这种古董身上,需要在 /etc/samba/smb.conf 文件前面加上下面两行:

client use spnego = yes
client ntlmv2 auth = no

三、挂载服务器共享资源

3.1 挂载命令的用法

mount -t cifs <共享点路径> <挂载点> -o username=<用户名>

或者

mount.cifs <共享点路径> <挂载点> -o username=<用户名>`

另外,Windows 和 macOS 的挂载姿势有点不一样,请注意区别。

(以下均使用 mount 命令)

3.2 挂载 Windows 的共享资源举例

mount -t cifs //192.168.100.2/C /mnt/smb -o username=zenandidi  #如果共享点带空格,请在空格前加上 “ \ ”
Password for [email protected]//192.168.100.2/C:  ******************  #输入密码

如果没显示任何错误,说明挂载成功。下面检查一下挂载点。

mount | grep cifs
//192.168.100.2/C on /mnt/smb type cifs (rw,relatime,vers=1.0,cache=strict,username=zenandidi,domain=WIN7,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.100.2,file_mode=0755,dir_mode=0755,nounix,serverino,mapposix,rsize=61440,wsize=65536,echo_interval=60,actimeo=1)
ls /mnt/smb
.                       Intel                Recovery
..                      MSOCache             $Recycle.Bin
AX                      MyDrivers            ss
BaiduNetdiskDownload    new_zxjt_v6          System Volume Information
dd                      PerfLogs             Users
dd2                     ProgramData          Windows
Documents and Settings  Program Files        zd_pazq
.DS_Store               Program Files (x86)

目录以及文件可以正常显示,说明挂载已成功。

3.3 挂载 macOS 的共享资源举例

如果使用以上方法挂载 macOS 上的共享资源,发现挂载点下一片空白。

mount -t cifs //192.168.100.3/Macintosh\ HD /mnt/smb -o username=zenandidi
Password for [email protected]//192.168.100.3/Macintosh HD:  ****************** 
ls /mnt/smb/
#什么都没有啊

嗯,一定是哪里出了问题。用 journal -xe 看一下日志。

4月 25 16:35:42 CentOS kernel: CIFS VFS: Send error in QFSUnixInfo = -95
4月 25 16:35:42 CentOS kernel: CIFS VFS: server does not support POSIX extensions
4月 25 16:35:42 CentOS kernel: CIFS VFS: server does not support POSIX extensions
4月 25 16:35:59 CentOS kernel: CIFS VFS: Autodisabling the use of server inode numbers on //192.168.100.3/Macintosh HD. This server doesn't seem to support them properly. Hardlinks will not be recognized on this mount. Consider mounting with the "noserverino" option to silence this message.

果然是有问题,好像是说不支持硬链接什么的,可以加一个 noserverino 选项忽略错误。
查了下文档

noserverino

Client generates inode numbers itself rather than using the actual ones from the server.

意思大概是说加了这个选项之后客户端使用自己的 inode 号而不使用服务器提供的 inode 号。

毕竟 samba 这个协议的亲妈是 Windows,而 Windows 中的文件系统没有 inode 这个概念,来到 Unix 文件系统上多少还是有些水土不服的。

好吧,那就按照提示添加 noserverino 选项吧。

mount -t cifs //192.168.100.3/Macintosh\ HD /mnt/smb -o username=zenandidi,noserverino
Password for [email protected]//192.168.100.3/Macintosh HD:  ****************** 
ls /mnt/smb/
Applications  dev   installer.failurerequests  Network  sbin    Users  Volumes
bin           etc   Library                    opt      System  usr
cores         home  net                        private  tmp     var

好了,挂载成功了!


四、总结

4.1 挂载 Windows samba 服务器的正确姿势

mount -t cifs <共享点路径> <挂载点> -o username=<用户名>

mount.cifs <共享点路径> <挂载点> -o username=<用户名>

4.2 挂载 macOS samba 服务器的正确姿势

mount -t cifs <共享点路径> <挂载点> -o username=<用户名>,noserverino

mount.cifs <共享点路径> <挂载点> -o username=<用户名>,noserverino

如果依然出错,可以按照日志的指引进行配置文件的更改,实在不行再上网求助。

4.3 开机自动挂载方法

/etc/fstab 末尾添加:

 <共享点路径>  <挂载点>  cifs  username=<用户名>,password=<密码>  0  0

这里不在赘述,选项也跟上面一样,就是把文件系统的类型改为 cifs 还有把密码输进里面。个人不建议修改这个文件,如果断网挂载失败的话,会进入救援模式,比较麻烦。我的做法是把挂载命令写进 /etc/rc.d/rc.loacl 文件中。

发表评论

电子邮件地址不会被公开。