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


35

У мене виникла помилка в модулі ядра Linux, що спричиняє запас ядра Ubuntu 14.04 (аварія).

Ось чому я хочу відредагувати / виправити джерело лише цього єдиного модуля ядра, щоб додати додатковий вихід налагодження. Проблемний модуль ядра mvsasне потребує завантаження. З цієї причини я не бачу необхідності оновлювати зображення initrd.

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

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

Використовувані джерела:



можливо, ця стаття теж допоможе: 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 / модулях.

$ cd ~/linux-3.13.0
$ cp -v /usr/src/linux-headers-$(uname -r)/Module.symvers .

Це запобігає появі повідомлення " Немає версії символу для модуля_випуск " під час завантаження модуля з 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 build) модуль ядра, щоб переконатися, що користувальницький патч буде завантажений.

Кожна редакція

$ 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 для цього.

Я отримав помилку: / bin / sh: arm-none-linux -gnueabi-gcc: не знайдено
Dr.jacky

$(uname-r)мабуть, помиляється ... Вам потрібно зателефонувати до shellвбудованого:$(shell uname -r)
Альбус Дамблдор

2
@AlbusDumbledore Я також бачу випадки, коли $(shell uname -r)це не працює . Чому $(uname -r)так, мабуть, неправильно?
Pro резервне копіювання

Мені довелося також зателефонувати, 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 At main.c: 158: - Помилка SSL: 02001002: системна бібліотека: fopen: Немає такого файлу чи каталогу: bss_file.c: 175 - SSL помилка: 2006D080: BIO підпрограми: BIO_new_file: немає такого файлу: bss_file.c: 178-файл знаків: certs / sign_key.pem: Немає такого файлу чи каталогу `` `
Envek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.