我正在尝试从 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