linux - WSL2 - Linux 相关符号链接在仅从 \\wsl$\ 挂载点从 Windows 访问时断开
问题描述
问题
当在 linux-native 文件系统中创建wsl2上的相关符号链接时,我真的很挣扎,我想通过共享点访问这些文件——它们只是被破坏了。\\wsl$\distro-name\whatever
环境
我已经wsl2
在我的 Windows10 中激活了。我有一个Ubuntu-20.04
:
对我的编码工作流程的影响
损坏的符号链接禁止我在“从 Windows 中的 IDE 编辑”时无缝地“在 wsl2 中执行”。
实际用例(但不限于):开发两个 intelced 项目:一个带有应用程序的 repo 和另一个与库一起存在的 repo。应用程序符号链接库:
- 主程序在
/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
/或 Powershell New-Item
)创建链接,它们会在 linux 中正确解码。
想象一下这个场景:
我有这个目录:
/mnt/c/tmp
它对应于C:\tmp
.
到这里我应该有一个文件original.txt
和三个链接linux.txt
,cmd.txt
并且powershell.txt
工作示例。第 2 步 - 列出符号链接
成功:我确实看到它们都列在 3 个 shell 中:linux、cmd 和 powershell:
在 Linux 中(图像中的 1),我们看到它们是符号链接,以及来自 CMD(图像中的 2)和 powershell(图像中的 3)的符号链接。
Linux 和 CMD 都报告了“去映射”(图像中的 4)。由于cmd.txt
和linux.txt
都是相对符号链接,因此没有什么神奇的方法可以做,只需了解它们是链接并完成即可。
Powershell出于某种我不关心这个问题的原因,将相对符号链接提升为绝对符号链接。这显示了一个非常有趣的效果:
幕后一定有人在做某种翻译工作,在这种情况下做得很好(图像中的 5):虽然powershell.txt
它从 linux 指向以 Windows 解释器开头的路径,/mnt/c/...
但它认为它指向C:\...
.
工作示例。第 3 步 - 通过符号链接访问内容
现在是时候看看我是否可以cat
(type
在 Windows 中)所有这些内容......
这里不需要解释。包括相对链接和绝对链接在内的所有 9 种组合(3 种创建方法 x 3 种消费方法)都可以完美运行。
现在是打破规则的时候了……
如何重现失败的示例
我将执行完全相同的过程,但不是在 Windows/mnt/c/tmp
上执行它/tmp
,而是在 Windows上执行它,而不是C:\tmp
从\\wsl$\Ubuntu-20.04\tmp
.
开始吧...
失败的例子。第 1 步 - 准备
我从linux开始。导航到文件系统/tmp
并在文件系统上创建一些虚拟内容WSL2
。我继续做符号链接。
当我尝试使用 CMD 去那里时,我真的不能,因为它抱怨说它是一条 UNC 路径:
我会改变我的策略,我会做一个网络挂载来获得一个驱动器号,看看 CMD 是否更喜欢它。我将W:
用于WSL2
文件系统。在图像中:1 = 我创建它,2 = 我检查它是否已创建,3 = 我tmp
在 WSL2 上导航。
但是现在......哦,惊喜!当我尝试从 CMD 进行符号链接时......它拒绝访问:
让我们尝试使用提升的 PowerShell ......
在这张图片中,我可以看到我可以正确导航到 UNC 路径(图片中的 1),但是在尝试创建链接时...繁荣...图片中的 2:“符号链接与指定的路径不兼容” :
所以只有一种方法可以在 WSL2 中创建符号链接:从 linux 内部。让我们看看如何列出并访问它。
失败的例子。第 2 步 - 列出 + 访问
启动,linux可以看到linux链接(当然):
但是当移动到 CMD 时,列表显示“JUNCTION”而不是“SYMLINK”,因为它显示在 NTFS 上,另外在尝试访问它时,它会中断:
最后,当进入 Powershell 时,行为是相似的:它看到“它在那里”,但无法访问内容:
最后的考虑
- 我什至不要求进行绝对路径转换(正如 NTFS 工作所证明的那样)。我只是对相关链接感到满意
- 我已经用文件做到了这一点。但它也因目录而失败。
呜呜呜问题
WSL2
我怎样才能在 linux 端和 windows 端都有一个正常工作的符号链接?
如果是错误,它是什么模块?内核?WSL 本身?P9 协议?我非常乐意贡献,但我什至不知道我应该为哪个项目做出贡献。
调查至今
我已经深入阅读了所有这些:
- https://docs.docker.com/docker-for-windows/wsl/
- https://medium.com/@ragin/development-under-windows-under-linux-with-wsl2-intellij-860daf601b61
- https://docs.microsoft.com/es-es/windows/wsl/tutorials/wsl-git
- https://docs.microsoft.com/es-es/windows/win32/fileio/hard-links-and-junctions?redirectedfrom=MSDN
- https://docs.microsoft.com/es-es/windows/win32/fileio/creating-symbolic-links
- https://www.docker.com/blog/new-docker-desktop-wsl2-backend/
还有更多,但仍然没有运气。
解决方案
它看起来像一个文件权限问题:
当您写入 /mnt/c/tmp 时,您写入的是 Windows 文件系统。
在 /tmp 中执行相同操作时,您将写入 Linux 文件系统。
借助 Unix 套接字,通过在 Windows 主机上运行的 Plan9 服务器(9P2000L 协议)访问 Linux 文件。
Linux 文件系统可通过\\wsl$\distribution-name
.
我可以推荐一个解释在 Windows 中访问 Linux 文件的视频。Windows 10 9P2000L协议
访问Linux文件系统的说明
似乎符号链接问题是一个未解决的问题。
推荐阅读
- github - 如何在我的 gitHub 页面上“使用 Linguist 执行语言检测”?
- google-cloud-run - 您知道任何配置云运行以从 cloudbuild.yaml 设置 cloudsql 的方法吗?
- xero-api - Xero 错误:POST 发票时禁止 403
- java - WebFlux:Flux.reduce() 是否传播 Mono.error()?
- c++ - “类型的实例称为对象”的含义
- tensorflow - Keras 自定义损失函数
- reactjs - 子组件不会重新渲染,也不会打印控制台日志
- javascript - 反应嵌套的json对象错误认为它是对象
- powershell - 如何在 Powershell 脚本中授予目录权限
- mysql - Speed Up A Large Insert From Select Query With Multiple Joins