在 WSL 中从 Ubuntu shell 访问 Windows 网络共享

在 WSL 中从 Ubuntu shell 访问 Windows 网络共享

我正在尝试从 Cygwin 迁移到 WSL。在 Cygwin 上的 bash 中,我可以执行以下操作:

$ ls //servername/sharename

访问 Windows 共享文件夹。我不需要先挂载它或做任何事情,它就可以正常工作。如果我在 Ubuntu 中尝试同样的事情,我会收到“没有这样的文件或目录”错误。

我使用了很多网络共享。在 WSL 下的 Ubuntu 中处理这个问题的最佳/最简单的方法是什么?

答案1

$ sudo mkdir /mnt/share
$ sudo mount -t drvfs '\\server\share' /mnt/share

使用单引号,否则您将需要转义反斜杠。

WSL2 还支持 CIFS。

$ sudo apt install cifs-utils
$ sudo mount -t cifs -o user={user},pass={password},vers=1.0 //server/share /mnt/share

答案2

更新依据@BowlOfRed 的autofs回答autofs。为了使其适合您的用例,需要解决一些问题。

第一个答案,虽然完全正确,但似乎认为您是在问如何挂载 CIFS/SMB 驱动器共享,但我并不是这样理解您的问题的。您似乎已经知道需要挂载共享。您的隐含问题是是否有一种方法可以“无需先挂载即可访问共享”(按需挂载),就像在 Cygwin 中一样。我理解,如果有大量不同的共享,就像您说的那样,这会方便得多。

虽然我最初的回答基本上是“不”,但@BowlOfRed 指出autofs “按需挂载”。但是,autofs在我的测试中,存在一些问题:

  • 首先,也是很容易解决的问题,在 WSL 下,你需要某种方式来启动服务autofs。通常在 Ubuntu 下,这将是一个随启动而启动的 Systemd 单元。但是,WSL 不支持 Systemd。幸运的是,它autofs也附带一个 SysVInit 样式的脚本,因此sudo service autofs start可以用来启动它。请参阅我的 Stack Overflow 答案如何在启动时执行此操作,取决于您运行的是 Win 10 还是 11。

  • 二、auto.smb自带的脚本autofs 可能要求您存储您的凭证每个主机位于单独的/etc/creds/<hostname>文件中。但是,听起来您可能处于具有域帐户的公司环境中。在这种情况下,您可能能够使用 Kerberos 或 winbind 仅登录一次并使用autofs缓存的凭据/票证。但是,我无法在我的网络上对此进行测试,并且我无法提供您需要的配置的任何指导。

    我认为,另一种选择是编写一个autofs脚本来使用 DrvFs 而不是 CIFS。在 WSL 下,DrvFs 挂载在某种程度上类似于 Cygwin,它使用 Windows 用户的凭据,并且在挂载之前不需要额外的身份验证。不过,这里有一个挑战,即自动挂载脚本以 root 身份运行,而不是以普通用户身份运行。

    另一个选择可能是修改当前auto.smb脚本以使用一个通用凭证文件,而不是每个主机使用一个凭证文件。

  • 虽然 WSL 本质上是一个单用户系统,但我也不喜欢在文件系统上存储纯文本 Windows 密码,无论权限如何。当然,上面的 DrvFs、Kerberos 或 winbind 选项可以解决这个问题。


附注/替代方案:

当然,如果您希望在 WSL 中始终有有限数量的共享可用,那么您可以将它们添加到您的共享中,/etc/fstab以便默认安装它们。

none /mnt/smb tmpfs rw,relatime 0 0
drvfs /mnt/smb/servername/sharename 9p rw,dirsync,relatime,X-mount.mkdir,aname=drvfs;path=UNC\servername/sharename;symlinkroot=/mnt/,mmap,access=client,msize=262144,trans=virtio 0 0

这将为 SMB/CIFS 挂载创建一个 tmpfs 位置,然后将共享挂载在该目录中。

您可以在手动挂载后复制格式/etc/mtab,但我建议添加选项X-mount,以便在挂载点自动创建父目录。

答案3

在 Windows(以及 cygwin)中,您可能拥有一些用于登录的 Windows/域凭据。UNC 路径挂载可以使用这些用户级凭据进行挂载。WSL 将无法使用它们。

但是如果您有一个不需要密码的 CIFS 服务器(或者如果您愿意填充 /etc/creds 并允许任何登录的用户能够使用它们进行访问),那么您可以使用自动挂载程序。

  • 安装 autofs。
  • 添加/cifs /etc/auto.smb --timeout=300自动主机管理工具
  • 启动/重启 autofs

这样,您就应该能够ls /cifs/<hostname>/<share>看到数据了。

答案4

这可能会或可能不会有帮助,但值得将以下内容添加到您的 %USERPROFILE%\wsl.config:

[wsl2]
localhostForwarding=true

以及 /etc/wsl.conf

[network]
generateHosts = false
[automount]
enabled = true
options = "metadata"
mountFsTab = false

相关内容