当外部驱动器在 WSL 中可用时,是否有办法安装外部驱动器?

Dan*_*lan 7 windows mount ubuntu windows-subsystem-for-linux wsl2

我使用 Ubuntu 和 WSL 以及 zsh/bash shell。我的主机操作系统是 Windows 10。我已经弄清楚如何安装 Windows 外部驱动器

sudo mkdir /mnt/d
sudo mount -t drvfs D: /mnt/d
Run Code Online (Sandbox Code Playgroud)

我很少插入这个驱动器,所以我想在插入时自动安装它。如果在插入驱动器然后启动新的 WSL 终端后出现这种情况,也没关系。

我不想将此命令放入某种.bashrc类型的文件中,因为每次打开终端时都必须输入密码,这会带来更多麻烦,尤其是在 99% 的情况下,该命令无论如何都会失败。将它放入 bash 脚本中也没有帮助,因为我很少运行它,当我需要使用它时,我会忘记我首先创建了它。

那么,当 WSL 中可用时,有没有办法安装外部驱动器呢?


我不知道这是否是一个好的解决方案,但这告诉您如何关闭 sudo 的密码请求。这是我采取的路线:https ://superuser.com/a/1492456/89165

Not*_*1ds 7

在我看来,这需要两种不同的方法:

  • 首先,我们需要处理在驱动器已连接的情况下 WSL 启动的情况。
  • 我们还需要处理在 WSL 已经运行时连接驱动器的情况。

WSL 启动时驱动器已连接

第一部分应该很简单。

我不想将此命令放入 .bashrc 类型的文件中,因为每次打开终端时都必须输入密码

这很容易克服。将以下内容添加到您的~/.bashrc代码中:

wsl.exe -u root -e mount -t drvfs D: /mnt/d > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

这将安装驱动器(如果可用)。如果没有,它将默默地失败。

WSL 运行时连接驱动器

这并不容易,而且可能需要更多的错误处理才能变得“健壮”,但我能够通过创建一个 PowerShell 脚本来使其工作:

  • 连接 USB 驱动器时注册操作
  • wsl -u root -e mount -t drvfs /mnt/<driveletter> <Drive>当事件触发时运行。
$query = "select * from __InstanceCreationEvent within 5 where TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.DriveType = 2"

$action = {
    $drivePath = $event.SourceEventArgs.NewEvent.TargetInstance.Name
    $driveLetter = $drivePath.ToLower()[0]
    wsl -u root -e mount -t drvfs $drivePath /mnt/$driveLetter
}

Register-WmiEvent -Query $Query -Action $Action -SourceIdentifier USBFlashDriveWSLMount
Run Code Online (Sandbox Code Playgroud)

请注意,这需要在 Windows PowerShell(而不是 PowerShell Core)中运行,因为它使用WMIEvent. 我确信有一个使用 CIM 的 PowerShell Core 等效项,但我还没有尝试过这种方式。

如果遇到问题,请检查输出。来自 PowerShell:

Get-Job
# Get the Id of the job then
Receive-Job <job_id>
Run Code Online (Sandbox Code Playgroud)

理论上,你可以通过任务计划程序设置这个脚本在Windows登录时运行,但我没有尝试过。我有 80% 的信心它会起作用。您需要通过powershell命令调用它(不是pwsh因为它使用 WMIEvent)。

请注意,显然还有一种方法可以通过 CIM 永久注册事件侦听器。上周我在这方面花了一些时间,但是当我遵循一些在我的系统上创建了一个我无法摆脱的 CIM 类的文档时,我陷入了困境。我最终可能会回到它,但希望这作为计划任务对您有用。我只是不想推迟发布直到我“恰到好处”,因为我可能永远不会完成它。