У меня есть ошибка в модуле ядра 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://askubuntu.com/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://askubuntu.com/questions/444345/not-able-to-see-pr-info-output
- https://askubuntu.com/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://askubuntu.com/questions/426549/compile-and-loading-kernel-module-without-compiling-the-kernel
Ответы:
Рецепт создания пользовательского модуля может быть разделен на три части.
Настроить один раз
Мне лень копировать исходные файлы драйвера конкретного mvsas; просто скопируйте их все в свой текущий рабочий каталог. Если в
apt-get
результате появляется сообщение об ошибке об отсутствии URI источника, см. Примечание № 4 внизу.Это подготовит некоторые файлы, необходимые для сборки модуля ядра.
Каждая версия ядра
Это установит заголовки и файл конфигурации ядра Ubuntu для этой версии ядра в / lib / modules.
Это предотвращает появление сообщения « нет версии символа для module_layout » при загрузке модуля с помощью insmod или modprobe.
Это переименует оригинальный модуль ядра (сборка Ubuntu), чтобы убедиться, что пользовательский патч будет загружен.
Каждое редактирование
Это для правок.
Это скомпилирует и соберет
.ko
файл модуля ядра с использованием конфигурации ядра из вашего стандартного дистрибутива Ubuntu, который хранится в/lib/modules/$(uname -r)/
.Это установит модуль ядра
/lib/modules/$(uname -r)/extra/
, а не перезаписывает модуль распространения, если вы не переименовали файл модуля распространения. В этом случае mvsas также запустит depmod .Если это приводит к какому-либо выводу, модуль mvsas сначала должен быть выгружен с помощью (
modprobe -r mvsas
).Это должно загрузить новый модуль ядра.
Проверьте вывод, чтобы убедиться,
/lib/modules/.../extra/mvsas.ko
что загружается.Ошибка Modprobe: не удалось вставить
В некоторых случаях вы можете столкнуться с тем, что
modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg)
во время подробного вывода modprobe вы видите, чтоinsmod
он пытается загрузить модуль из расположения ядра по умолчанию. Например:В этом случае вам нужно вручную запустить depmod и попытаться снова загрузить модуль:
Заметки
.ko
файлы модулей будут намного (например, в 20 раз) больше, чем исходные файлы модулей, распространяемые Ubuntu; в этом случае этотmake prepare
шаг мог бы создать файл конфигурации ядра отладки для разработчиков Linux, и вы собираете его из исходного каталога. Ваш-C
параметр может работать не так, как ожидалось.make modules_prepare
и ,make M=scripts/mod
но я не думаю , что это необходимо для этого случая.-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 для этого также описан.источник
$(uname-r)
Видимо неправильно ... Нужно назватьshell
встроенным:$(shell uname -r)
$(shell uname -r)
не работает . Почему$(uname -r)
так явно не так?echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.conf
чтобыdepmod
увидеть обновленный файл в.../extra
.