fragen stichworte

Machen Sie Kernel-Module verfügbar, die auf Fedora deaktiviert wurden

Bearbeiten: Ich habe Cristians Antwort in ein Skript umgewandelt, das alles automatisch erledigt: https://github.com/frans-fuerst/magic/blob/master/fedora-activate-can .sh

Ich brauche einige Kernel-Module, die in der Linux-Quelle verfügbar sind, aber auf Fedora 20 deaktiviert sind, und ich frage mich, was der einfachste und vorwärtsste Weg ist, sie verfügbar zu machen. (Nämlich dann net/CAN-Support, was zu einigen can_ * -Modulen führt)

  • Gibt es Fedora-Repos/RPMs, die deaktivierte Module verfügbar machen?
  • oder muss ich diese Module manuell kompilieren?
  • In diesem Fall - gibt es einen Mechanismus, um dies im Falle eines Kernel-Updates zu automatisieren, oder muss ich sie immer wieder kompilieren?

Ich habe diesem HowTo bereits gefolgt (und es gibt viele weitere, die sich sehr ähneln), aber der Abschnitt "Nur Modul erstellen" scheint nur für Module zu funktionieren, die dies tun wurde nicht deaktiviert, da in diesem Fall sogar die Modulquellen fehlen.

Hier habe ich versucht, dem HowTo zu folgen:

Zuerst habe ich versucht, dem Abschnitt Out Of Tree-Module zu folgen, aber in diesem verdammten Quellbaum, der mit kernel-devel ausgeliefert wird, fehlen sogar die Quellen für die CAN-Unterstützung. Also versuche ich, die Module aus der src.rpm zu erstellen:

$ 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

Dann baue ich einige Warnungen auf:

$ 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>'

Ich bekomme die erste Warnung nicht, wenn ich nur make modules starte, aber das kostet mich ungefähr eine Stunde.

Nach der Installation befinden sich die Dateien .ko jedoch im falschen Verzeichnis (/usr/lib/modules/3.14.8 und nicht /usr/lib/modules/3.14.8-200.fc20.x86_64) und nach depmod -a und modprobe can bekomme ich

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

Was mache ich falsch?

antworten

Ich glaube, ich habe es verstanden, obwohl es wahrscheinlich alles andere als perfekt ist.

  1. Bereiten Sie den Quellcode vor, indem Sie

    ausführen
    rpmbuild -bp --target=$(uname -m) kernel.spec
    
  2. Wechseln Sie in das Build-Verzeichnis, zum Beispiel durch:

    cd ~/rpmbuild/BUILD/kernel-3.14.fc20/linux-3.14.8-200.fc20.x86_64
    
  3. Bearbeiten Sie Makefile und setzen Sie EXTRAVERSION auf etwas wie:

    EXTRAVERSION = -200.fc20.x86_64
    
  4. Aktivieren Sie die Module. Ich schlage vor, mit der entsprechenden Datei unterhalb des Verzeichnisses configs zu beginnen (ich habe kernel-3.14.8-x86_64.config verwendet).

  5. Bereiten Sie den Kernel für Module vor:

    make modules_prepare
    
  6. Erstellen Sie das Modul:

    make M=drivers/net/can
    
  7. Profitieren Sie! Fügen Sie das Modul ein:

    insmod can-dev.ko
    

Der Vollständigkeit halber finden Sie hier eine vollständige Liste der Schritte, die Sie ausführen müssen die verfügbaren CAN-Module (oder jedes andere Modul), die auf Fedora deaktiviert wurden (das Entfernen der Quellen, also macht es nur der Kernel-devel-Ansatz nicht).

Dieses Verfahren ist vielleicht nicht perfekt, aber es funktioniert für mich und ermöglicht peak_usb und  vcan sowie Basis-CAN-Module auf Fedora.

Verbesserungen werden geschätzt und werden geehrt, da ich das sehr oft machen muss.

  1. möchten Sie vielleicht Ihren Kernel jetzt aktualisieren, um es nicht zweimal zu tun

    sudo yum update
    reboot
  2. Bereiten Sie die Fedora-Kernel-Quellstruktur vor, installieren Sie sie und installieren Sie sie.

    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. Bearbeite Makefile und setze EXTRAVERSION auf etwas wie:

    cd ~/rpmbuild/BUILD/kernel-3.14.fc20/linux-3.14.8-200.fc20.x86_64
    EXTRAVERSION = -200.fc20.x86_64
  4. Konfigurieren Sie den Kernel, indem Sie zuerst eine Basiskonfiguration z.

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

    oder

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

    und konfigurieren Sie es durch Aktivieren der benötigten Module, z.

    make menuconfig
  5. Erstellen Sie die Module

    make modules_prepare
    make M=net/can modules
    make M=drivers/net/can modules
  6. Installieren und laden

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