Jak (przepis) zbudować tylko jeden moduł jądra?

35

Mam błąd w module jądra Linuksa, który powoduje, że standardowe jądro Ubuntu 14.04 przestaje działać (awaria).

Dlatego chcę edytować / łatać źródło tylko tego jednego modułu jądra, aby dodać dodatkowe wyjście debugowania. Omawiany moduł jądra mvsasnie jest konieczny do uruchomienia. Z tego powodu nie widzę potrzeby aktualizowania żadnych obrazów initrd.

Przeczytałem wiele informacji (jak pokazano poniżej) i znalazłem zamieszanie w procesie konfiguracji i kompilacji. Potrzebuję dwóch przepisów:

  1. aby raz skonfigurować / skonfigurować środowisko kompilacji
  2. kroki, które należy wykonać po edycji dowolnego pliku źródłowego tego modułu jądra ( .ci .h) i przekonwertowaniu tej edycji na nowy moduł jądra ( .ko)

Użyte źródła to:

Pro Backup
źródło
Możliwy duplikat Jak zbudować pojedynczy moduł jądra w drzewie?
Ciro Santilli 26 改造 中心 法轮功 六四 事件 事件
być może ten artykuł też pomoże: stackoverflow.com/questions/8744087/…
Oleg Kokorin

Odpowiedzi:

33

Przepis na zbudowanie niestandardowego modułu może wymagać podzielenia na trzy sekcje.

Skonfiguruj raz

$ cd ~
$ apt-get source linux-source-3.13.0 

Jestem zbyt leniwy, aby skopiować pliki źródłowe sterowników specyficzne dla mvsas; po prostu skopiuj je wszystkie do bieżącego katalogu roboczego. Jeśli pojawi apt-getsię komunikat o błędzie dotyczący brakujących źródłowych identyfikatorów URI, patrz uwaga 4 na dole.

$ cd linux-3.13.0
$ make oldconfig
$ make prepare
$ make scripts

Spowoduje to przygotowanie niektórych plików niezbędnych do zbudowania modułu jądra.

Każda wersja jądra

$ apt-get install linux-headers-$(uname -r)

Spowoduje to zainstalowanie nagłówków i pliku konfiguracyjnego jądra Ubuntu dla tej wersji jądra w / lib / modules.

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

Zapobiega to pojawieniu się komunikatu „ brak wersji symbolu dla modułu_głównego ” podczas ładowania modułu z insmod lub modprobe.

$ mv -v /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko.backup

Spowoduje to zmianę nazwy oryginalnego modułu jądra (kompilacji Ubuntu), aby mieć pewność, że załadowany zostanie niestandardowy poprawiony.

Każda edycja

$ cd ~/linux-3.13.0/drivers/scsi/mvsas
$ nano mv_sas.h
$ nano mv_sas.c

Są do edycji.

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

Spowoduje to skompilowanie i skompilowanie .kopliku modułu jądra przy użyciu konfiguracji jądra z twojej podstawowej dystrybucji Ubuntu w postaci przechowywanej w /lib/modules/$(uname -r)/.

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

Spowoduje to zainstalowanie modułu jądra /lib/modules/$(uname -r)/extra/, nie nadpisując modułu dystrybucji w przypadku, gdy nie zmienisz nazwy pliku modułu jądra dystrybucji. W tym przypadku mvsas będzie również działał depmod .

$ lsmod | grep mvsas

Jeśli spowoduje to jakiekolwiek wyjście, moduł mvsas wymaga modprobe -r mvsasnajpierw rozładowania za pomocą ( ).

$ sudo modprobe -v mvsas

To powinno załadować nowy moduł jądra.

Sprawdź dane wyjściowe, aby sprawdzić, czy /lib/modules/.../extra/mvsas.kojest ładowany.

Błąd Modprobe: nie można wstawić

W niektórych przypadkach może pojawić się jakiś modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg)czas na pełnym wyjściu modprobe, który widzi, że insmodpróbuje załadować moduł z domyślnej lokalizacji jądra. Na przykład:

# 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)

W takim przypadku musisz ręcznie uruchomić depmod i spróbować ponownie załadować moduł:

# depmod
# sudo modprobe -v mvsas

Notatki

  1. Może się zdarzyć, że wynikowe .kopliki modułów są znacznie (na przykład 20 razy) większe niż oryginalne pliki modułów rozpowszechniane przez Ubuntu; w takim przypadku make preparekrok mógł spowodować utworzenie pliku konfiguracyjnego jądra dla deweloperów systemu Linux, a ty budujesz z katalogu źródłowego. Twój -Cparametr może nie działać zgodnie z oczekiwaniami.
  2. Widziałem przewodników z innych komend, jak make modules_preparei make M=scripts/mod, ale nie sądzę, są one niezbędne do tego przypadku.
  3. Możesz użyć konfiguracji debugowania dla programistów systemu Linux, zastępując -C /lib/modules/$(uname -r)/build-C /usr/src/linux-headers-$(uname -r)
  4. W domyślnej konfiguracji apt-get source linux-sourceszwróci błąd E: You must put some 'source' URIs in your sources.list. Aby rozwiązać ten problem, możesz zmodyfikować plik /etc/apt/sources.list, odznaczając (usuwając wiodący #z) pierwszy deb-srcwiersz. Przykład Ubuntu 17.10: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted. uruchom sudo apt-get update, a następnie polecenie dostarczy Ci źródła. Zobacz także to pytanie, w którym opisano również metodę GUI do tego celu.
Pro Backup
źródło
Mam błąd: / bin / sh: arm-none-linux -gnueabi-gcc: nie znaleziono
Dr.jacky
$(uname-r)jest najwyraźniej nie tak ... Musisz zadzwonić do shellwbudowanego:$(shell uname -r)
Albus Dumbledore
2
@AlbusDumbledore Widzę również przypadki, w których $(shell uname -r)nie działa . Dlaczego $(uname -r)tak pozornie się mylisz?
Pro Backup
Musiałem także zadzwonić, echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.confaby zobaczyć depmodnowo zaktualizowany plik w .../extra.
Martin Pecka
1
Co zrobić z błędem podpisywania modułu, jak go uniknąć? `` INSTALL /home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko At main.c: 158: - Błąd SSL: 02001002: biblioteka systemowa: fopen: brak takiego pliku lub katalogu: bss_file.c: 175 - Błąd SSL: 2006D080: Procedury BIO: BIO_new_file: brak takiego pliku: bss_file.c: 178 plik-pliku: certs / signing_key.pem: Brak takiego pliku lub katalogu ``
Envek