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

35

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

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

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

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

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

Pro Backup
источник
Возможный дубликат Как мне собрать один модуль ядра в дереве?
Сиро Сантилли 事件 改造 中心 法轮功 六四 事件
Возможно, эта статья тоже поможет: stackoverflow.com/questions/8744087/…
Олег Кокорин

Ответы:

33

Рецепт создания пользовательского модуля может быть разделен на три части.

Настроить один раз

$ 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параметр может работать не так, как ожидалось.
  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 для этого также описан.
Pro Backup
источник
Я получил ошибку: / bin / sh: arm-none-linux -gnueabi-gcc: не найдено
Dr.jacky
$(uname-r)Видимо неправильно ... Нужно назвать shellвстроенным:$(shell uname -r)
Альбус Дамблдор
2
@AlbusDumbledore Я также вижу случаи, когда $(shell uname -r)не работает . Почему $(uname -r)так явно не так?
Pro Backup
Мне также пришлось позвонить, echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.confчтобы depmodувидеть обновленный файл в .../extra.
Мартин Пецка
1
Что делать с ошибкой подписи модуля, как ее избежать? `` `INSTALL /home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko В main.c: 158: - Ошибка SSL: 02001002: системная библиотека: fopen: Нет такого файла или каталога: bss_file.c: 175 - ошибка SSL: 2006D080: подпрограммы BIO: BIO_new_file: такого файла нет: bss_file.c: 178 sign-file: certs / signature_key.pem: такого файла или каталога нет `` `
Envek