Moduł kernela i wartości jego parametrów

Spis treści

Raczej na pewno spotkaliśmy się już z modułami kernela w linux'ie. Generalnie rzecz biorąc, taki moduł może być ładowany dynamicznie i w sporej części przypadków niezależnie, choć z zwykle jest pociągany przy zdarzeniach udev'a. Czasem jednak, dany moduł nie działa jak należy i może to być wynikiem, np. problemów w samym module, lub też jego niewłaściwej konfiguracji, która konfliktuje z podzespołami naszego komputera. Ten wpis będzie dotyczył tego jak ustalić parametry modułów i ich domyślne wartości, tak by móc je sobie zmienić w późniejszym czasie.

Informacje o modułach w modinfo

Moduły z reguły ładujemy za pomocą modprobe , z kolei wyładowanie ich odbywa się przez modprobe -r . Aktualnie załadowane moduły można ustalić przy pomocy lsmod , który często jest używany z narzędziem grep , bo ilość załadowanych modułów w systemie może być dość spora. Każdy moduł kernela można podejrzeć przy pomocy modinfo . Zwraca ono trochę informacji na temat danego modułu, przykładowo (wyjście nieco przycięte dla czytelności):

# modinfo i915
filename:       /lib/modules/4.2.0-1-amd64/kernel/drivers/gpu/drm/i915/i915.ko
license:        GPL and additional rights
description:    Intel Graphics
author: Morfik         Intel Corporation
..
firmware:       i915/skl_dmc_ver1.bin
alias:          pci:v00008086d00005A84sv*sd*bc03sc*i*
...
depends:        drm_kms_helper,drm,video,button,i2c-algo-bit
intree:         Y
vermagic:       4.2.0-1-amd64 SMP mod_unload modversions
parm:           modeset:Use kernel modesetting [KMS] (0=DRM_I915_KMS from .config, 1=on, -1=force vga console preference [default]) (int)
parm:           panel_ignore_lid:Override lid status (0=autodetect, 1=autodetect disabled [default], -1=force lid closed, -2=force lid open) (int)
parm:           semaphores:Use semaphores for inter-ring sync (default: -1 (use per-chip defaults)) (int)
...

W skład informacji o module zwracanych przez modinfo wchodzi:

  • filename określa nazwę pliku .ko oraz jego położenie w drzewie katalogów.
  • license to licencja na jakiej dany moduł został udostępniony.
  • description to krótki opis modułu.
  • author określa autora, z tym, że może być ich wielu.
  • firmware określa czy moduł do swojej pracy potrzebuje firmware. Pliki firmware są zlokalizowane w katalogu /lib/firmware/ .
  • alias odnosi się do urządzeń, które po dopasowaniu mają być obsługiwane przez ten moduł.
  • depends definiuje moduły, które muszą zostać załadowane wcześniej. Jeśli z jakiegoś powodu nie są, to zostaną załadowane automatycznie przy ładowaniu tego modułu.
  • intree określa czy dany moduł został włączony do włączony do kernela czy też jest rozwijany poza nim.
  • vermagic określa opcje, którą podczas ładowania modułu muszą pasować do tych, które są ustawione w samym module. W przypadku gdy różnią się one, ładowanie modułu nie powiedzie się, no chyba, że skorzysta się z parametru --force .
  • parm parametr modułu, może ich być kilka.

Przydałoby się kilka słów wyjaśnienia odnośnie ciągu, który widnieje na pozycji alias . W tym przypadku jest ma on postać pci:v00008086d00005A84sv*sd*bc03sc*i* . Jest to urządzenie pci o numerach identyfikacyjnych v00008086 (vendorID) oraz d00005A84 (deviceID). Dalej mamy sv* oraz sd* , to wersje podsystemu, odpowiednio dla producenta (vendor) i urządzenia (device). Z kolei bc03 to klasa podstawowa określająca rodzaj urządzenia, np. interfejsy IDE, kontrolery Ethernet czy też USB. Natomiast w tym przypadku jest to kontroler wyświetlacza (Display controller). Na końcu mamy już tylko sc* odpowiadający za podklasę urządzenia no i i* jego interfejs. W każdym przypadku, * oznacza dopasowanie do czegokolwiek. Informacje na temat numerów identyfikacyjnych można znaleźć na wiki debiana we wpisach poświęconych pci oraz usb.

Parametry modułu określone przez parm mogą być zmieniane przez administratora systemu za pomocą plików w katalogu /etc/modprobe.d/ . I tak dla przykładu jeśli chcielibyśmy zmienić kilka opcji modułu i915 , to musimy stworzyć plik o dowolnej nazwie z końcówką .conf i umieścić go we wspomnianym katalogu. Jego treść powinna wyglądać mniej więcej tak:

options i915 lvds_downclock=1 fastboot=1

Wartości parametrów modułu

W parametrach modułów, które uzyskaliśmy za pomocą lsub mamy informacje dotyczące tego jaka wartość jest domyślna dla każdego z nich. Nie mamy jednak żadnego info na temat faktycznej konfiguracji załadowanego modułu. Jak zatem je ustalić? Do tego celu będzie nam potrzebny pakiet sysfsutils , w którym to jest dostępne narzędzie systool . To właśnie ono jest nam w stanie pokazać wartości aktualnie załadowanych w systemie modułów. Poniżej przykład:

# systool -v -m i915
Module = "i915"
...
  Parameters:
...
    fastboot            = "Y"
...
    lvds_downclock      = "1"
...
Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.