Leer en inglés

Compartir a través de


WSL Plugins

Las aplicaciones de Windows ahora pueden crear e interactuar con los procesos de Linux que se ejecutan dentro del Subsistema de Windows para Linux (WSL) con complementos WSL. En este artículo se proporciona información general sobre cómo funcionan y cómo empezar a usarlos.

Descripción de la funcionalidad del complemento

Los complementos WSL proporcionan estas funcionalidades principales:

  • Permite a las aplicaciones especificar un ejecutable de Windows que se inicia cuando se inicia la máquina virtual WSL.
  • El ejecutable de Windows puede crear procesos de Linux dentro de WSL y puede comunicarse directamente con ellos mediante un socket virtualizado.

Con estas, las aplicaciones de Windows pueden basarse en experiencias de WSL y proporcionar funcionalidad adicional relacionada con el Subsistema de Windows para Linux.

Instalación de un complemento

Como creador del complemento WSL, puede instalar el complemento en una máquina estableciendo una clave del Registro para que apunte al archivo DLL del complemento.

Y como usuario de WSL, cualquier aplicación que use instalará automáticamente los complementos WSL como parte de su proceso de instalación normal.

Creación de su propio complemento

Para iniciar un proyecto de complemento, deberá compilar un archivo dll Win32. La manera más sencilla de configurar con esto es probar nuestro proyecto de ejemplo de complemento de WSL. Para ello, puede clonar el repositorio de ejemplo del complemento WSL de una carpeta local con git clone y abrirlo en Visual Studio.

Cuando abra el proyecto, vaya al dllmain.cpp archivo (https://github.com/microsoft/wsl-plugin-sample/blob/main/plugin.cpp) y verá la lista de funciones disponibles para los complementos de WSL.

A continuación, puede presionar la “pestaña Compilar” y compilar el proyecto, que generará un archivo DLL listo para usar, probablemente en wsl-plugin-sample\x64\Debug\WSLPluginSample.dll.

Prueba del complemento

Los complementos WSL solo se ejecutarán si firmados digitalmente. Para probar esto, deberá habilitar la firma de prueba en el equipo.

Habilitación de la firma de pruebas y creación de una certificación de prueba

Abra una ventana de PowerShell con privilegios elevados y habilite la firma de pruebas mediante la ejecución de este comando:

## If this command results in "The value is protected by Secure Boot policy and cannot be modified or deleted"
## Then reboot the PC, go into BIOS settings, and disable Secure Boot. BitLocker may also affect your ability to modify this setting.
Bcdedit.exe -set TESTSIGNING ON

Una vez habilitada la firma de prueba (un reinicio puede ser necesario), en un símbolo del sistema de PowerShell con privilegios elevados que se encuentra en el directorio del archivo WSLPluginSample.dll creado anteriormente, crearemos un certificado de prueba de WSL:

# Create the cert
$certname = "WSLPluginTestCert"
$cert = New-SelfSignedCertificate -Subject "CN=$certname" -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature -KeyLength 2048 -KeyAlgorithm RSA -HashAlgorithm SHA256 -Type CodeSigningCert

# Export it to a local path
Export-Certificate -Cert $cert -FilePath ".\$certname.cer"

# Sign the DLL file
Set-AuthenticodeSignature -FilePath "C:\dev\Path\To\Your\WSLPlugin.dll" -Certificate $cert

Importe por última vez el certificado a la entidad de certificación raíz de confianza:

certutil -addstore "Root" ".\$certname.cer"

Vea el cómo crear un certificado autofirmado página de documentos para obtener más información.

Instalación del complemento

En la misma ventana de PowerShell con privilegios elevados, ejecute el siguiente comando para instalar el complemento y asegúrese de cambiar la ruta de acceso al archivo DLL del complemento a la ruta de acceso existente:

Reg.exe add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\Plugins /v demo-plugin /t REG_SZ /d C:\Path\to\plugin.dll  /f

Para usar el complemento, reinicie el servicio wsl mediante:

sc.exe stop wslservice
wsl.exe echo “test”

El complemento ahora debe cargarse. Vea la sección Solución de problemas e información adicional para obtener más información si el complemento no se pudo cargar.

Y, cuando haya terminado, puede ejecutar este comando para quitar el complemento (tenga en cuenta que deberá reiniciar el servicio WSL para que surta efecto):

Reg.exe delete HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\Plugins /v demo-plugin

Solución de problemas e información adicional

Códigos de error comunes:

  • Wsl/Service/CreateInstance/CreateVm/Plugin/ERROR_MOD_NOT_FOUND:> No se pudo cargar el archivo DLL del complemento. Compruebe que la ruta de acceso de registro del complemento es correcta
  • Wsl/Service/CreateInstance/CreateVm/Plugin/TRUST_E_NOSIGNATURE:> el archivo DLL del complemento no está firmado o el equipo no confía en su firma
  • Wsl/Service/CreateInstance/CreateVm/Plugin/*:> el archivo DLL del complemento devolvió un error en WSLPLUGINAPI_ENTRYPOINTV1 o OnVmStarted()
  • Wsl/Service/CreateInstance/Plugin/*:> el archivo DLL del complemento devolvió un error en OnDistributionStarted()

Espacio de usuario de Linux en complementos

Los procesos de Linux creados a través de ExecuteBinary() se ejecutarán en el espacio de nombres raíz de la máquina virtual WSL2. Este espacio de nombres no está asociado a ninguna distribución y tiene un sistema de archivos raíz basado en Mariner muy mínimo.

Ese sistema de archivos es un tmpfs grabable, lo que significa que todos los cambios realizados en él se quitarán cuando se apague la máquina virtual WSL2.

Puede inspeccionar el contenido del espacio de nombres raíz ejecutando wsl --debug-shell mientras WSL se está ejecutando.

Consideraciones adicionales

  • Todos los enlaces del complemento WSL son sincrónicos, lo que significa que WSL esperará a que se completen los enlaces del complemento antes de continuar.
  • WSL considera irrecuperable cualquier error devuelto por un complemento (lo que significa que la distribución del usuario no se iniciará)
  • El código del complemento se ejecuta en el mismo espacio de direcciones que el servicio WSL. Cualquier bloqueo de un complemento bloqueará todo el servicio WSL, lo que podría provocar la pérdida de datos.