如何在 WSL 中使用没有 /mnt/ 目录的 Windows 驱动器

如何在 WSL 中使用没有 /mnt/ 目录的 Windows 驱动器

我正在通过 Windows 10 Pro 在 WSL2 上使用 Ubuntu 22.04 LTS。

目前,如果我想移动到 WindowsD:驱动器或另一个 Windows 驱动器,我必须使用类似的路径/mnt/d/。例如:

cd /mnt/d/test_folder

我希望能够改用/d

cd /d/test_folder

我怎样才能做到这一点?

答案1

正如您所注意到的,WSL/mnt默认自动挂载挂载点下的固定 Windows 驱动器。

这里有好消息、坏消息和解决办法。

好消息:

可以通过创建/etc/wsl.confWSL 中的文件:

sudo -e /etc/wsl.conf

通常情况下(但不是您的情况)您可以通过将以下内容放入该文件来更改自动挂载位置:

[automount]
root = <new location>

坏消息是:

您无法将位置更改为/。因此/c/d使用此方法是不可能的。

解决方法:

处理此问题的最简单方法是创建从/mnt/<drive_letter>到的绑定挂载/<drive_letter>

sudo mount --bind /mnt/c /c -o X-mount.mkdir

对每个驱动器号重复此操作。

其他答案中的符号链接也可以起作用,但绑定挂载应该更为强大。

自动化安装

不幸的是,在 WSL 启动时自动执行此操作并不容易。问题是,当您启动 WSL 时,Windows 驱动器需要一小段时间才能可用。无论您使用绑定挂载还是符号链接到现有驱动器,这都会成为一个问题。

在“普通”Ubuntu 上,我们可以选择让 Systemd 等待 Windows 驱动器可用后再尝试绑定挂载。但如果没有额外的配置(我不推荐),Systemd 就无法在 WSL 上运行。

所以我们需要做的是:

  • WSL 启动后稍等片刻,以便驱动器可用。
  • 然后安装驱动器。
  • 最好的时候,我们不希望sudo每次启动 WSL 时都必须输入密码。

让我们首先通过正常方式定义坐骑/etc/fstab

sudo -e /etc/fstab

并添加您想要挂载的每个驱动器,如下所示:

/mnt/c /c none defaults,bind,X-mount.mkdir 0 0
/mnt/d /d none defaults,bind,X-mount.mkdir 0 0

注意:X-mount.mkdir即使挂载点不存在,该选项也会强制创建挂载点。否则您还需要确保目录存在。

通常情况下,WSL 会自动安装定义/etc/fstab,但在这种情况下我们不希望它这样做,因为它会在 Windows 驱动器可用之前过早地执行此操作。

所以我们需要关闭它。我们/etc/wsl.conf也可以这样做:

sudo -e /etc/wsl.conf

并添加以下内容:

[automount]
mountFsTab = false

现在我们需要mount -a以 root 身份调用,但需要一些时间我们启动 WSL。有两个选项:

  • 在 Windows 10 上:

    这不是我最喜欢的选项,但我们可以通过将以下内容添加到您的来实现这一点~/.bashrc

    nohup bash --noprofile --norc -c "(
        sleep 10
        /mnt/c/Windows/System32/wsl.exe -u root -d Ubuntu-22.04 -e mount -a
    
    ) &" </dev/null >/dev/null 2>&1
    

    解释:

    • 括号启动一个子 shell,这样我们可以在后台运行其中的命令(使用&),这样 Bash 就不必等待它完成后再继续。
    • nohup确保它不会因 shell 而终止,但更重要的是,在这种情况下,它允许我们通过重定向到 来抑制所有输出/dev/null
    • 我们会使用它sleep 10来确保安全。您可能可以降低。启动 WSL 后,挂载不会立即可用,但会在 10 秒左右内可用。
    • 使用wsl.exe -u root意味着我们不需要输入密码。添加规则sudoers也是一种可能性,但这在 WSL 上也同样有效。
  • 在 Windows 11 上:

    我知道您现在使用的是 Windows 10,但 Windows 11 确实让这变得更容易一些。Windows 11 WSL 有一个新功能,允许我们指定在 WSL 分发版/实例启动时运行的命令(或命令)。这也是通过以下方式配置的/etc/wsl.conf

    sudo -e /etc/wsl/conf
    

    添加以下内容:

    [boot]
    command = sleep 10 ; mount -a
    

    就是这样 - 实例启动 10 秒后,WSL 将(作为 root)加载mount -a我们放置的定义。/etc/fstab

答案2

创建符号链接

您可以更改挂载,但我不确定这是否会导致任何负面后果或问题,所以我宁愿创建一个符号链接:

ln -s /mnt/d /d

这会创建一个符号链接/d,您可以像访问任何目录一样访问它(例如列出内容ls -l /d),但它只是指向/mnt/d目录的链接。因此分区的挂载D:仍然在下/mnt/d

如果您有一个需要经常访问的文件夹,那么为该文件夹另外创建一个符号链接也可能是有意义的:

ln -s /mnt/d/my_data/work /work

此处直接在根目录中创建链接,并且是如上所述的/work目录链接。这样,当您访问时,您可以访问命名文件夹及其所有子项。/mnt/d/my_data/work/work

删除符号链接

如果您不再需要符号链接,您可以直接删除它:

例如rm /work

这只会删除符号链接,而不会删除实际文件夹work或其内容。

如果你执行例如rm /work/sound.mp3,你sound.mp3将从中删除该文件工作目录,它将不再存在于 Windows 资源管理器中的相应文件夹中。

相关内容