如何在Linux下挂载Windows/Samba Windows共享?

在Linux(Ubuntu 12.04)下,我想要挂载一个名为//winshared的Windows共享/ Windows分区到网络上。我并不知道IP地址或其他任何信息。 在一台Ubuntu系统上,我可以通过以下命令挂载目录:
mount  //winshared/mypath /mnt/win
在另一台Ubuntu系统上,完全相同的命令只会返回
mount error: could not resolve address for winshared: Unknown error
网络设置在两个系统上似乎是相同的,并且我安装了`smbfs`和`samba`(后者有错误)。我需要安装其他东西吗?我需要配置什么吗?如何找出两个系统之间的关键差异,以使两个系统上的挂载工作相同? 附加信息:
  1. 当我使用 smbclient 连接到 Windows 分区/共享文件夹/其他时,在第一个系统上可以正常工作,但在另一个系统上不行。错误信息为:

    连接到 winshared 失败(错误:NT_STATUS_BAD_NETWORK_NAME)
    
  2. 按照这个教程进行操作,我安装了 smbfscifs-utils,但上述的 mount 命令仍然出现相同的错误,而该错误在教程中没有描述。

  3. 我还在 /etc/fstab 中添加了以下条目:

    //winshared/mypath /mnt/win cifs uid=alexander,credentials=/etc/samba/wincred 0 0
    

    文件 /etc/samba/wincred 和另一个系统上的相同文件完全一致。两个文件的 md5sum 相同。因此,可以排除与凭证相关的错误。


请参阅Ubuntu Wiki上的教程:https://wiki.ubuntu.com/MountWindowsSharesPermanently - slm
我安装了这两个包,但是还是出现相同的错误! - Alex
我已更新问题;我发布了fstab行,并验证了凭据文件正确。 - Alex
4我会先从命令行开始让它工作,将这行代码放在/etc/fstab只会让调试变得更加复杂。如果你无法从命令行挂载,那就是其他问题了。我每天都使用这个命令:mount -t cifs -o rw,netbiosname=serv1,credentials=/etc/creds.txt //192.168.1.1/somedir /mnt - slm
不,将权限更改为600并不能解决问题。 - Alex
两个系统都在同一个网络上吗?如果您使用winshared的IP地址而不是名称,它是否能正常工作? - terdon
这个目录存在吗?/mnt/win。还要检查一下它的权限。大多数用户不能在/mnt下做任何操作。 - slm
确实存在,并且我拥有“root”权限。 - Alex
你的意思是,在运行这个命令时你是以root权限运行的吗? - slm
不,我的意思是我可以用“sudo”来运行所有这些命令。 - Alex
成为root用户并执行以下命令:sudo -i。同时在挂载命令中添加--verbose选项。 - slm
我尝试了以下命令:sudo -i mount -t cifs -o uid=alexander,credentials=/etc/samba/wincred //winshared/mypath /mnt/win,但是仍然遇到相同的错误。 - Alex
请在您的问题中添加您正在使用的mount命令。 - slm
你具体是什么意思?我不明白。你是指要将它添加到/etc/fstab吗? - Alex
让我们在聊天中继续这个讨论 - Alex
请不要提供您在终端中运行的确切挂载命令。与我之前提供的类似即可。您现在正尝试以这种方式进行挂载,对吗? - slm
mount -t cifs -o rw,netbiosname=serv1,credentials=/etc/creds.txt //192.168.1.1/somedir /mnt - slm
为了让它正常工作,我尝试在命令行上运行它。当挂载成功后,我计划将其添加到/etc/fstab中。这是命令:sudo -i mount -t cifs -o rw,netbiosname=serv1,uid=alexander,credentials=/etc/samba/wincred //winshared/mypath /mnt/win',虽然我不理解netbiosname=serv1`代表什么。无论如何,还是出现错误。 - Alex
一定有一个非常简单的解决方案,因为在同一网络中使用相同操作系统的另一台机器上运行良好。可能是缺少某个软件包,或者需要重新启动或启动某个服务之类的。肯定是一些很容易解决的问题。但是我没有看到它。 - Alex
同意,但不要被表象所迷惑。看似相同的事物可能有许多不同之处。我们会找出问题所在,毫无疑问,这可能是一些愚蠢的小错误,但你必须通过调试来找到根本原因 8-) - slm
netbiosname=serv1是你在挂载时想要向服务器展示的名称。这并不重要。 - slm
我刚刚重新启动了机器,但错误仍然存在。 - Alex
我能够使用IP地址挂载Windows共享。终于成功了!非常感谢你迄今为止的帮助,但我想我会放弃解决为什么无法解析名称的谜团。 - Alex
主机的名称在DNS中吗?nslookup <主机的名称>。很可能是这个原因。 - slm
不,不是这样的。对于系统而言,挂载是正常工作的。在两个系统上,route 命令给出的结果是相同的。而且这两个系统都在同一个网络中。 - Alex
5个回答

要么你有名称解析器问题(你可以通过从Ubuntu主机ping主机winshared来检查),要么smbfs模块没有加载。 你可能需要先用apt-get -y install smbfs安装smbfs,然后用modprobe smbfs插入模块,但之后你应该可以使用mount -t smbs。 你要找的是mount -t smbfs -o username=<your_username>,password=<your_password> //server/share /mountpoint

1smbfs已安装,但执行modprobe smbfs返回FATAL: Module smbfs not found. 我需要先启动smbfs吗?如果是的话,应该如何启动?如何在重启后自动启动它? - Alex
@Alex - 没有什么可以开始的。你很可能缺少一些软件包。 - slm
@Alex - 看看这个Ubuntu教程,它包含了你所需的一切:https://wiki.ubuntu.com/MountWindowsSharesPermanently - slm
我按照这个教程操作,但仍然遇到相同的错误! - Alex
3亡灵或未来的旅行者们。新系统上缺少smbfs。请使用sudo apt-get install cifs-utils代替。如果是这样的话,'modprobe smbfs'也不会起作用。所以这个答案在新系统上不适用。 - Beeeaaar
就我个人而言:在Ubuntu 16客户端上,如果我简单地省略了“-t smbfs”标志,建议的答案对我有效。 - Dan H
7在Ubuntu 18.04上,我跳过了安装smbfs,只是使用了"-t cifs"。此外,如果您以交互方式运行,可以省略密码参数,因为mount命令会要求您输入密码。 - MrMas
实际上,在Ubuntu 18.04上你甚至不能使用smbfs,因为再也没有这样的软件包了。所以-t cifs是正确的方法。你只需安装cifs-utils即可。 - Ruslan

我正在使用运行Debian 4.9的BeagleBone Black,由于其存储容量有限,我需要挂载在Windows 10桌面上托管的远程文件夹。(我知道从系统设计角度来看,这可能不是最好的选择,但业务需求通常很少给予那方面的空间。)所以,为了应急,我想到了挂载远程文件夹。 在尝试挂载Windows 10共享文件夹时遇到了许多问题,以下是我的解决方案,希望能让其他人从我的经验中受益。 Windows 10 "远程" 主机
  1. Windows 功能中启用SMB1.0/CIFS文件共享支持(详细信息)。
  2. 启动Windows的NetLogon服务。
  3. 在要共享的文件夹上启用共享
Debian Linux 客户端
  1. 安装支持包:smbclientcif-utils

    sudo apt-get install smbclient
    sudo apt-get install cifs-utils
    
  2. 创建目标目录以挂载远程共享:

    sudo mkdir -p /mnt/my_mount_dir
    
  3. 挂载远程文件夹:

    sudo mount -t cifs -o "domain=MYDOMAIN,username=MyUserName,password=myPas$werd,sec=ntlm" //(your windows host ip)/(your remote share name) /mnt/my_mount_dir
    

    更新:在将本地Debian升级到6.3版本后,我的mount命令出现问题,需要添加vers选项来指定SMB1:

    sudo mount -t cifs -o "domain=MYDOMAIN,username=MyUserName,password=myPas$werd,sec=ntlm,vers=1.0" //(your windows host ip)/(your remote share name) /mnt/my_mount_dir
    

3SMB1已经过时了,如果可能的话,您真的应该尽量避免使用它。如果您在mount选项中包含vers=2.1,您将获得SMB 2版本。而且,最好使用credentials而不是usernamepassword。在所有这些操作完成后,您可能也不需要sec=ntml了。 - roaima
@roaima 谢谢你的建议,但我只能使用旧的东西。还要感谢你修复了代码格式。之前我无法将代码放在列表项之间。 - Jim Fell
mount没有损坏;它已经转向使用SMB2或可能是SMB3。SMB1已经被弃用了十多年,你不应该继续使用它。 - roaima
@roaima 这个消息很好,但不幸的是,Windows 10似乎只支持"SMB1.0/CIFS"。而且这是用于私人网络,所以我对安全性并不过分担心。 - Jim Fell
1Windows 10支持SMB2和SMB3。您需要安装一个支持包,允许它回落到SMB1。 - roaima
@roaima 当我使用credentials=时,出现了错误2(没有这个文件或目录)打开凭证文件的问题,但是该文件存在,并且对用户、组和所有者都具有rw权限。你知道可能出了什么问题吗? - m4l490n
@m4l490n,你最好自己提出问题,但是先给你一些提示,除了所有者之外,不要将文件设置为其他人可读/写。 - roaima
额外加分,如果您稍后回来更新答案,并附上新的、现在可用的mount命令选项。Note: The translation provided is in Simplified Chinese. - John Dunne

我在通过图形界面挂载的Samba共享上右键单击,然后从文件系统的其他位置打开,右键单击后,必须使用终端打开,在终端中,你可以看到终端框中显示的位置,类似于:
/run/user/1/gvfs/smb-share:server=192.168.18.1,share=xyz/foldername/
从这个位置,您可以在命令提示符中访问smbshared文件。

这是一个很好的答案。底层操作系统会处理繁重的工作,并负责凭据(根据您的选择)。这正是我在寻找的。再进一步,创建一个目录,比如说 SRV1sudo mkdir /mnt/SRV1; sudo chown will:staff /mnt/SRV1D:驱动器可通过 /mnt/SRV1/D/进行访问。使用链接命令:ln -svn "/run/user/1000/gvfs/smb-share:server=SRV1,share=d$" /mnt/SRV1/D。每次文件管理器连接到书签时,/mnt/SRV1/D/都是准备好的。 - will

检查是否安装了winbind;然后,在您的/etc/nsswitch.conf文件中,hosts行中必须列出wins。 类似于:
hosts: files wins dns
根据您系统上安装的软件包,可能会列出其他模块。

昨天在Ubuntu 12.04 64位系统上尝试了这个解决方案,效果非常好。谢谢!今天我在Ubuntu 12.04 32位系统上做同样的事情,结果失败了,很奇怪。 - Czarek Tomczak
2@更新:原来你需要安装winbind软件包 sudo apt-get install winbind - Czarek Tomczak
请注意,这些(DNS和WINS)的顺序很重要,并且可以互换使用。 - Elysiumplain

你可以尝试下面链接中的mountSMB脚本。 它应该能处理你想要实现的大部分功能。 它将扫描子网并维护一个列表,列出在你的本地子网或通过nmblookup无法访问的服务器。

https://github.com/huwpowell


从链接和你的用户名上就很明显了,但你应该澄清一下你是这个剧本的作者,并且也许可以解释一下它是如何进行演绎(以及它是怎样回答这个问题的)。 - Stephen Kitt