Обычно исходный код ядра хранится в /usr/src/linux-2.6.x/
.
Чтобы не перекомпилировать все ядро, если я изменяю источник модуля, как я могу перекомпилировать именно этот модуль?
Как перекомпилировать только один модуль ядра?
Ответ 1
Перейдите в корневой каталог исходного дерева и выполните следующую команду:
$ make modules SUBDIRS=drivers/the_module_directory
А для установки скомпилированного модуля:
$ make modules_install SUBDIRS=drivers/the_module_directory
Примечание. Как упоминает Лунакид, последняя команда может не создавать модуль сначала, поэтому будьте осторожны.
Ответ 2
начиная с версий ядра 3.xx и 4.xx, процедура усложняется (но есть надежда, так что продолжайте читать):
-
make distclean
если вы не просто клонировали новый источник, но раньше использовали для сборки других модулей - создайте новую папку где-нибудь для исходного кода модуля (пример: extra) и скопируйте только исходные файлы (из источника ядра или где-то еще), относящиеся к модулю, которые необходимо встроить в эту новую папку
- скопируйте
/boot/config-'uname -r'
(пример: /boot/config-4.8.0-46-generic) в файл с исходными файлами ядра .config и запуститеmake oldconfig
. если модуль принадлежит исходному коду ядра, проверьте, был ли он включен, вызвавmake menuconfig
,make menuconfig
поиск модуля и применив букву "М", если необходимо. - Корневой исходный файл ядра Makefile должен быть изменен с точными компонентами версии, совпадающими с текущим запущенным (вы можете проверить с помощью
make kernelversion
если он точно совпадает сuname -r
) - было сильное предложение также создавать сценарии с помощью
make scripts
-
make prepare
иmake modules_prepare
должны быть выполнены до фактической сборки модуля - Module.symvers должен быть скопирован из папки заголовков целевой системы, соответствующей запущенной версии ядра
/usr/src/linux-headers-'uname -r'/Module.symvers
(пример: /usr/src/linux-headers-3.13. 0-117-generic/Module.symvers) во вновь созданную папку с исходными файлами модуля, подготовленную для компиляции модуля (один дополнительный в примере). - создайте новый Makefile внутри папки с исходным кодом модуля со следующей строкой:
obj-y += <module_source_file_name>.o
или, если исходный код сложный, воспользуйтесь указаниями здесь - только тогда самое время собрать модуль с
make -C <kernel source path> M=the_module_directory
(пример:make -C. M=extra/
) - Используйте команду
modprobe --dump-modversion <module_name>.ko
чтобы проверить соответствие CRC между API экспорта модуля и соответствующими значениями в Module.symvers. в случае неудачи используйте командуmodinfo <module_name>.ko
- проверьте, совпадает ли содержимое файла kernel.release с заголовками текущей запущенной версии. если вы обнаружите + добавленный в конце, это означает, что вы компилировали исходный код git и ваши экспериментальные изменения привели к тому, что система сборки скомпрометировала строку localversion, добавив + в конце.
- если только + был обнаружен в конце kernel.release сохраненного значения, и это несоответствие с точным именем целевого работающего ядра,
решение будет следующим:
зафиксируйте все ваши изменения, git tag -a <tag version> -f
release сдвигаться над вашими изменениями с помощью команды git tag -a <tag version> -f
. затем восстановите ваши модули из шага 8
Ответ 3
Вы можете передать путь к имени модуля или директории модуля, чтобы сделать его как параметр.
make path/to/the/module/itself.ko
make path/to/the/module/directory/
Ответ 4
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install
https://askubuntu.com/questions/515407/how-recipe-to-build-only-one-kernel-module
Ответ 5
Если вы отредактировали только код в файле drivers/net/ethernet/intel/e1000/e1000_main.c
Постройте модуль.
make scripts prepare modules_prepare
make -C . M=drivers/net/ethernet/intel/e1000
Установите модуль.
cp drivers/net/ethernet/intel/e1000/e1000.ko /lib/modules/5.1.15/kernel/drivers/net/ethernet/intel/e1000/e1000.ko