Jądro Linuksa

Zarządzanie modułami jądra Linux

Zarządzanie modułami jądra Linux

Zrozumienie jądra Linux

Jądro Linux jest rdzeniem systemu operacyjnego Linux. Zawiera główne komponenty do obsługi sprzętu i umożliwia zarówno komunikację, jak i interakcję między użytkownikiem a sprzętem. Jądro Linuksa nie jest systemem monolitycznym, ale dość elastycznym, a jądro jest rozszerzone o tzw. moduły jądra.

Co to jest moduł jądra?

Ogólnie rzecz biorąc, moduł jądra to „kawałek kodu, który może być ładowany i rozładowywany do jądra na żądanie. Rozszerzają funkcjonalność jądra bez konieczności restartowania systemu” [1]. Prowadzi to do bardzo dużej elastyczności podczas pracy.

Ponadto „moduł jądra może być skonfigurowany jako wbudowany lub ładowalny. Aby dynamicznie ładować lub usuwać moduł, należy go skonfigurować jako ładowalny moduł w konfiguracji jądra” [1]. Odbywa się to w pliku źródłowym jądra /usr/src/linux/.konfiguracja [2]. Moduły wbudowane są oznaczone literą „y”, a moduły ładowalne literą „m”. Jako przykład, listing 1 pokazuje to dla modułu SCSI:

Listing 1: Deklaracja użycia modułu SCSI

CONFIG_SCSI=y # wbudowany moduł
CONFIG_SCSI=m # ładowalny moduł
# CONFIG_SCSI # zmienna nie jest ustawiona

Nie zalecamy bezpośredniej edycji pliku konfiguracyjnego, ale użycie polecenia „make config”, „make menuconfig” lub „make xconfig” w celu zdefiniowania użycia odpowiedniego modułu w jądrze Linux.

Polecenia modułu

System Linux zawiera wiele różnych poleceń do obsługi modułów jądra. Obejmuje to wyświetlanie listy modułów aktualnie załadowanych do jądra Linux, wyświetlanie informacji o modułach, a także ładowanie i rozładowywanie modułów jądra. Poniżej wyjaśnimy te polecenia bardziej szczegółowo.

Dla aktualnych jąder Linuksa pakiet kmod udostępnia następujące polecenia [3]. Wszystkie polecenia są dowiązaniami symbolicznymi do kmod.

Lista aktualnie załadowanych modułów za pomocą lsmod

Zaczynamy od polecenia lsmod. lsmod skraca „listowanie modułów” i wyświetla wszystkie moduły aktualnie załadowane do jądra Linuksa, ładnie formatując zawartość pliku /proc/modules. Listing 2 pokazuje jego dane wyjściowe, które składają się z trzech kolumn: nazwy modułu, rozmiaru używanego w pamięci i innych modułów jądra, które używają tego konkretnego.

Listing 2: Korzystanie z lsmod

$ lsmod
Rozmiar modułu używany przez
ctr 12927 2
cm3 17534 2
snd_hrtimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq

$

Znajdź dostępne moduły dla twojego aktualnego jądra

Mogą istnieć dostępne moduły jądra, o których jeszcze nie wiesz. Są one przechowywane w katalogu /lib/modules. Za pomocą find w połączeniu z poleceniem uname możesz wydrukować listę tych modułów. „uname -r” wyświetla tylko wersję aktualnie działającego jądra Linuksa. Listing 3 pokazuje to dla starszej 3.16.0-7 Linux
kernel i pokazuje moduły dla IPv6 i IRDA.

Listing 3: Wyświetlanie dostępnych modułów (wybór)

$ find /lib/modules/$(uname -r) -nazwa '*.ko'
/lib/moduły/3.16.0-7-amd64/jądro/net/ipv6/ip6_vti.ko
/lib/moduły/3.16.0-7-amd64/jądro/net/ipv6/xfrm6_tunnel.ko
/lib/moduły/3.16.0-7-amd64/jądro/net/ipv6/ip6_tunnel.ko
/lib/moduły/3.16.0-7-amd64/jądro/net/ipv6/ip6_gre.ko
/lib/moduły/3.16.0-7-amd64/jądro/net/irda/irnet/irnet.ko
/lib/moduły/3.16.0-7-amd64/jądro/net/irda/irlan/irlan.ko
/lib/moduły/3.16.0-7-amd64/jądro/net/irda/irda.ko
/lib/moduły/3.16.0-7-amd64/kernel/net/irda/ircomm/ircomm.ko
/lib/moduły/3.16.0-7-amd64/kernel/net/irda/ircomm/ircomm-tty.ko

$

Wyświetlaj informacje o module za pomocą modinfo

Polecenie modinfo mówi więcej o żądanym module jądra („informacje o module”). Jako parametr modinfo wymaga pełnej ścieżki modułu lub po prostu nazwy modułu. Listing 4 pokazuje to dla modułu jądra IrDA obsługującego stos protokołu Infrared Direct Access.

Listing 4: Wyświetlanie informacji o module

$ /sbin/modinfo irda
nazwa pliku: /lib/modules/3.16.0-7-amd64/jądro/net/irda/irda.ko
alias: net-pf-23
licencja: GPL
opis: Stos protokołów IrDA w Linuksie
autor: Dag Brattli & Jean Tourrilhes
zależy: crc-ccitt
wermagiczny: 3.16.0-7-amd64 SMP mod_unload modversions
$

Dane wyjściowe zawierają różne pola informacyjne, takie jak pełna ścieżka do modułu jądra, jego alias, licencja oprogramowania, opis modułu, autorzy, a także wewnętrzne elementy jądra. Pole „depends” pokazuje, od jakich innych modułów jądra zależy.

Pola informacyjne różnią się w zależności od modułu. Aby ograniczyć wyjście do konkretnego pola informacyjnego, modinfo akceptuje parametr „-F” (skrót od „-field”), po którym następuje nazwa pola. Na Listingu 5 dane wyjściowe są ograniczone do informacji o licencji udostępnianych za pomocą pola licencji.

Listing 5: Wyświetlaj tylko określone pole.

$ /sbin/modinfo -F licencja irda
GPL
$

W nowszych jądrach Linuksa dostępna jest przydatna funkcja bezpieczeństwa. Obejmuje to podpisane kryptograficznie moduły jądra. Jak wyjaśniono na stronie projektu jądra Linux [4], „pozwala to zwiększyć bezpieczeństwo jądra poprzez uniemożliwienie ładowania niepodpisanych modułów lub modułów
podpisany nieprawidłowym kluczem. Podpisywanie modułów zwiększa bezpieczeństwo, utrudniając załadowanie złośliwego modułu do jądra. Sprawdzanie sygnatur modułów jest wykonywane przez jądro, dzięki czemu nie jest konieczne posiadanie „zaufanych bitów przestrzeni użytkownika user.” Poniższy rysunek pokazuje to dla
moduł parport_pc.

Pokaż konfigurację modułu za pomocą modprobe

Każdy moduł jądra ma określoną konfigurację. Polecenie modprobe, po którym następuje opcja „-c” (skrót od „-showconfig”) wyświetla konfigurację modułu. W połączeniu z grepem to wyjście jest ograniczone do określonego symbolu. Listing 6 pokazuje to dla opcji IPv6.

Listing 6: Pokaż konfigurację modułu

$ /sbin/modprobe -c | grep ipv6
alias net_pf_10_proto_0_type_6 dccp_ipv6
alias net_pf_10_proto_33_type_6 dccp_ipv6
alias nf_conntrack_10 nf_conntrack_ipv6
alias nf_nat_10 nf_nat_ipv6
alias nft_afinfo_10 nf_tables_ipv6
alias nft_chain_10_nat nft_chain_nat_ipv6
alias nft_chain_10_route nft_chain_route_ipv6
alias nft_expr_10_reject nft_reject_ipv6
symbol aliasu: nf_defrag_ipv6_enable nf_defrag_ipv6
symbol aliasu:nf_nat_icmpv6_reply_translation nf_nat_ipv6
symbol aliasu:nft_af_ipv6 nf_tables_ipv6
symbol aliasu:nft_reject_ipv6_eval nft_reject_ipv6
$

Pokaż zależności modułów

Jądro Linuksa zostało zaprojektowane jako modułowe, a jego funkcjonalność jest podzielona na wiele modułów. Prowadzi to do kilku zależności modułów, które można ponownie wyświetlić za pomocą modprobe. Listing 7 używa opcji „-show-depends” w celu wyświetlenia zależności dla modułu i915.

Listing 7: Pokaż zależności modułów

$ /sbin/modprobe --show-depends i915
insmod /lib/modules/3.16.0-7-amd64/jądro/sterowniki/rdzeń i2c/i2c.ko
insmod /lib/modules/3.16.0-7-amd64/jądro/sterowniki/i2c/algos/i2c-algo-bit.ko
insmod /lib/modules/3.16.0-7-amd64/jądro/sterowniki/termiczne/termiczne_sys.ko
insmod /lib/modules/3.16.0-7-amd64/jądro/sterowniki/gpu/drm/drm.ko
insmod /lib/modules/3.16.0-7-amd64/kernel/drivers/gpu/drm/drm_kms_helper.ko
insmod /lib/modules/3.16.0-7-amd64/jądro/sterowniki/acpi/wideo.ko
insmod /lib/modules/3.16.0-7-amd64/jądro/sterowniki/acpi/przycisk.ko
insmod /lib/modules/3.16.0-7-amd64/jądro/sterowniki/gpu/drm/i915/i915.ko
$

W celu wyświetlenia zależności w postaci drzewa podobnego do polecenia „drzewo” lub „lsblk”, może pomóc projekt modtree [5] (patrz rysunek poniżej dla drzewa modułu i915). Chociaż jest swobodnie dostępny na GitHubie, wymaga pewnych adaptacji, aby zachować zgodność z zasadami wolnego oprogramowania i stać się częścią dystrybucji Linuksa jako pakiet.

Ładowanie modułów

Załadowanie modułu do działającego jądra można wykonać za pomocą dwóch poleceń - insmod („wstaw moduł”) i modprobe. Należy pamiętać, że istnieje niewielka, ale ważna różnica między tymi dwoma: insmod nie rozwiązuje zależności modułów, ale modprobe jest mądrzejszy i to robi.

Listing 8 pokazuje, jak wstawić moduł jądra IrDA. Należy pamiętać, że insmode działa z pełną ścieżką modułu, podczas gdy modprobe jest zadowolony z nazwy modułu i sam wyszukuje ją w drzewie modułów dla bieżącego jądra Linux.

Listing 8: Wstawianie modułu jądra

# insmod /lib/modules/3.16.0-7-amd64/jądro/net/irda/irda.ko

# modprobe irda

Rozładunek modułów

Ostatni krok dotyczy rozładowywania modułów z działającego jądra. Ponownie dostępne są dwie komendy do tego zadania - modprobe i rmmod („usuń moduł”). Obie komendy oczekują nazwy modułu jako parametru. Listing 9 pokazuje, jak usunąć moduł IrDA z działającego jądra Linux Linux.

Listing 9: Usuwanie modułu jądra

# rmmod irda

# modprobe -r irda

Wniosek

Obsługa modułów jądra Linuksa nie jest wielką magią. Wystarczy kilka poleceń do nauczenia i jesteś mistrzem kuchni.

Dziękuję Ci

Autor dziękuje Axelowi Beckertowi (ETH Zürich) i Saif du Plessis (Hothead Studio Cape Town) za pomoc w przygotowaniu artykułu.

Linki i referencje

  • [1] Moduł jądra, wiki Arch Linux, https://wiki.archlinux.org/indeks.php/moduł_jądra
  • [2] Konfiguracja jądra, https://tldp.org/HOWTO/SCSI-2.4-HOWTO/kconfig.html
  • [3] kmod, https://git.jądro.org/pub/scm/utils/kernel/kmod/kmod.git
  • [4] Funkcja podpisywania modułów jądra, https://www.jądro.org/doc/html/v4.15/admin-przewodnik/podpisywanie modułów.html
  • [5] modtree, https://github.com/falconindy/modtree
Gry Bitwa o Wesnoth 1.13.6 Wydanie rozwojowe
Bitwa o Wesnoth 1.13.6 Wydanie rozwojowe
Bitwa o Wesnoth 1.13.6 wydana w zeszłym miesiącu jest szóstą wersją rozwojową w 1.13.Seria x i zapewnia szereg ulepszeń, w szczególności w interfejsie...
Gry Jak zainstalować League Of Legends na Ubuntu 14.04
Jak zainstalować League Of Legends na Ubuntu 14.04
Jeśli jesteś fanem League of Legends, to jest okazja do przetestowania League of Legends. Pamiętaj, że LOL jest obsługiwany w PlayOnLinux, jeśli jeste...
Gry Zainstaluj najnowszą grę strategiczną OpenRA na Ubuntu Linux
Zainstaluj najnowszą grę strategiczną OpenRA na Ubuntu Linux
OpenRA to darmowy silnik gier strategicznych czasu rzeczywistego, który odtwarza wczesne gry Westwood, takie jak klasyczny Command & Conquer: Red Aler...