gpt4 book ai didi

linux - WSL2 - Linux 相对符号链接(symbolic link)在仅针对\\wsl$\挂载点从 Windows 访问时损坏

转载 作者:行者123 更新时间:2023-12-03 09:46:14 29 4
gpt4 key购买 nike

问题
我真的很挣扎 相关符号链接(symbolic link) wsl2 当它们在 linux-native 文件系统中创建时,我想 通过共享点访问文件 \\wsl$\distro-name\whatever - 他们只是坏了。
环境
我有 wsl2在我的 Windows10 中激活。我有一个 Ubuntu-20.04 :
Ubuntu in WSL2
对我的编码工作流程的影响
损坏的符号链接(symbolic link) 禁止我 在“从 Windows 中的 IDE 进行编辑”的同时无缝地“在 wsl2 中执行”。
实际用例(但不限于):开发两个集成项目:一个带有应用程序的 repo 和另一个与库一起存在的 repo。该应用程序符号链接(symbolic link)库:

  • 主程序在/files/repos/my-nice-app
  • 图书馆也在 /files/repos/my-nice-lib
  • my-nice-app/libs/my-nice-lib是指向 ../../my-nice-lib 的符号链接(symbolic link)
  • 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 中的所有代码完成都搞砸了,因为符号链接(symbolic link)没有很好地解映射并且 IDE 无法读取库的类和定义。
    如何重现工作示例
    工作示例。第 1 步 - 准备
    每当我 从 linux 创建符号链接(symbolic link) 在 NTFS 文件系统中,它是 在 Windows 中正确解码 .
    反面相同:如果我 从 Windows 创建链接 (带有 CMD 和 mklink 或带有 New-Item 的 Powershell)它们是 在 linux 中正确解码 .
    想象一下这个场景:
  • 我有这个目录:/mnt/c/tmp对应于 C:\tmp .
  • 我将一些内容放入文件 original.txt .我为此使用了 linux bash。
    Create content on NTFS
  • 在 linux 中,我做了一个相对符号链接(symbolic link) linux.txt指向 original.txt .
    Create link from linux on NTFS
  • 然后我从 window 做。来自带有 mklink 的 CMD命令:
    Create link from CMD on NTFS
  • 我什至可以使用 New-Item 在 windows 端进行符号链接(symbolic link)来自提升的 powershell 的命令
    Create link from PowerShell on NTFS

  • 到这里我应该有一个文件 original.txt和三个链接 linux.txt , cmd.txtpowershell.txt工作示例。第 2 步 - 列出符号链接(symbolic link)
    成功:我确实在 3 个 shell 中看到了所有这些:linux、cmd 和 powershell:
    Listing in NTFS
    在 Linux(图像中的 1)中,我们看到它们是符号链接(symbolic link),以及来自 CMD(图像中的 2)和 powershell(图像中的 3)中的符号链接(symbolic link)。
    Linux 和 CMD 也报告了“解映射”(图像中的 4)。如 cmd.txtlinux.txt都是相对符号链接(symbolic link),后面没有什么神奇的事情,只要明白它们是链接就完成了。
    由于某种我不关心这个问题的原因,Powershell 将相对符号链接(symbolic link)提升为绝对符号链接(symbolic link)。这显示了一个非常有趣的效果:
    幕后有人一定是在做某种翻译工作,在这种情况下做得很好(图像中的 5):来自 linux powershell.txt它指向以 /mnt/c/... 开头的路径Windows 解释器将其视为指向 C:\... .
    工作示例。第 3 步 - 通过符号链接(symbolic link)访问内容
    现在是时候看看我是否可以 cat ( type 在 windows 中)所有这些的内容......
    Accessing in NTFS
    这里不需要解释。包括相对链接和绝对链接在内的所有 9 种组合(3 种创建方法 x 3 种消耗方法)都可以完美运行。
    现在是打破规则的时候了......
    如何重现失败的例子
    我会做 完全相同的过程但不是在 /mnt/c/tmp 上做我会在 /tmp 上做在 Windows 中,而不是从 C:\tmp 访问它我将从 \\wsl$\Ubuntu-20.04\tmp 访问它.
    开始吧...
    失败的例子。第 1 步 - 准备
    我从linux开始。导航至 /tmp并在 WSL2 上创建一些虚拟内容文件系统。我继续做符号链接(symbolic link)。
    Creating content wsl2
    当我尝试使用 CMD 去那里时,我真的不能,因为它提示是 UNC 路径:
    Navigating UNC on CMD
    我会改变我的策略,我会做一个网络挂载以获得一个驱动器号,看看CMD是否更喜欢它。我会用 W:WSL2文件系统。在图像中:1 = 我创建了它,2 = 我检查它已创建,3 = 我导航到 tmp在 WSL2 上。
    Creating W:
    但是现在……哦,惊喜!!!当我尝试从 CMD 执行符号链接(symbolic link)时...它拒绝访问:
    Linking from CMD on WSL2
    让我们尝试使用提升的 PowerShell ...
    在此图像中,我可以看到我可以正确导航到 UNC 路径(图像中的 1),但是在尝试创建链接时...繁荣...图像中的 2:“符号链接(symbolic link)与指定路径不兼容” :
    Linking from PowerShell on WSL2
    所以只有一种方法可以在 WSL2 中创建符号链接(symbolic link):从 linux 内部。让我们看看如何列出并访问它。
    失败的例子。第 2 步 - 列出 + 访问
    开始,linux 可以看到 linux 链接(当然):
    Linux accessing WSL2
    但是当移动到 CMD 时,列表显示“JUNCTION”而不是“SYMLINK”,因为它在 NTFS 上显示它,另外在尝试访问它时,它会中断:
    CMD accessing WSL2
    最后,当进入 Powershell 时,行为类似:它看到“它就在那里”,但无法访问内容:
    PowerShell accessing WSL2
    最后的考虑
  • 我什至不要求绝对路径转换(如在 NTFS 作品中所示)。我对相关链接很满意
  • 我已经用文件做到了这一点。但它也失败了目录。

  • Sooooooooo 问题
    我怎样才能在 WSL2 上有一个正常工作的符号链接(symbolic link)在 linux 端和 windows 端都运行良好?
    如果它是一个错误,它是什么模块?内核? WSL 本身? P9协议(protocol)?我很乐意做出贡献,但我什至不知道我应该为哪个项目做出贡献。
    目前已完成调查
    我已经深入阅读了所有这些内容:
  • 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 文件系统中写入。
    Linux 文件是通过在 Windows 主机上运行的 Plan9 服务器(9P2000L 协议(protocol))在 Unix 套接字的帮助下访问的。
    Linux 文件系统可通过 \\wsl$\distribution-name 访问.
    我可以推荐一个解释在 Windows 中访问 Linux 文件的视频。
    Explanation of the access of Linux filesystem with Windows 10
    9P2000L protocol
    似乎符号链接(symbolic link)问题是 open issue .

    关于linux - WSL2 - Linux 相对符号链接(symbolic link)在仅针对\\wsl$\挂载点从 Windows 访问时损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64489501/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com