Kernel module

Fragment kodu (np. sterownik), który można ładować i usuwać z działającego jądra bez restartu systemu. Pozwala rozszerzać funkcje kernela na żądanie.

Kernel module (moduł jądra) to fragment kodu, który możesz załadować do działającego jądra Linuksa i wyrzucić z niego bez restartu całego systemu. Najczęściej jest to sterownik urządzenia, obsługa systemu plików albo protokołu sieciowego, ale w praktyce może to być prawie każda funkcjonalność, której jądro nie musi mieć na stałe wkompilowanej. Dzięki modułom kernel nie jest jednym wielkim monolitem — rozszerzasz go na żądanie, w locie.

Po co to komu

Wyobraź sobie, że jądro musiałoby zawierać sterowniki do każdej karty sieciowej, każdego pendrive’a i każdego dziwnego peryferium na świecie. Byłoby ogromne i marnowałoby pamięć na rzeczy, których nigdy nie użyjesz. Moduły rozwiązują to elegancko: jądro ładuje tylko to, czego faktycznie potrzebuje. Podłączasz nową kartę Wi-Fi — system wykrywa sprzęt i podgrywa odpowiedni moduł. Odłączasz — można go wyładować.

Moduł działa w przestrzeni jądra (kernel space), czyli ma pełny dostęp do sprzętu i pamięci. To ogromna moc i jednocześnie ryzyko: błąd w module nie wywali jednej aplikacji, tylko potrafi zawiesić cały system tzw. kernel panic. Pliki modułów mają rozszerzenie .ko (kernel object) i leżą zwykle w /lib/modules/$(uname -r)/.

Jak to wygląda w praktyce

Podstawowe narzędzia to lsmod (lista załadowanych modułów), modinfo (info o module) oraz modprobe, który ładuje moduł razem z zależnościami. Surowsze insmod i rmmod działają na pojedynczych plikach bez automatycznego rozwiązywania zależności.

  • lsmod — co aktualnie siedzi w jądrze
  • sudo modprobe nazwa_modulu — załaduj moduł
  • sudo modprobe -r nazwa_modulu — wyładuj
  • modinfo nazwa_modulu — autor, opis, parametry, zależności

Klasyczny scenariusz: kupiłeś kartę graficzną NVIDIA, instalujesz sterownik, a on dostarcza moduł nvidia. Po instalacji sprawdzasz lsmod | grep nvidia i widzisz, że jest aktywny. Jeśli nie chce się załadować, dmesg zwykle podpowie, co poszło nie tak.

Częste pułapki

Secure Boot potrafi zablokować ładowanie niepodpisanych modułów — to częsta przyczyna „dlaczego mój sterownik nie działa”. Mismatch wersji jądra: moduł skompilowany pod jeden kernel nie załaduje się pod inny, dlatego po aktualizacji jądra sterowniki budowane ręcznie trzeba przekompilować (od tego jest DKMS, który robi to automatycznie). Nie wyładujesz też modułu, który jest aktualnie używany — najpierw musisz zwolnić to, co z niego korzysta.

Pojęcia powiązane: kernel space vs user space, monolithic vs microkernel, DKMS, device driver, modprobe, kernel panic, Secure Boot, system plików /proc i /sys.