wsl2: *** /lib/modules/...build: No existe tal solución de error de archivo o directorio
*** /lib/modules/…build: No existe tal solución de error de archivo o directorio
Este artículo duró un mes completo, del 5 de abril al 5 de mayo, antes de que se resolviera este problema. La siguiente es mi experiencia para su referencia:
Análisis de causa
El kernel de wsl2 ha sido modificado. No hay un kernel correspondiente para wsl o la inconsistencia entre la versión del kernel de wsl y la versión del módulo de módulos conduce a un error.
1. Compruebe la versión del kernel:
uname -r
/2 Ver la versión del módulo de módulos en la ruta /lib/modules
cd /lib/modules
ls
Si no hay nada en el directorio después de ls, significa que el módulo de módulos no está instalado. Simplemente use el paso 2 de la solución.
Si no hay contenido correspondiente a la versión uname -r, sino a otras versiones, significa que la versión instalada es incorrecta. Tenga en cuenta que las inconsistencias de versión no son solo números diferentes, sino también letras diferentes son inconsistencias de versión. Use resolver los pasos 1, luego 2.
Nuestro objetivo final es hacer que la versión consultada por uname -r sea exactamente igual a la versión del módulo de módulos en la ruta cd /lib/modules.
Solución
No intente usar el método de forzar la correspondencia del contenido de diferentes versiones cambiando el nombre, porque el contenido del archivo principal es inconsistente e insmod seguirá cometiendo un error. (Lecciones de sangre y lágrimas) Lo siguiente proporciona una solución razonable:
1. Vuelva a instalar Ubuntu (omita este paso si no hay ningún módulo instalado)
Tenga en cuenta que si hay archivos importantes en wsl, primero debe hacer una copia de seguridad de ellos en Windows, porque esto es equivalente a reinstalar un sistema wsl2.
(1) Desinstalar Ubuntu (es decir, la distribución de Linux)
Vaya a la función de la aplicación en la configuración y desinstale la distribución de Linux.
(2) Desinstalar wsl2
Busque linux en el cuadro de búsqueda, elimine el Subsistema de Windows para Linux
(3) Servicio Pesado
Abra la tienda de Microsoft, busque Ubuntu y descargue una distribución más nueva. (Elegí 20.04)
Haga clic en Obtener.
Solo descárgalo, no lo ejecutes todavía.
(4) Reinstalar wsl2
Busque el archivo smi que descargó antes de actualizar wsl a wsl2. Si
no puede encontrarlo, descargue uno nuevo.
URL: https://learn.microsoft.com/zh-cn/windows/wsl/install-manual
Buscar paso 4 - descargue el kernel de Linux Complete el paquete de actualización
1. Descargue el paquete más reciente
y haga clic para descargar.
A continuación, haga clic en el archivo smi que acaba de descargar
. No necesita modificar nada, simplemente haga clic hasta que se complete la instalación.
(5) Ejecución de prueba
En este punto, Ubuntu se ha reinstalado y necesitamos restablecer el nombre de usuario y la contraseña. En este momento, no hay contenido en la ruta /lib/modules.
2. Instale manualmente el kernel en la ruta /lib/modules
Al compilar el controlador, se requieren el archivo de encabezado del kernel y el archivo de módulos.
El kernel de WSL2 ha sido modificado y no puede usar el kernel upstream de ubuntu, por lo tanto, necesitamos compilar e instalar manualmente una versión.
(1) Descarga el código del kernel
Ingrese al sitio web de github: https://github.com/microsoft/WSL2-Linux-Kernel
Encuentre la versión correspondiente a la versión encontrada por uname -r.
Haga clic en la etiqueta y luego ingrese el contenido digital correspondiente.
Copie el nombre de la versión correspondiente a las etiquetas (porque solo descargamos una versión de rama en lugar de la versión completa)
y luego ingrese el comando en la terminal de Linux
git clone -b xxx --depth=1 https://github.com/microsoft/WSL2-Linux-Kernel
xxx es el nombre de la versión correspondiente de las etiquetas. Por ejemplo, reemplacé xxx aquí con linux-msft-wsl-5.10.16.3
depth=1, lo que significa que el tamaño del paso es 1, lo que significa descargar la primera versión bajo este rama (aquí no necesitamos cambiar)
(2) Compilar e instalar
Primero, para descargar algunas bibliotecas necesarias
sudo apt install ncurses-dev
sudo apt install flex
sudo apt install bison
sudo apt install libssl-dev
A continuación, configure el entorno.
cd WSL2-Linux-Kernel
LOCALVERSION= make KCONFIG_CONFIG=Microsoft/config-wsl -j8
sudo LOCALVERSION= make KCONFIG_CONFIG=Microsoft/config-wsl modules_install -j8
Finalmente, instale los encabezados (si la versión del kernel de ubuntu es relativamente nueva, este paso no es necesario)
sudo make headers_install ARCH=x86_64 INSTALL_HDR_PATH=/usr
Una vez completada la instalación, se generará una carpeta consistente con la versión actual del kernel en el directorio /lib/modules/.
(3) Comprobar (compilación de controladores)
➜ hola make
make -C /lib/modules/5.10.74.3-microsoft-standard-WSL2/build M=/home/dw/src/drivers/study/hello modules
make[1]: Ingresando al directorio '/home/dw/ src/kernel/WSL2-Linux-Kernel'
CC [M] /home/dw/src/drivers/study/hello/hello.o
MODPOST /home/dw/src/drivers/study/hello/Module.symvers
CC [M ] /home/dw/src/drivers/study/hello/hello.mod.o
LD [M] /home/dw/src/drivers/study/hello/hello.ko
make[1]: Dejando el directorio '/home/ dw/src/kernel/WSL2-Linux-Kernel'
➜ hola sudo insmod ./hello.ko
➜ hola dmesg
[19254.803777] Hola mundo enter
➜ hola
Rehacer, ejecutar con éxito. Entonces insmod, éxito.