Как (рецепт) собрать только один модуль ядра?

У меня есть ошибка в модуле ядра Linux, из-за которой стандартное ядро ​​Ubuntu 14.04 перестает работать (сбой).

Вот почему я хочу редактировать/исправлять исходный код только этого единственного модуля ядра, чтобы добавить дополнительные выходные данные отладки. Рассматриваемый модуль ядра mvsas и не нужно загружаться. По этой причине я не вижу необходимости обновлять изображения initrd.

Я прочитал много информации (как показано ниже) и нашел путаницу в процессе установки и сборки. Мне нужно два рецепта:

  1. настроить / настроить среду сборки один раз
  2. шаги, которые необходимо выполнить после редактирования любого исходного файла этого модуля ядра (.c а также .h) и преобразование этого редактирования в новый модуль ядра (.ko)

Источники, которые были использованы:

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

Заметки

  1. Вполне возможно, что в результате .ko файлы модулей намного (например, в 20 раз) больше, чем исходные файлы модулей, распространяемые Ubuntu; в этом случае make prepare Шаг мог создать файл конфигурации ядра для отладки Linux-разработчиков, и вы собираете его из исходного каталога. Ваш -C param может не работать должным образом.
  2. Я видел руководства с другими командами, такими как make modules_prepare а также make M=scripts/mod но я не думаю, что это необходимо для этого случая.
  3. Вы можете использовать отладочную конфигурацию разработчиков Linux, заменив -C /lib/modules/$(uname -r)/build с -C /usr/src/linux-headers-$(uname -r)
  4. В настройках по умолчанию 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 для этого также описан.
Другие вопросы по тегам