Realmente estoy luchando con los enlaces simbólicos relativos en wsl2 cuando se crean en el sistema de archivos nativo de Linux y quiero acceder a los archivos a través del punto compartido \\wsl$\distro-name\whatever - Simplemente están rotos.
Tengo wsl2 activado en mi Windows10. Tengo un Ubuntu-20.04 :
Los enlaces simbólicos rotos me prohíben "ejecutar en wsl2" sin problemas mientras "edita desde un IDE en Windows".
Caso de uso real (pero no limitado a): Desarrollo de dos proyectos entrelazados: un repositorio con una aplicación y otro repositorio que vive al lado de una biblioteca. La aplicación vincula la biblioteca:
/files/repos/my-nice-app/files/repos/my-nice-libmy-nice-app/libs/my-nice-lib es un enlace simbólico a ../../my-nice-lib\\wsl$\Ubuntu-20.04\files\repos\my-nice-app Con esta configuración, se espera que la ubicación \\wsl$\Ubuntu-20.04\files\repos\my-nice-app\libs\my-nice-lib se asigne a \\wsl$\Ubuntu-20.04\files\repos\my-nice-lib .
Pero no funciona. Toda la finalización del código en el IDE está desordenada, porque el enlace simbólico no se desmapea bien y el IDE no puede leer las clases y definiciones de la biblioteca.
Cada vez que creo un enlace simbólico desde Linux en el sistema de archivos NTFS, se decodifica correctamente en Windows .
Lo mismo en el lado opuesto: si creo el enlace desde Windows (tanto con CMD como con mklink o Powershell con New-Item ), se decodifican correctamente en Linux .
Imagina este escenario:
Tengo este directorio: /mnt/c/tmp que corresponde a C:\tmp .
Puse algunos contenidos en un archivo original.txt . Yo uso el bash de linux para eso. 
Desde Linux, hago un enlace simbólico relativo linux.txt que apunta a original.txt . 
Luego lo hago desde windows. Desde un CMD con el comando mklink : 
Incluso puedo hacer el enlace simbólico en el lado de la ventana con el comando New-Item desde un powershell elevado 
Hasta aquí debería tener un archivo original.txt y tres enlaces linux.txt , cmd.txt y powershell.txt
Éxito: los veo a todos enumerados en cada uno de los 3 shells: linux, cmd y powershell:
Aquí en Linux (1 en la imagen) vemos que son symlinks, así como desde el CMD (2 en la imagen) y en el powershell (3 en la imagen).
Tanto Linux como CMD también reportan la "desasignación" (4 en la imagen). Como cmd.txt y linux.txt son enlaces simbólicos relativos, no hay magia que hacer detrás, solo entienda que son enlaces y listo.
Powershell, por alguna razón por la que no me importa esta pregunta, promovió el enlace simbólico relativo a uno absoluto. Esto muestra un efecto muy interesante:
Alguien detrás de escena debe estar haciendo algún tipo de trabajo de traducción, que se está haciendo bien en este caso (5 en la imagen): mientras que desde linux powershell.txt apunta a una ruta que comienza con /mnt/c/... el intérprete de Windows lo ve como apuntando a C:\... .
Ahora es el momento de ver si puedo cat ( type en windows) el contenido de todos ellos...
No se necesita explicación aquí. Las 9 combinaciones (3 métodos de creación x 3 métodos de consumo), incluidos los enlaces relativos y absolutos, funcionan perfectamente.
Ahora es el turno de los que rompen las reglas...
Haré exactamente el mismo proceso, pero en lugar de hacerlo en /mnt/c/tmp , lo haré en /tmp y en Windows, en lugar de acceder desde C:\tmp , accederé desde \\wsl$\Ubuntu-20.04\tmp .
Empecemos...
Empiezo por el linux. Navegar a /tmp y crear contenido ficticio en el sistema de archivos WSL2 . Continúo haciendo el enlace simbólico.
Cuando trato de ir allí con el CMD, realmente no puedo porque se queja de ser una ruta UNC:
Cambiaré mi estrategia y haré un montaje neto para tener una letra de unidad, ver si a CMD le gusta más. Usaré W: para el sistema de archivos WSL2 . En la imagen: 1 = lo creo, 2 = verifico que se haya creado, 3 = navego a tmp en WSL2.
Pero ahora... oh sorpresa!!! Cuando trato de hacer un enlace simbólico desde el CMD... niega el acceso:
Probemos con un PowerShell elevado...
En esta imagen puedo ver que puedo navegar correctamente a la ruta UNC (1 en la imagen) pero al intentar crear el enlace... bum... 2 en la imagen: "Los enlaces simbólicos no son compatibles con la ruta especificada" :
Entonces, solo hay UNA forma de crear los enlaces simbólicos en WSL2: desde el interior de Linux. Veamos cómo podemos enumerarlo y acceder a él.
Comenzando, Linux puede ver enlaces de Linux (por supuesto):
Pero al pasar a CMD, la lista muestra "JUNCTION" en lugar de "SYMLINK" como lo mostraba en el NTFS y, además, al intentar acceder a él, se rompe:
Finalmente, al pasar a Powershell, el comportamiento es similar: ve "está ahí", pero no se puede acceder a los contenidos:
¿Cómo puedo tener un enlace simbólico que funcione correctamente en WSL2 tanto en el lado de Linux como en el lado de Windows?
Si es un error, ¿qué módulo es? ¿El núcleo? ¿La WSL en sí? ¿El protocolo P9? Estaría más que feliz de contribuir, pero ni siquiera sé a qué proyecto debo contribuir.
He leído profundamente en su totalidad todos estos:
y muchos más, pero todavía sin suerte.
No conozco una forma de hacer uso de enlaces simbólicos relativos para hacer lo que quieres. Sospecho que no hay una solución sana y razonable para su pregunta, como se indicó, además de quizás corregir el error vinculado en la otra respuesta. Recomiendo adoptar un enfoque completamente diferente que aborde su necesidad subyacente de ejecutar en WSL2 y editar en Windows. Nuestro equipo tiene la misma necesidad subyacente, y he invertido un esfuerzo considerable (pero ciertamente no exhaustivo) experimentando con una variedad de estrategias. Mi recomendación personal es usar Git para clonar tu clon , pero si alguien tiene alguna idea mejor, ¡soy todo oídos!
git clone git@github.com:<owner>/<repository> para clonar este repositorio en su sistema de archivos de Linux.git clone ~/source/repos/<repository> /mnt/<drive>/Users/<username>/.../<repository> --branch main . Esto le permite insertar y extraer del clon en el sistema de archivos de Linux. Otra opción sería ejecutar rsync --archive --delete-after <path to Windows copy> <path to Linux copy> desde su distribución WSL2 Linux. De esta manera, puede copiar de manera eficiente cualquier cambio realizado en su proyecto en el sistema de archivos de Windows al sistema de archivos de Linux antes de la ejecución. Incluso podría configurar un trabajo cron para ejecutar automáticamente rsync en segundo plano periódicamente si el lado de Linux es de solo lectura.
No recomiendo copiar archivos entre sistemas de archivos usando herramientas del lado de Windows como PowerShell (o incluso Git Bash), porque el sistema de archivos de Linux tiene permisos más granulares que las herramientas de Windows tienden a manipular. La única excepción es Git, porque Git mismo maneja este tipo de problemas de compatibilidad entre plataformas, independientemente de cómo se ejecute. Sin embargo, debe configurar sus atributos .git de manera adecuada para administrar las diferencias en los finales de línea automáticamente.
El 5 de octubre de 2021, Microsoft lanzó Windows 11 concompatibilidad con la aplicación GUI de Linux . Por lo tanto, en lugar de hacer nada de esto, si es aceptable, simplemente puede usar un IDE para Linux, como VSCode . (Desafortunadamente, esto no resuelve el problema de mi equipo, porque ejecutamos tanto en el lado de Linux como en el de Windows).
Parece un problema de permiso de archivo:
Cuando escribe en /mnt/c/tmp, escribe en el sistema de archivos de Windows.
Mientras hace lo mismo en /tmp, escribe en el sistema de archivos de Linux.
Se accede a los archivos de Linux a través de un servidor Plan9 (protocolo 9P2000L) que se ejecuta en el host de Windows con la ayuda de un socket Unix.
Se puede acceder al sistema de archivos de Linux a través \\wsl$\distribution-name .
Puedo sugerir el video que explica el acceso a los archivos de Linux en Windows.
Explicación del acceso al sistema de archivos de Linux con Windows 10
Protocolo 9P2000L
Parece que el problema del enlace simbólico es un problema abierto .