Назад | Перейти на главную страницу

Сделать доступными модули ядра, которые были деактивированы в Fedora

редактировать: Я превратил ответ христиан в сценарий, который делает все автоматически: https://github.com/frans-fuerst/magic/blob/master/fedora-activate-can.sh

Мне нужны некоторые модули ядра, которые доступны в исходном коде Linux, но деактивированы в Fedora 20, и мне интересно, как сделать их доступными проще и быстрее всего. (а именно, поддержка net / CAN, приводящая к некоторым модулям can_ *)

Я уже следил этот HowTo (и есть еще много очень похожих), но "построить только модуль"раздел, кажется, работает только для модулей, которые не были отключены, потому что в этом случае даже исходники модулей отсутствуют.

Вот что я пробовал после упомянутого Как:

Сначала я попытался следовать Модули вне дерева раздел, но в этом чертовом дереве исходных текстов kernel-devel даже источники для поддержки CAN отсутствуют. Поэтому я пытаюсь собрать модули из 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

Затем я собираю и получаю предупреждения:

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

Я не получаю первое предупреждение, когда просто бегу make modules но это стоит мне около часа.

Однако после установки .ko файлы находятся не в том каталоге (/usr/lib/modules/3.14.8 скорее, чем /usr/lib/modules/3.14.8-200.fc20.x86_64) и после depmod -a и modprobe can я получил

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

Что я делаю не так?

Думаю, у меня получилось, хотя, наверное, далеко не идеально.

  1. Подготовьте исходный код, запустив

    rpmbuild -bp --target=$(uname -m) kernel.spec
    
  2. Перейдите в каталог сборки, например:

    cd ~/rpmbuild/BUILD/kernel-3.14.fc20/linux-3.14.8-200.fc20.x86_64
    
  3. редактировать Makefile и установить EXTRAVERSION примерно так:

    EXTRAVERSION = -200.fc20.x86_64
    
  4. Включите модули. Я предлагаю начать с соответствующего файла под configs каталог (я использовал kernel-3.14.8-x86_64.config).

  5. Подготовьте ядро ​​к модулям:

    make modules_prepare
    
  6. Соберите модуль:

    make M=drivers/net/can
    
  7. Прибыль! Вставьте модуль:

    insmod can-dev.ko
    

Для полноты картины ниже представлен полный список шагов, необходимых для того, чтобы сделать доступными модули CAN (или любой другой модуль), которые были отключены в Fedora (удаление исходных кодов, поэтому простое использование подхода kernel-devel не делает этого. ).

Эта процедура может быть не идеальной, но она работает для меня и позволяет peak_usb и vcan а также базовые модули CAN на Fedora.

Улучшения приветствуются и будут отмечены, поскольку мне придется делать это очень часто.

  1. вы можете обновить ядро ​​прямо сейчас, чтобы не делать это дважды

    sudo yum update
    reboot
    
  2. подготовить, получить и установить дерево исходного кода ядра 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. редактировать Makefile и установить EXTRAVERSION примерно так:

    cd ~/rpmbuild/BUILD/kernel-3.14.fc20/linux-3.14.8-200.fc20.x86_64
    EXTRAVERSION = -200.fc20.x86_64
    
  4. Настройте ядро, сначала загрузив базовую конфигурацию, например

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

    или

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

    и настройте его, активировав необходимые модули, например

    make menuconfig
    
  5. Соберите модули

    make modules_prepare
    make M=net/can modules
    make M=drivers/net/can modules
    
  6. Установить и загрузить

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