我正在通过 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.conf
WSL 中的文件:
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 上也同样有效。
- 括号启动一个子 shell,这样我们可以在后台运行其中的命令(使用
在 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 资源管理器中的相应文件夹中。