¿Cómo (receta) construir un solo módulo del núcleo?

35

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

Es por eso que quiero editar / parchear la fuente de solo ese módulo de núcleo único para agregar una salida de depuración adicional. El módulo del kernel en cuestión es mvsasy no es necesario 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 configuración y construcción. Necesito dos recetas:

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

Las fuentes que se han utilizado son:

Pro Backup
fuente
Posible duplicado de ¿Cómo construyo un solo módulo de kernel en árbol?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
quizás este artículo también ayude: stackoverflow.com/questions/8744087/…
Oleg Kokorin

Respuestas:

33

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

Configurar una vez

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

Soy demasiado vago para copiar los archivos fuente del controlador específico mvsas; simplemente cópielos a su directorio de trabajo actual. Si apt-getda como resultado un mensaje de error sobre los URI de origen faltantes , consulte la nota n. ° 4 al final.

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

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

Cada versión del kernel

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

Esto instalará los encabezados y el archivo de configuración del kernel 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 que aparezca el mensaje " sin versión de símbolo para module_layout " al cargar 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 del núcleo original (compilación de 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 .koarchivo del módulo del kernel utilizando la configuración del kernel de la distribución de Ubuntu que tiene almacenada /lib/modules/$(uname -r)/.

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

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

$ lsmod | grep mvsas

Si esto resulta en alguna salida, el módulo mvsas necesita descargarse modprobe -r mvsasprimero con ( ).

$ sudo modprobe -v mvsas

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

Verifique la salida para verificar que /lib/modules/.../extra/mvsas.kose 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)tiempo en la salida detallada de modprobe que verá que insmodestá intentando cargar el módulo desde la ubicación predeterminada del núcleo. 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 nuevamente:

# depmod
# sudo modprobe -v mvsas

Notas

  1. Puede darse el caso de que los .koarchivos del módulo resultante sean mucho (por ejemplo, 20 veces) más grandes que los archivos del módulo original distribuidos por Ubuntu; en ese caso, el make preparepaso podría haber creado un desarrollador de Linux para depurar el archivo de configuración del núcleo y usted está construyendo desde el directorio fuente. Su -Cparam podría no funcionar como se esperaba.
  2. He visto guías con otros comandos como make modules_preparey make M=scripts/modpero no creo que sean necesarios para este caso.
  3. Puede usar la configuración de depuración de desarrolladores de Linux reemplazando -C /lib/modules/$(uname -r)/buildcon-C /usr/src/linux-headers-$(uname -r)
  4. En una configuración predeterminada, apt-get source linux-sourcesdevolverá el error E: You must put some 'source' URIs in your sources.list. Para solucionar este problema, puede modificar el archivo /etc/apt/sources.listdescomentando (eliminando #el inicio de) la primera deb-srclínea. Ejemplo para Ubuntu 17.10: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted. ejecutar sudo apt-get update, y luego el comando entregará fuentes para usted. Consulte también esta pregunta donde también se describe un método GUI para hacerlo.
Pro Backup
fuente
Obtuve el error: / bin / sh: arm-none-linux -gnueabi-gcc: no encontrado
Dr.jacky
$(uname-r)aparentemente está mal ... Necesitas llamar al shellincorporado:$(shell uname -r)
Albus Dumbledore
2
@AlbusDumbledore También veo casos en los $(shell uname -r)que no funciona . ¿Por qué $(uname -r)aparentemente está tan mal?
Pro Backup el
También tuve que llamar echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.confpara que depmodvea el archivo recién actualizado .../extra.
Martin Pecka
1
¿Qué hacer con el error de firma del módulo, cómo evitarlo? `` `INSTALAR /home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko En main.c: 158: - Error de SSL: 02001002: biblioteca del sistema: fopen: No existe tal archivo o directorio: bss_file.c: 175 - Error de SSL: 2006D080: BIO rutinas: BIO_new_file: no existe ese archivo: bss_file.c: 178 archivo de firma: certs / firmado_key.pem: No existe dicho archivo o directorio `` `
Envek