WSL2-仅从\\ wsl $ \挂载点

问题描述

问题

在linux本地文件系统中创建 wsl2 上的相对符号链接时,我真的很挣扎,我想通过共享点访问文件\\wsl$\distro-name\whatever -它们只是坏了。

环境

我在Windows10中激活了wsl2我有一个Ubuntu-20.04

Ubuntu in WSL2

影响我的编码工作流程

损坏的符号链接禁止,同时在“从Windows中的IDE编辑”中无缝地“在wsl2中执行”。

实际用例(但不仅限于此):开发两个智能项目:一个包含应用程序的存储库和另一个驻留在库中的存储库。该应用程序对库进行符号链接

  • /files/repos/my-nice-app中的主程序
  • 位于/files/repos/my-nice-lib的图书馆
  • my-nice-app/libs/my-nice-lib是指向../../my-nice-lib
  • 的符号链接
  • Windows中的智能IDE,可在打开\\wsl$\Ubuntu-20.04\files\repos\my-nice-app的应用程序上运行

通过此设置,位置\\wsl$\Ubuntu-20.04\files\repos\my-nice-app\libs\my-nice-lib应该映射到\\wsl$\Ubuntu-20.04\files\repos\my-nice-lib

但是它不起作用。 IDE中的所有代码补全都搞砸了,因为符号链接无法很好地解映射,并且IDE无法读取库的类和定义。

如何复制工作示例

工作示例。步骤1-准备

每当我在NTFS文件系统中从Linux 创建符号链接时,它都会在Windows中正确解码

相反的一面:如果我从Windows 创建链接(都使用CMD和mklink或使用New-Item的Powershell),则它们将在Linux中正确解码。

想象一下这种情况:

  1. 我有这个目录:/mnt/c/tmp,它对应于C:\tmp

  2. 我将一些内容放入文件original.txt中。我为此使用linux bash。

    Create content on NTFS

  3. 在Linux中,我做了一个指向linux.txt的相对符号链接original.txt

    Create link from linux on NTFS

  4. 然后我从Windows执行此操作。使用mklink命令从CMD:

    Create link from CMD on NTFS

  5. 我什至可以从提升的Powershell中使用New-Item命令在Windows端进行符号链接

    Create link from PowerShell on NTFS

到目前为止,我应该有一个文件original.txt和三个链接linux.txtcmd.txtpowershell.txt

工作示例。第2步-列出符号链接

成功:我确实在3个Shell中分别看到了所有它们:Linux,cmd和powershell:

Listing in NTFS

在Linux中(图中为1),它们是符号链接,在CMD中(图中为2)和在powershell中(图中为3)。

Linux和CMD都报告了“解映射”(图中的4)。因为cmd.txtlinux.txt都是相对的符号链接,所以在后面没有魔术可以做,只要了解它们是链接并完成即可。

出于某种我不关心这个问题的原因,Powershell将相对符号链接提升为绝对符号链接。这显示出非常有趣的效果

幕后某人必须正在执行某种翻译工作,在这种情况下,该工作做得很好(图中为5):从linux powershell.txt指向Windows解释器将以/mnt/c/...开头的路径视为指向C:\...的路径。

工作示例。第3步-通过符号链接访问内容

现在该看看我是否可以cat(在Windows中为type)所有内容...

Accessing in NTFS

此处无需解释。包括相对链接和绝对链接的所有9种组合(3种创建方法x 3种消耗方法)都可以完美地工作。

现在是时候打破规则了……

如何重现失败的示例

我将执行非常完全相同的过程,但不是在/mnt/c/tmp上执行而是在/tmp和Windows上执行,而不是从C:\tmp我将从\\wsl$\Ubuntu-20.04\tmp访问它。

开始吧...

失败示例。步骤1-准备

我从linux开始。导航到/tmp并在WSL2文件系统上创建一些虚拟内容。我继续进行符号链接

Creating content wsl2

当我尝试使用CMD去那里时,我真的不能,因为它抱怨自己是UNC路径:

Navigating UNC on CMD

我将更改策略,然后进行网络安装以获取驱动器号,看看CMD是否更喜欢它。我将对W:文件系统使用WSL2。在图像中:1 =我创建它,2 =我检查它是否创建,3 =我导航到WSL2上的tmp

Creating W:

但是现在...哦,惊喜!!!当我尝试从CMD执行符号链接...时,它拒绝访问:

Linking from CMD on WSL2

让我们尝试使用提升的PowerShell ...

在此图像中,我可以看到我可以正确导航到UNC路径(图像中为1),但是在尝试创建链接时……繁荣...图像中的2:“符号链接与指定的路径”:

Linking from PowerShell on WSL2

因此,只有一种方法可以在WSL2中创建符号链接:从linux内部。让我们看看如何列出和访问它。

失败示例。第2步-列出+访问

首先,Linux可以看到linux链接(当然):

Linux accessing WSL2

但是当移到CMD时,清单显示的是“ JUNCTION”而不是NTFS上显示的“ SYMLINK”,此外,当尝试访问它时,它会中断:

CMD accessing WSL2

最后,当进入Powershell时,行为是相似的:它看到“在那儿”,但无法访问其中的内容

PowerShell accessing WSL2

最终注意事项

  • 我什至不要求绝对路径转换(如在NTFS中可以证明的那样)。我对相对链接很满意
  • 我已经使用文件完成了此操作。但是,目录也会失败。

Soooooooooo问题

我如何在WSL2上正确运行符号链接,使其在Linux端和Windows端都能正常工作?

如果是bug,它是什么模块?内核? WSL本身? P9协议?我很乐意贡献力量,但我什至不知道我应该为哪个项目贡献力量。

到目前为止的调查

我已经深入阅读了所有这些内容

还有更多,但还是没有运气。

解决方法

这似乎是文件许可问题:
在/ mnt / c / tmp中进行写入时,您将在Windows文件系统中进行写入。
在/ tmp中执行相同操作时,您将在Linux文件系统中进行编写。
Linux文件可通过Unix套接字通过Windows主机上运行的Plan9服务器(9P2000L协议)进行访问。
可通过\\wsl$\distribution-name访问Linux文件系统。
我可以建议介绍在Windows中访问Linux文件的视频。
Explanation of the access of Linux filesystem with Windows 10
9P2000L protocol

似乎符号链接问题是open issue