如何最好地将 WSL 中的驱动器安装为共享驱动器?

如何最好地将 WSL 中的驱动器安装为共享驱动器?

我正在尝试简化/自动化我在 Windows 中的开发环境,我有很多在 Windows 和 Linux 子系统上运行的 shell 文件,我最近开始编辑我的/etc/wsl.conf设置

[automount]
root = /

这使得我的路径变为 windows /c/... 而不是 /mnt/c/...,这简化了我的许多脚本的文件访问,允许脚本从主机调用到 wsl 或返回,并允许我在两个环境中无缝实现自动化。我的问题是每次启动 wsl 之后,我还需要运行,sudo mount --make-shared /c/ 以便我的脚本可以正确地到达另一个系统,我知道我可以使用mountFsTab但是我对 Fstab 文件相当业余,并且有一段时间没有修改过它了,更不用说在 wsl 下使用它了,我想知道是否有人可以指出我正确的方向,将我的 /c/ 挂载设置为共享驱动器,这样我就可以进行简单的双向通信,不要浪费时间,因为我忘了在开始工作之前运行 make-shared 命令,然后对我的设置感到困惑?如果还有一种除了使用 Fstab 之外的其他方法,但只是配置 wsl.conf 会更好,我只是在微软的文档中没有找到任何关于如何简单地做到这一点的信息。无论如何,提前谢谢大家。

答案1

我不确定我是否完全理解了您在共享挂载上重新挂载/或使用共享挂载的用例,但我真的很想了解。我将根据我目前对您的问题的理解来回答,但我希望您对其进行编辑以提供有关用例的更多详细信息。

您的工作流程完全有可能存在一些更好的选择。

话虽如此,你的核心问题似乎非常简单:

总结一下:

如何才能最好地在 WSL 中保留共享挂载?

正如您所注意到的,Windows 驱动器是由 WSL/init而不是挂载的/etc/fstab。虽然有一些通过/etc/wsl.conf挂载选项(例如实际挂载点,uid/ gid)进行控制,shared挂载传播不是这些选项之一。

您有多种选择:

  • 添加一个使用该选项/etc/fstab重新挂载驱动器的条目shared。我发现最简单的方法是将当前挂载表条目从复制/etc/mtab/etc/fstab

    grep "/c " /etc/mtab | sudo tee -a /etc/fstab
    

    当然,grep在复制之前先测试一下第一个可能是个好主意,只是为了确保它返回您想要的行。

    然后编辑/etc/fstab并添加shared到选项的开头。例如,紧接着rw选项之前。

    您需要退出 WSL,wsl --terminate <distro>然后重新启动才能使其生效,但我可以确认这对于启动以共享方式安装驱动器的 WSL 有效。

  • 如果你只想mount --make-shared /c/在 WSL 启动时运行,还有两个附加选项。首先,对于 Windows 11,你可以将以下内容添加到你的/etc/wsl.conf

    [boot]
    command="mount --make-shared /c/"
    

    如果需要运行多个命令,请将它们用分号连接在一个command=字符串中。

    此命令root在 WSL 启动时运行,因此无需sudo输入密码。

  • 如果您没有(并且目前无法升级)Windows 11,您可以随时将命令添加到您的~/.bash_profile(或其他适用的启动文件中)。这里有一个巧妙的技巧可以让您不必使用sudo。将以下内容添加到您的~/.bash_profile

    wsl.exe -u root -e mount --make-shared /c/
    

    将以 root 用户身份运行 WSL 并执行mount命令。

    重要的提示:如果您正在编写 WSL 脚本,您可能最终会从 PowerShell、CMD 或其他脚本运行其他类似的命令。当使用命令(非交互方式)执行时,WSL 会不是通常将 shell 作为登录或交互 shell 运行。因此,如果您有需要加载的脚本~/.bash_profile(或其他启动文件),请确保使用 运行它们wsl.exe -e bash -lic "command"。这将在 bash shell 中运行命令,该 shell 既是“登录”(源配置文件脚本),又是“交互”(源 rc 脚本)。

请注意,我已通过以下方式确认了这些工作:

findmnt -o TARGET,PROPAGATION /mnt/c # /c/ in your case, of course

TARGET PROPAGATION
/mnt/c shared

测试之后,我禁用了该选项,终止了实例,并重新检查以确保传播已恢复private

相关内容