У меня есть ошибка в модуле ядра Linux, который вызывает запас ядро Ubuntu 14.04 к ООП (катастрофический отказ).
Именно поэтому я хочу редактировать/исправлять источник только что единственный модуль ядра для добавления некоторого дополнительного вывода отладки. Рассматриваемый модуль ядра mvsas
и не необходимый для начальной загрузки. По этой причине я не вижу потребности обновить любые изображения initrd.
Я считал большую информацию (как показано ниже) и нахожу беспорядок установки и процесса сборки. Мне нужны два рецепта:
.c
и .h
) и преобразование того редактирования в новый модуль ядра (.ko
)Источники, которые использовались:
Рецепт для создания пользовательского модуля, возможно, должен был бы быть разделен в трех разделах.
$ cd ~
$ apt-get source linux-source-3.13.0
Я слишком ленив для копирования mvsas определенных исходных файлов драйвера; просто скопируйте их всех в свой текущий рабочий каталог. Если apt-get
результаты в сообщении об ошибке о недостающем источнике URIs затем видят примечание № 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
загружается.
В некоторых случаях Вы могли бы испытать a 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
параметрический усилитель не мог бы функционировать как ожидалось.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 для того, чтобы сделать это описан также.