¿Cómo cargar modules de kernel comprimidos en Ubuntu?

Me gustaría usar modules de kernel comprimidos LZMA en mi sistema. Desafortunadamente, Canoncial deja esa característica deshabilitada tanto en el kernel como en las herramientas de espacio de usuario. Esto es lo que hice hasta ahora:

  1. Comstack e instala el núcleo actual 14.04.05-LTS (v4.4.19) con:

    CONFIG_MODULE_COMPRESS=y CONFIG_MODULE_COMPRESS_XZ=y 

    Después de la installation, ahora puedo ver un grupo de files /lib/modules/4.4.19-37.56+/kernel/ en /lib/modules/4.4.19-37.56+/kernel/ .

  2. Copia de kmod_22 package kmod_22 de Xenial (16.04) a Trusty (14.04) configurado con la opción --with-xz . Esto parece funcionar también.

  3. Ejecute update-initrams -u -k 4.4.19-37.56+ .

Lo que funciona hasta ahora:

  • operaciones arbitrarias en modules sin comprimir (como aquellos construidos por DKMS):

     $ modinfo nvidia_370 filename: /lib/modules/4.4.19-37.56+/updates/dkms/nvidia_370.ko […] 
  • mostrando modules comprimidos por su ruta completa:

     modinfo /lib/modules/4.4.19-37.56+/kernel/fs/jfs/jfs.ko.xz 
  • cargando modules comprimidos sin (faltantes) dependencies por su ruta completa:

     insmod /lib/modules/4.4.19-37.56+/kernel/fs/jfs/jfs.ko.xz 
  • descarga de tales modules:

     rmmod jfs 

Lo que no funciona:

  • Descargando con modprobe -r .

  • Cualquier otra operación con solo un nombre de package pero sin ruta, por ejemplo:

     # insmod jfs insmod: ERROR: could not load module jfs: No such file or directory # modprobe jfs modprobe: FATAL: Module jfs not found in directory /lib/modules/4.4.19-37.56+ 

Entonces, para los modules sin dependencies como jfs hay una jfs donde puedo simplemente especificar la ruta completa del file del module a insmod , pero esto es molesto y no realiza una resolución de dependencia como modprobe .

Supongo que el directory del module kernel de alguna manera no recoge los files del module comprimido. ¿Cómo puedo cargar modules comprimidos del núcleo por su nombre con modprobe ?

Necesitas ejecutar depmod .

depmod (de forma pnetworkingeterminada) lee los modules en /lib/modules/$(uname -r) , busca los símbolos que exportan y también lo que necesitan ellos mismos, y luego el uso de esta información crea las dependencies de símbolos (modules) entre los modules y los guarda en el file /lib/modules/$(uname -r)/modules.dep y también crea un hash binary /lib/modules/$(uname -r)/modules.dep.bin .

También crea otros dos files:

  • /lib/modules/$(uname -r)/modules.symbols (y es binary hash /lib/modules/$(uname -r)/modules.dep.bin ): contiene los símbolos que exporta cada module

  • /lib/modules/$(uname -r)/modules.devname : contiene la input /dev que debe crearse para los modules necesarios, contiene el nombre del module, el nombre de la input /dev y los numbers mayores y secundarios

Solo para observar, también puedes ejecutar depmod para una versión de núcleo específica o en un module específico, man depmod .