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 w celu zajęcia się sprzętem i umożliwia zarówno komunikację, jak i interakcję między użytkownikiem a sprzętem. Jądro Linux nie jest systemem monolitycznym, ale dość elastycznym, a jądro jest rozszerzone przez tak zwane moduły jądra.

Co to jest moduł jądra?

Ogólnie rzecz biorąc, moduł jądra jest „kawałkiem kodu, który można załadować i rozładować do jądra na żądanie. Rozszerzają funkcjonalność jądra bez potrzeby ponownego uruchomienia systemu ”[1]. To prowadzi do bardzo dużej elastyczności podczas pracy.

Ponadto „moduł jądra można skonfigurować jako wbudowane lub załadowane. Aby dynamicznie załadować lub usunąć moduł, należy go skonfigurować jako moduł załadowany w konfiguracji jądra ”[1]. Odbywa się to w pliku źródłowym jądra/usr/src/linux/.Config [2]. Wbudowane moduły są oznaczone modułami „Y” i ładownymi z „M”. Jako przykład, Listing 1 pokazuje to dla modułu SCSI:

Lista 1: Deklaracja użycia modułu SCSI

Config_scsi = y # wbudowany moduł
Config_scsi = m # moduł załadunku
# Config_scsi # zmienna nie jest ustawiona

Nie zalecamy bezpośredniej edycji pliku konfiguracyjnego, ale aby użyć polecenia „Make Config”, „Make Menuconfig” lub „Make Xconfig”, aby zdefiniować użycie odpowiedniego modułu w jądrze Linux.

Polecenia modułu

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

W przypadku obecnych jąder Linux do pakietu KMOD dostarczane są następujące polecenia [3]. Wszystkie polecenia są symbolicznymi linkami do KMOD.

Lista aktualnie załadowanych modułów z LSMOD

Zaczynamy od polecenia LSMOD. LSMOD skrót od „modułów listy” i wyświetla wszystkie moduły obecnie załadowane do jądra Linux, ładnie sformatując zawartość pliku /proc /modułów. Lista 2 pokazuje swoje dane wyjściowe, które składają się z trzech kolumn: nazwa modułu, rozmiar używany w pamięci i innych modułów jądra, które używają tego konkretnego.

Lista 2: Korzystanie z LSMOD

$ lsmod
Rozmiar modułu używany przez
CTR 12927 2
CCM 17534 2
Snd_hrtimer 12604 1
SND_SEQ 57112 1
snd_seq_device 13132 1 snd_seq

$

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

Mogą być dostępne moduły jądra, o których nie jesteś jeszcze świadomy. Są przechowywane w katalogu /lib /modułach. Za pomocą Find, w połączeniu z poleceniem niezmiennym, możesz wydrukować listę tych modułów. „Uname -R” po prostu drukuje wersję aktualnie działającego jądra Linux. Listing 3 pokazuje to dla starszych 3.16.0-7 Linux
jądro i pokazuje moduły dla IPv6 i IRDA.

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

$ find/lib/module/$ (uname -r) -name '*.ko '
/lib/moduły/3.16.0-7-AMD64/Kernel/net/ipv6/ip6_vti.Ko
/lib/moduły/3.16.0-7-AMD64/Kernel/net/ipv6/xfrm6_tunnel.Ko
/lib/moduły/3.16.0-7-AMD64/Kernel/net/ipv6/ip6_tunnel.Ko
/lib/moduły/3.16.0-7-AMD64/Kernel/net/ipv6/ip6_gre.Ko
/lib/moduły/3.16.0-7-AMD64/Kernel/net/irda/irnet/irnet.Ko
/lib/moduły/3.16.0-7-AMD64/Kernel/Net/Irda/Irlan/Irlan.Ko
/lib/moduły/3.16.0-7-AMD64/Kernel/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świetl 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 dotyczących stosu protokołu bezpośredniego dostępu do podczerwieni.

Lista 4: Wyświetl informacje modułu

$ /sbin /modinfo irda
nazwa pliku:/lib/moduły/3.16.0-7-AMD64/Kernel/net/irda/irda.Ko
Alias: Net-PF-23
Licencja: GPL
Opis: Stos protokołu Linux IRDA
Autor: Dag Brattli I Jean Tourrilhes
Zależy: CRC-CCITT
Vermagic: 3.16.0-7-AMD64 SMP mod_unload MODVERSIONS
$

Dane wyjściowe zawiera różne pola informacji, takie jak pełna ścieżka modułu jądra, jego nazwa aliasu, licencja oprogramowania, opis modułu, autorzy, a także wewnętrzne jądra. Pole „zależy” pokazuje, na które inne moduły jądra to zależy.

Pola informacji różnią się w zależności od modułu. Aby ograniczyć wyjście do określonego pola informacji, Modinfo akceptuje parametr „-f” (skrót od „-field”), a następnie nazwa pola. Na liście 5 wyjście jest ograniczone do informacji o licencji udostępnianych za pomocą pola licencji.

Lista 5: Wyświetl tylko określone pole.

$ /sbin /modinfo -f licencja IRDA
GPL
$

W nowszych jądrach Linux dostępna jest przydatna funkcja bezpieczeństwa. Obejmuje to kryptograficznie podpisane moduły jądra. Jak wyjaśniono na stronie internetowej projektu jądra Linux [4]: ​​„Pozwala to na zwiększone bezpieczeństwo jądra poprzez zabezpieczenie ładowania modułów lub modułów niepodpisanych
podpisany z nieprawidłowym kluczem. Podpisanie modułu zwiększa bezpieczeństwo, utrudniając załadowanie złośliwego modułu do jądra. Sprawdzanie podpisu modułu jest wykonywane przez jądro, aby nie było konieczne posiadanie „zaufanych bitów przestrzeni użytkowników.”Poniższy rysunek pokazuje to dla
Moduł Parport_PC.

Pokaż konfigurację modułu za pomocą modprobe

Każdy moduł jądra jest wyposażony w określoną konfigurację. Modprobe poleceń, a następnie opcja „-C” (skrót od „-showconfig”) zawiera listę konfiguracji modułu. W połączeniu z GREP, wyjście to ograniczone do konkretnego symbolu. Lista 6 pokazuje to dla opcji IPv6.

Lista 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 alias: NF_DEFrag_IPV6_ENABLE NF_DEFRAG_IPV6
Symbol alias: nf_nat_icmpv6_reply_translation nf_nat_ipv6
Symbol Alias: NFT_AF_IPV6 NF_TABLES_IPV6
Symbol pseudonimu: NFT_REECT_IPV6_EVAL NFT_reject_ipv6
$

Pokaż zależności modułu

Jądro Linux zostało zaprojektowane tak, aby było modułowe, a funkcjonalność jest dystrybuowana na wielu modułach. Prowadzi to do kilku zależności modułów, które można wyświetlić ponownie za pomocą modprobe. Listing 7 używa opcji „-show-zależne”, aby wymienić zależności dla modułu i915.

Lista 7: Pokaż zależności modułu

$ /sbin /modprobe-Show-zależne od I915
insmod/lib/moduły/3.16.0-7-AMD64/Kernel/Drivers/I2C/I2C-Core.Ko
insmod/lib/moduły/3.16.0-7-AMD64/Kernel/Drivers/I2C/Algos/I2C-Algo-bit.Ko
insmod/lib/moduły/3.16.0-7-AMD64/jądro/sterowniki/termal/termal_sys.Ko
insmod/lib/moduły/3.16.0-7-AMD64/Kernel/Drivers/GPU/DRM/DRM.Ko
insmod/lib/moduły/3.16.0-7-AMD64/Kernel/Drivers/GPU/DRM/DRM_KMS_HELPER.Ko
insmod/lib/moduły/3.16.0-7-AMD64/Kernel/Drivers/ACPI/Video.Ko
insmod/lib/moduły/3.16.0-7-AMD64/jądro/sterowniki/przycisk ACPI/.Ko
insmod/lib/moduły/3.16.0-7-AMD64/Kernel/Drivers/GPU/DRM/I915/I915.Ko
$

Aby wyświetlić zależności jako drzewo podobne do polecenia „Drzewo” lub „LSBLK”, projekt Modtree [5] może pomóc (patrz rysunek poniżej drzewa modułu i915). Chociaż jest on swobodnie dostępny w GitHub, wymaga dostosowania do reguł bezpłatnego oprogramowania i stania się częścią dystrybucji Linuksa jako pakietu.

Ładowanie modułów

Ładowanie modułu do działającego jądra można wykonać za pomocą dwóch poleceń - Insmod („Wstaw moduł”) i modprobe. Pamiętaj, że istnieje niewielka, ale ważna różnica między tymi dwoma: Insmod nie rozwiązuje zależności modułu, ale Modprobe jest sprytniejszy i to robi.

Lista 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 wygląda na to, że sama w drzewie modułu bieżącego jądra Linux.

Lista 8: Wstawienie modułu jądra

# insmod/lib/modules/3.16.0-7-AMD64/Kernel/net/irda/irda.Ko

# modprobe irda

Moduły rozładunku

Ostatni krok dotyczy modułów rozładunku z bieżącego jądra. Ponownie, do tego zadania dostępne są dwa polecenia - Modprobe i RMMOD („Usuń moduł”). Obie polecenia oczekują nazwy modułu jako parametru. Lista 9 pokazuje to w celu usunięcia modułu IRDA z działającego jądra Linux.

Lista 9: Usuwanie modułu jądra

# rmmod irda

# modprobe -r irda

Wniosek

Obsługa modułów jądra Linux nie jest wielką magią. Tylko kilka poleceń do nauki, a ty jesteś mistrzem kuchni.

Dziękuję

Autor chciałby podziękować Axel Beckert (Eth Zürich) i Saif du Plessis (Hothead Studio Cape Town) za pomoc podczas przygotowywania artykułu.

Linki i referencje

  • [1] Moduł jądra, Arch Linux Wiki, https: // wiki.Archlinux.org/indeks.PHP/Kernel_Module
  • [2] Konfiguracja jądra, https: // tldp.org/howto/scsi-2.4-Howto/kconfig.html
  • [3] kmod, https: // git.jądro.org/pub/scm/utils/jądro/kmod/kmod.git
  • [4] Obiekt podpisywania modułu jądra, https: // www.jądro.org/doc/html/v4.15/admin-guide/moduł-podpisanie.html
  • [5] Modtree, https: // github.com/falconindy/modtree