Pregunta Hacer disponibles los módulos del kernel que han sido desactivados en Fedora


Editar: Transformé la respuesta de los cristianos en un guión que hace todo automáticamente: https://github.com/frans-fuerst/magic/blob/master/fedora-activate-can.sh

Necesito algunos módulos de kernel disponibles en la fuente de Linux pero desactivados en Fedora 20 y me pregunto cuál es la manera más fácil y avanzada de hacerlos disponibles. (es decir, a continuación, soporte de red / CAN que da como resultado algunos módulos can_ *)

  • ¿hay fedora-repos / rpms que hacen que los módulos desactivados estén disponibles?
  • ¿O tengo que compilar estos módulos manualmente?
  • en este caso, ¿existe algún mecanismo para automatizar esto en caso de una actualización del kernel o tengo que compilarlos una y otra vez?

Ya he seguido esta HowTo (y hay muchos más muy similares por ahí) pero el "construir solo un móduloLa sección "parece funcionar solo para módulos que no han sido deshabilitados porque en ese caso faltan las fuentes del módulo.

Esto es lo que intenté siguiendo lo mencionado Cómo:

Primero intenté seguir el Módulos fuera de árbol sección, pero en ese maldito árbol de origen enviado con kernel-devel incluso faltan las fuentes para soporte CAN. Así que trato de construir los módulos desde el src.rpm:

$ yumdownloader --source kernel
$ sudo yum-builddep kernel-3.14.8-200.fc20.src.rpm
$ rpm -Uvh kernel-3.14.8-200.fc20.src.rpm
$ cd ~/rpmbuild/SPECS
$ rpmbuild -bp --target=$(uname -m) kernel.special
$ cd ~/rpmbuild/BUILD/<kerneldir>/<linuxdir>
$ <configure the kernel using menuconfig>
$ make prepare

Luego construyo y recibo algunas advertencias:

$ make -C /lib/modules/`uname -r`/build M=`pwd`/net/can modules
make: Entering directory `<rpmbuild-BUILD-kernel-linux-dir>'

  WARNING: Symbol version dump <rpmbuild-BUILD-kernel-linux-dir>/Module.symvers
           is missing; modules will have no dependencies and modversions.

  CC [M]  <rpmbuild-BUILD-kernel-linux-dir>/net/can/bcm.o
  CC [M]  <rpmbuild-BUILD-kernel-linux-dir>/net/can/gw.o
  CC [M]  <rpmbuild-BUILD-kernel-linux-dir>/net/can/raw.o
  CC [M]  <rpmbuild-BUILD-kernel-linux-dir>/net/can/af_can.o
  CC [M]  <rpmbuild-BUILD-kernel-linux-dir>/net/can/proc.o
  LD [M]  <rpmbuild-BUILD-kernel-linux-dir>/net/can/can.o
  LD [M]  <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-raw.o
  LD [M]  <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-bcm.o
  LD [M]  <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-gw.o
  Building modules, stage 2.
  MODPOST 4 modules
  CC      <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-bcm.mod.o
  LD [M]  <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-bcm.ko
  CC      <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-gw.mod.o
  LD [M]  <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-gw.ko
  CC      <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-raw.mod.o
  LD [M]  <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-raw.ko
  CC      <rpmbuild-BUILD-kernel-linux-dir>/net/can/can.mod.o
  LD [M]  <rpmbuild-BUILD-kernel-linux-dir>/net/can/can.ko
make: Leaving directory `<rpmbuild-BUILD-kernel-linux-dir>'

$ sudo make -C /lib/modules/`uname -r`/build M=`pwd`/net/can modules_install
make: Entering directory `<rpmbuild-BUILD-kernel-linux-dir>'
  INSTALL <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-bcm.ko
Can't read private key
  INSTALL <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-gw.ko
Can't read private key
  INSTALL <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-raw.ko
Can't read private key
  INSTALL <rpmbuild-BUILD-kernel-linux-dir>/net/can/can.ko
Can't read private key
  DEPMOD  3.14.8
make: Leaving directory `<rpmbuild-BUILD-kernel-linux-dir>'

No recibo la primera advertencia cuando corro make modules Pero esto me cuesta alrededor de una hora.

Sin embargo después de la instalación, el .ko los archivos se encuentran en el directorio incorrecto (/usr/lib/modules/3.14.8 más bien que /usr/lib/modules/3.14.8-200.fc20.x86_64) y después depmod -a y modprobe can yo obtengo

modprobe: ERROR: could not insert 'can': Exec format error

¿Qué estoy haciendo mal?


6
2018-06-18 12:46


origen


¿Los módulos que desea están incluidos en src.rpm? Si es así, ¿por qué no instalar el src.rpm, parchear el .configpara habilitarlos y luego construir el RPM? También es probable que pueda compilar solo esos módulos siguiendo la sección "Crear solo módulos de kernel (módulos fuera de árbol)" de ese manual. - Cristian Ciupitu
Así lo hice. Pero tal vez necesito algunas instrucciones detalladas para eso. No puedo simplemente construir los módulos requeridos corriendo make M='pwd'/net/can modules. yo obtengo WARNING: Symbol version dump <DIR>/Module.symvers is missing; modules will have no dependencies and modversions. Cuando acabo de correr make modules Los módulos están construidos, pero no puedo instalarlos en la ubicación correcta. Cuando los copio manualmente y trato de cargarlos obtengo modprobe: ERROR: could not insert 'can': Exec format error - frans
Hay una pregunta similar en Ask Ubuntu: "¿Cómo compilo un único módulo de kernel en árbol?" (y también pasa a ser de CONFIG_CAN_PEAK_USB). - Cristian Ciupitu
Desafortunadamente, esta es una situación diferente: en Ubuntu todo está bien porque existe la fuente de los módulos CAN. El archivo .symvers enviado con Fedora no contiene información sobre los módulos CAN. Parece que tengo que migrar a Ubuntu si no quiero compilar un kernel muy único que se está lanzando ... - frans


Respuestas:


Creo que lo tengo, aunque probablemente esté lejos de ser perfecto.

  1. Preparar el código fuente ejecutando

    rpmbuild -bp --target=$(uname -m) kernel.spec
    
  2. Vaya al directorio de compilación, por ejemplo por:

    cd ~/rpmbuild/BUILD/kernel-3.14.fc20/linux-3.14.8-200.fc20.x86_64
    
  3. Editar Makefile y establecer EXTRAVERSION a algo como:

    EXTRAVERSION = -200.fc20.x86_64
    
  4. Habilitar los módulos. Sugiero comenzar con el archivo correspondiente debajo de la configs directorio (utilicé kernel-3.14.8-x86_64.config).

  5. Preparar el kernel para los módulos:

    make modules_prepare
    
  6. Construye el módulo:

    make M=drivers/net/can
    
  7. ¡Lucro! Inserte el módulo:

    insmod can-dev.ko
    

6
2018-06-23 19:02



Lo comprobaré mañana y, en caso de que funcione, realmente mereces esta recompensa :) Pero al mismo tiempo, estoy realmente atónito acerca de cómo Fedora trata a las personas que desean modificar su sistema ... bugzilla.redhat.com/show_bug.cgi?id=871655 También demuestra esta actitud. - frans
Los enlaces de Markdown son viceversa. [...](...). Podrías solicitar incluir los módulos en el kernel-modules-extra paquete (aunque probablemente lo rechacen por el mismo motivo) o tal vez pregunten a los chicos de RPM Fusion. - Cristian Ciupitu


Para completar, aquí hay una lista completa de los pasos que debe realizar. los módulos CAN (o cualquier otro módulo) disponibles que se han deshabilitado en Fedora (eliminando las fuentes, por lo que solo usar el enfoque de desarrollo del núcleo no lo hace).

Este procedimiento puede no ser perfecto pero funciona para mí y me permite peak_usb y vcan así como módulos de base CAN en Fedora.

Las mejoras son apreciadas y serán honradas ya que tendré que hacer esto muy a menudo ..

  1. es posible que desee actualizar su kernel ahora para no tener que hacerlo dos veces

    sudo yum update
    reboot
    
  2. preparar, obtener e instalar el árbol fuente de kernel de Fedora

    rpmdev-setuptree
    yumdownloader --source kernel
    sudo yum-builddep kernel-3.14.8-200.fc20.src.rpm
    rpm -Uvh kernel-3.14.8-200.fc20.src.rpm
    cd ~/rpmbuild/SPECS
    rpmbuild -bp --target=$(uname -m) kernel.spec
    
  3. Editar Makefile y establecer EXTRAVERSION a algo como:

    cd ~/rpmbuild/BUILD/kernel-3.14.fc20/linux-3.14.8-200.fc20.x86_64
    EXTRAVERSION = -200.fc20.x86_64
    
  4. Configure el kernel obteniendo primero una configuración base, p. Ej.

    cp /boot/config-3.14.8-200.fc20.x86_64 .config
    

    o

    cp configs/kernel-3.14.8-x86_64.config .config
    

    y configúrelo activando los módulos necesarios, por ejemplo,

    make menuconfig
    
  5. Construir los modulos

    make modules_prepare
    make M=net/can modules
    make M=drivers/net/can modules
    
  6. Instalar y cargar

    sudo make M=net/can modules_install
    sudo make M=drivers/net/can modules_install
    sudo depmod -a
    sudo modprobe can
    

0
2018-06-24 10:03