¿Cómo (receta) construir solo un módulo kernel?

24

Tengo un error en un módulo del kernel de Linux que hace que el kernel Ubuntu 14.04 stock se cuelgue (crash).

Es por eso que quiero editar / parche el origen de solo ese único módulo del núcleo para agregar algún resultado de depuración adicional. El módulo kernel en cuestión es mvsas y no es necesario para arrancar. Por esa razón, no veo ninguna necesidad de actualizar ninguna imagen initrd.

He leído mucha información (como se muestra a continuación) y encuentro la confusión del proceso de instalación y compilación. Necesito dos recetas:

  1. para configurar / configurar el entorno de compilación una vez
  2. pasos a seguir después de editar cualquier archivo fuente de este módulo kernel ( .c y .h ) y convertir esa edición en un nuevo módulo kernel ( .ko )

Las fuentes que se han utilizado son:

pregunta Pro Backup 24.08.2014 - 11:50

1 respuesta

24

Es posible que la receta para crear un módulo personalizado deba dividirse en tres secciones.

Configuración una vez

$ cd ~
$ apt-get source linux-source-3.13.0 

Soy demasiado perezoso para copiar los archivos fuente del controlador específico mvsas; solo cópielos todos a su directorio de trabajo actual. Si apt-get da como resultado un mensaje de error sobre URI de origen faltantes , entonces vea la nota # 4 en la parte inferior.

$ cd linux-3.13.0
$ make oldconfig
$ make prepare
$ make scripts

Esto preparará algunos archivos necesarios para construir un módulo kernel.

Cada versión del kernel

$ apt-get install linux-headers-$(uname -r)

Esto instalará los encabezados y el archivo de configuración del núcleo de Ubuntu para esa versión del kernel en / lib / modules.

$ cd ~/linux-3.13.0
$ cp -v /usr/src/linux-headers-$(uname -r)/Module.symvers .

Esto para evitar el mensaje " sin versión de símbolo para module_layout " cuando se carga el módulo con insmod o modprobe.

$ mv -v /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko.backup

Esto cambiará el nombre del módulo kernel original (versión Ubuntu) para asegurarse de que se cargará el parche personalizado.

Cada edición

$ cd ~/linux-3.13.0/drivers/scsi/mvsas
$ nano mv_sas.h
$ nano mv_sas.c

Estos son para las ediciones.

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

Esto compilará y compilará el archivo del kernel .ko utilizando la configuración del kernel de la distribución de stock de Ubuntu almacenada en /lib/modules/$(uname -r)/ .

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

Esto instalará el módulo kernel en /lib/modules/$(uname -r)/extra/ , sin sobrescribir el módulo de distribución en caso de que no haya cambiado el nombre del archivo del módulo de kernel de distribución. En este caso de mvsas también se ejecutará depmod .

$ lsmod | grep mvsas

Si esto resulta en algún resultado, el módulo mvsas necesita descargarse primero con ( modprobe -r mvsas ).

$ sudo modprobe -v mvsas

Esto debería cargar el nuevo módulo kernel.

Verifique la salida para verificar que /lib/modules/.../extra/mvsas.ko se esté cargando.

Error de Modprobe: no se pudo insertar

En algunos casos, es posible que experimente un modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg) , mientras que en el resultado de la modprobe verbosa, verá que insmod está intentando cargar el módulo desde la ubicación predeterminada del kernel. Por ejemplo:

# insmod /lib/modules/3.17.0-031700rc7-generic/kernel/drivers/scsi/pm8001/pm80xx.ko
modprobe: ERROR: could not insert 'pm80xx': Unknown symbol in module, or unknown parameter (see dmesg)

En ese caso, debe ejecutar depmod manualmente e intentar cargar el módulo de nuevo:

# depmod
# sudo modprobe -v mvsas

Notas

  1. Puede ser que los archivos del módulo resultante .ko tengan un tamaño mucho mayor (por ejemplo 20 veces) que los archivos del módulo original distribuidos por Ubuntu; en ese caso, el paso make prepare podría haber creado un archivo de configuración de núcleo de depuración de desarrolladores de Linux y está compilando desde el directorio de origen. Su -C param podría no funcionar como se esperaba.
  2. He visto guías con otros comandos como make modules_prepare y make M=scripts/mod , pero no creo que sean necesarios para este caso.
  3. Puede usar la configuración de depuración de los desarrolladores de Linux reemplazando -C /lib/modules/$(uname -r)/build con -C /usr/src/linux-headers-$(uname -r)
  4. En una configuración predeterminada, apt-get source linux-sources devolverá el error E: You must put some 'source' URIs in your sources.list . Para solucionar este problema, puede modificar el archivo /etc/apt/sources.list al descomentar (eliminando el # inicial de) la primera línea deb-src . Ejemplo para Ubuntu 17.10: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted . Ejecute sudo apt-get update , y luego el comando le entregará las fuentes. Ver también esta pregunta donde El método GUI para hacer esto también se describe.
respondido por el Pro Backup 24.08.2014 - 11:50

Lea otras preguntas en las etiquetas