Как (рецепт) собрать только один модуль ядра?
У меня есть ошибка в модуле ядра Linux, из-за которой стандартное ядро Ubuntu 14.04 перестает работать (сбой).
Вот почему я хочу редактировать/исправлять исходный код только этого единственного модуля ядра, чтобы добавить дополнительные выходные данные отладки. Рассматриваемый модуль ядра mvsas
и не нужно загружаться. По этой причине я не вижу необходимости обновлять изображения initrd.
Я прочитал много информации (как показано ниже) и нашел путаницу в процессе установки и сборки. Мне нужно два рецепта:
- настроить / настроить среду сборки один раз
- шаги, которые необходимо выполнить после редактирования любого исходного файла этого модуля ядра (
.c
а также.h
) и преобразование этого редактирования в новый модуль ядра (.ko
)
Источники, которые были использованы:
- собрать один модуль ядра - поиск Google
- http://www.linuxquestions.org/questions/linux-kernel-70/rebuilding-a-single-kernel-module-595116/
- https://stackoverflow.com/questions/8744087/how-to-recompile-just-a-single-kernel-module
- http://www.pixelbeat.org/docs/rebuild_kernel_module.html
- Как собрать один модуль ядра в дереве?
- http://ubuntuforums.org/showthread.php?t=1153067
- http://ubuntuforums.org/showthread.php?t=2112166
- http://ubuntuforums.org/showthread.php?t=1115593
- собрать один модуль ядра Ubuntu - поиск в Google
- 'make + single + kernel + module' - спросите Ubuntu
- 'make + kernel + module' - спросите Ubuntu
- Мой make-файл приводит к: Нет правила для создания цели `arch/x86/tools/relocs.c', необходимо
- "Неверный формат модуля" - спросите Ubuntu
- Установка драйвера: компиляция исходного кода для нового ядра
- Modprobe: "Неверный формат узла", но работает после insmod
- "Дамп версии символов" "отсутствует" - поиск в Google
- https://stackoverflow.com/questions/9425523/should-i-care-that-the-symbol-version-dump-is-missing-how-do-i-get-one
- https://Ask-ubuntu.ru/questions/369051/where-can-i-find-the-corresponding-module-symvers-and-config-files-for-ubutunu
- "нет версии символа для module_layout" при попытке загрузить usbhid.ko
- Неработающие ссылки в папке заголовочного файла Linux
- 'make modules_install' - спросите Ubuntu
- 'modules_install' - спросите Ubuntu
- Пустой каталог сборки в специально скомпилированном ядре
- https://Ask-ubuntu.ru/questions/444345/not-able-to-see-pr-info-output
- https://Ask-ubuntu.ru/questions/472496/in-which-directory-are-the-kernel-source-files-and-how-can-i-recompile-it
- Как я могу скомпилировать и установить этот исправленный файл libata-eh.c?
- 'modules_install + depmod' - спросите Ubuntu
- modules_install depmod - поиск Google
- "make modules_install" - поиск в Google
- http://www.csee.umbc.edu/courses/undergraduate/CMSC421/fall02/burt/projects/howto_build_kernel.html
- https://unix.stackexchange.com/questions/20864/what-happens-in-each-step-of-the-linux-kernel-building-process
- https://wiki.ubuntu.com/KernelCustomBuild
- http://www.cyberciti.biz/tips/build-linux-kernel-module-against-installed-kernel-source-tree.html
- http://www.linuxforums.org/forum/kernel/170617-solved-make-modules_install-different-path.html
- "приготовь" - поиск в Google
- "make prepare" "scripts/kconfig/conf --silentoldconfig Kconfig" - поиск в Google
- http://ubuntuforums.org/showthread.php?t=1963515
- версия Ubuntu "приготовь" - поиск в Google
- https://stackoverflow.com/questions/8276245/how-to-compile-a-kernel-module-against-a-new-source
- https://help.ubuntu.com/community/Kernel/Compile
- Как мне скомпилировать модуль ядра?
- Как добавить собственный драйвер в мое ядро?
- https://Ask-ubuntu.ru/questions/426549/compile-and-loading-kernel-module-without-compiling-the-kernel
1 ответ
Рецепт создания пользовательского модуля может быть разделен на три части.
Настроить один раз
$ cd ~
$ apt-get source linux-source-3.13.0
Мне лень копировать исходные файлы драйвера конкретного mvsas; просто скопируйте их все в свой текущий рабочий каталог. Если apt-get
в результате появляется сообщение об ошибке об отсутствии URI источника, а затем см. примечание № 4 внизу.
$ cd linux-3.13.0
$ make oldconfig
$ make prepare
$ make scripts
Это подготовит некоторые файлы, необходимые для сборки модуля ядра.
Каждая версия ядра
$ apt-get install linux-headers-$(uname -r)
Это установит заголовки и файл конфигурации ядра Ubuntu для этой версии ядра в / lib / modules.
$ cd ~/linux-3.13.0
$ cp -v /usr/src/linux-headers-$(uname -r)/Module.symvers .
Это предотвращает появление сообщения "нет версии символа для module_layout" при загрузке модуля с помощью insmod или modprobe.
$ mv -v /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko.backup
Это переименует оригинальный модуль ядра (сборка Ubuntu), чтобы убедиться, что пользовательский патч будет загружен.
Каждое редактирование
$ cd ~/linux-3.13.0/drivers/scsi/mvsas
$ nano mv_sas.h
$ nano mv_sas.c
Это для правок.
$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
Это скомпилирует и соберет модуль ядра .ko
файл с использованием конфигурации ядра из вашего дистрибутива Ubuntu, который хранится в /lib/modules/$(uname -r)/
,
$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install
Это установит модуль ядра в /lib/modules/$(uname -r)/extra/
не перезаписывать модуль распространения, если вы не переименовали файл модуля распространения. В этом случае mvsas также запустит depmod.
$ lsmod | grep mvsas
Если это приводит к какому-либо выводу, модуль mvsas необходимо выгрузить с помощью (modprobe -r mvsas
) первый.
$ sudo modprobe -v mvsas
Это должно загрузить новый модуль ядра.
Проверьте вывод, чтобы убедиться, что /lib/modules/.../extra/mvsas.ko
загружается.
Ошибка Modprobe: не удалось вставить
В некоторых случаях вы можете испытать modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg)
в то время как в подробном выводе modprobe вы видите, что insmod
пытается загрузить модуль из расположения ядра по умолчанию. Например:
# insmod /lib/modules/3.17.0-031700rc7-generic/kernel/drivers/scsi/pm8001/pm80xx.ko
modprobe: ERROR: could not insert 'pm80xx': Unknown symbol in module, or unknown parameter (see dmesg)
В этом случае вам нужно вручную запустить depmod и попытаться снова загрузить модуль:
# depmod
# sudo modprobe -v mvsas
Заметки
- Вполне возможно, что в результате
.ko
файлы модулей намного (например, в 20 раз) больше, чем исходные файлы модулей, распространяемые Ubuntu; в этом случаеmake prepare
Шаг мог создать файл конфигурации ядра для отладки Linux-разработчиков, и вы собираете его из исходного каталога. Ваш-C
param может не работать должным образом. - Я видел руководства с другими командами, такими как
make modules_prepare
а такжеmake M=scripts/mod
но я не думаю, что это необходимо для этого случая. - Вы можете использовать отладочную конфигурацию разработчиков Linux, заменив
-C /lib/modules/$(uname -r)/build
с-C /usr/src/linux-headers-$(uname -r)
- В настройках по умолчанию
apt-get source linux-sources
вернет ошибкуE: You must put some 'source' URIs in your sources.list
, Чтобы исправить эту проблему, вы можете изменить файл/etc/apt/sources.list
откомментировав (удалив ведущий#
от первойdeb-src
линия. Пример для Ubuntu 17.10:deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted
, бежатьsudo apt-get update
, а затем команда доставит источники для вас. Смотрите также этот вопрос, где метод GUI для этого также описан.