LINUX.ORG.RU
решено ФорумAdmin

Сборка модуля ядра

 , ,


0

1

Возник один вопрос, зачем при сборке модулей ядра нужна команда:

make prepare modules_prepare
Пытаюсь собрать ipt_netflow, там в README есть следующий пункт:

1. Prepare Kernel source

   If you have package system install kernel-devel package, otherwise install
   raw kernel source from http://kernel.org matching _exactly_ version of your
   installed kernel.

   a) What to do for Centos:

      ~# yum install kernel-devel

   b) What to do for Debian and Ubuntu:

      ~# apt-get install module-assistant
      ~# m-a prepare

   c) Otherwise, if you downloaded raw kernel sources don't forget to create
    .config by copying it from your distribution's kernel. Its copy could reside
    in /boot or sometimes in /proc, examples:

      kernel-src-dir/# cp /boot/config-`uname -r` .config
    or
      kernel-src-dir/# zcat /proc/config.gz > .config

    Assuming you unpacked kernel source into `kernel-src-dir/' directory.
    Then run:

      kernel-src-dir/# make oldconfig

    After that you'll need to prepare kernel for modules build:

      kernel-src-dir/# make prepare modules_prepare

   Note: Don't try to `make prepare' in Centos kernel-devel package directory
     (which is usually something like /usr/src/kernels/2.6.32-431.el6.x86_64)
     as this is wrong and meaningless.

У меня как раз CentOS. Что эта команда делает? Я правильно понимаю, что она подготавливает заголовки и либы, которые необходимы gcc для компиляции? Но после я уйду из каталога исходников ядра и перейду в каталог исходников собираемого модуля, как тогда gcc будет знать где эти заголовки и либы лежат? И опять же вопрос, каталог исходников ядра это какой, не /usr/src/kernels/3.10.0-1160.2.2.el7.x86_64 сказано же, что в этом каталоге запускать команду не следует. Исходники ядра я могу получить командами:

yumdownloader --source kernel-3.10.0-1160.el7
rpm -i kernel-3.10.0-1160.el7.src.rpm
rpmbuild -bp rpmbuild/SPECS/kernel.spec
в этом случае исходники распакуются в ~rpmbuild/BUILD/kernel-3.10.0-1160.el7/linux-3.10.0-1160.el7.x86_64 Вобщем как делать правильно, чтобы собралось?

★★★★★

как тогда gcc будет знать где эти заголовки и либы лежат?

Скрипт .configure из ваших ipt_netflow посмотрит uname, потыкается по стандарным местам, определит где ядро и запишет местоположение исходников. Ну и далее по тексту README есть:

c) If you have sources in non-standard places or configure isn't able to find something run ./configure --help to see how to specify paths manually.

В случае Centos устанавливаемый пакет kernel-devel уже содержит все нужные файлы, которые в исходниках обычного ядра появляются после ″make modules_prepare″. Поэтому только установить пакет и переходить к шагу 2.

mky ★★★★★ ()
Ответ на: комментарий от mky

которые в исходниках обычного ядра появляются после ″make modules_prepare″

Бывает, что даже имея kernel headers на различных дистрибутивах, модуль ядра собрать не выходит. Для этого там идет пакет с необходимыми артефактами сборки, помимо заголовков

Может ли modules_prepare создать эти файлы или это невозможно? В том плане, что команда не для того, о чем подумал я

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Формально, modules_prepare должен создать всё необходимое для сборки, но, в документации ядра есть такое:

NOTE: “modules_prepare” will not build Module.symvers even if CONFIG_MODVERSIONS is set; therefore, a full kernel build needs to be executed to make module versioning work.

mky ★★★★★ ()