Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

1.8K
Visualizações
WSL2: los enlaces simbólicos relativos de Linux se rompen cuando se accede desde Windows solo para el punto de montaje \\wsl$\

Problema

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.

Ambiente

Tengo wsl2 activado en mi Windows10. Tengo un Ubuntu-20.04 :

Ubuntu en WSL2

Impacto en mi flujo de trabajo de codificación

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:

  • Programa principal en /files/repos/my-nice-app
  • Biblioteca también en /files/repos/my-nice-lib
  • my-nice-app/libs/my-nice-lib es un enlace simbólico a ../../my-nice-lib
  • IDE inteligente en Windows, operando en la aplicación abriendo \\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.

Cómo reproducir un ejemplo de trabajo

Ejemplo de trabajo. Paso 1 - Preparación

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:

  1. Tengo este directorio: /mnt/c/tmp que corresponde a C:\tmp .

  2. Puse algunos contenidos en un archivo original.txt . Yo uso el bash de linux para eso. Crear contenido en NTFS

  3. Desde Linux, hago un enlace simbólico relativo linux.txt que apunta a original.txt . Crear enlace desde Linux en NTFS

  4. Luego lo hago desde windows. Desde un CMD con el comando mklink : Crear enlace desde CMD en NTFS

  5. Incluso puedo hacer el enlace simbólico en el lado de la ventana con el comando New-Item desde un powershell elevado Crear enlace desde PowerShell en NTFS

Hasta aquí debería tener un archivo original.txt y tres enlaces linux.txt , cmd.txt y powershell.txt

Ejemplo de trabajo. Paso 2 - Listado de enlaces simbólicos

Éxito: los veo a todos enumerados en cada uno de los 3 shells: linux, cmd y powershell:

Listado en NTFS

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:\... .

Ejemplo de trabajo. Paso 3: acceder a los contenidos a través de enlaces simbólicos

Ahora es el momento de ver si puedo cat ( type en windows) el contenido de todos ellos...

Acceso en NTFS

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...

Cómo reproducir un ejemplo fallido

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...

Ejemplo fallido. Paso 1 - preparación

Empiezo por el linux. Navegar a /tmp y crear contenido ficticio en el sistema de archivos WSL2 . Continúo haciendo el enlace simbólico.

Creando contenido wsl2

Cuando trato de ir allí con el CMD, realmente no puedo porque se queja de ser una ruta UNC:

Navegando UNC en CMD

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.

Creando W:

Pero ahora... oh sorpresa!!! Cuando trato de hacer un enlace simbólico desde el CMD... niega el acceso:

Vinculación desde CMD en WSL2

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" :

Vinculación desde PowerShell en WSL2

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.

Ejemplo fallido. Paso 2: listado + acceso

Comenzando, Linux puede ver enlaces de Linux (por supuesto):

Linux accediendo a WSL2

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:

CMD accediendo a WSL2

Finalmente, al pasar a Powershell, el comportamiento es similar: ve "está ahí", pero no se puede acceder a los contenidos:

PowerShell accediendo a WSL2

Consideraciones finales

  • Ni siquiera estoy pidiendo una conversión de ruta absoluta (como se demuestra en los trabajos de NTFS). Estoy contento con los enlaces relativos
  • He hecho esto con archivos. Pero también falla con los directorios.

Tanta pregunta

¿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.

Investigación realizada hasta el momento

He leído profundamente en su totalidad todos estos:

  • https://docs.docker.com/docker-for-windows/wsl/
  • https://medium.com/@ragin/desarrollo-bajo-windows-bajo-linux-con-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/nuevo-docker-desktop-wsl2-backend/

y muchos más, pero todavía sin suerte.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

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!

  • Inicie su distribución WSL2 Linux.
  • Opcionalmente, haga clic secundario en la parte superior de la ventana, seleccione Propiedades, marque "Usar Ctrl+Shift+C/V como Copiar/Pegar" y seleccione Aceptar.
  • Ejecute git clone git@github.com:<owner>/<repository> para clonar este repositorio en su sistema de archivos de Linux.
  • Clone su clon en el sistema de archivos de Windows: 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).

over 4 years ago · Santiago Trujillo Relatório

0

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 .

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda