Czy moduły sterowników są ładowane i rozładowywane automatycznie?


15

Na Ubuntu 14.04 odkryłem, że kiedy nie podłączam zewnętrznego adaptera bezprzewodowego, jego moduł rt2800usbjest nadal wyświetlany lsmod.

  1. kiedy nastąpi automatyczne ładowanie modułu sterownika? Czy dzieje się to, gdy urządzenie jest podłączone do komputera lub gdy system operacyjny uruchamia się?

  2. kiedy nastąpi automatyczne rozładowanie modułu sterownika? Czy dzieje się to, gdy urządzenie jest odłączone od komputera lub gdy system operacyjny wyłącza się?

Odpowiedzi:


13

Kiedy jądro wykryje nowe urządzenie, uruchamia program modprobei przekazuje mu nazwę identyfikującą urządzenie. Większość urządzeń jest identyfikowana za pomocą zarejestrowanych numerów dla dostawcy i modelu, np . Identyfikatory PCI lub USB . modprobeProgram konsultuje tabelę moduł alias , aby znaleźć nazwę pliku, który zawiera sterownik dla tego urządzenia. Podobna zasada dotyczy sterowników rzeczy, które nie są urządzeniami sprzętowymi, takich jak systemy plików i algorytmy kryptograficzne. Aby uzyskać więcej informacji, zobacz Debian nie wykrywa szeregowej karty PCI po ponownym uruchomieniu/lib/modules/VERSION/modules.alias

Gdy modprobe zidentyfikuje, który plik modułu ( .ko) zawiera żądany sterownik, ładuje plik modułu do jądra: kod modułu jest dynamicznie ładowany do jądra. Jeśli moduł zostanie pomyślnie załadowany, pojawi się na liście z lsmod.

Automatyczne ładowanie modułów ma miejsce, gdy jądro wykryje nowy sprzęt z możliwością podłączenia na gorąco, np. Po podłączeniu urządzenia peryferyjnego USB. System operacyjny wykonuje również wyliczenie całego sprzętu obecnego w systemie na początku uruchamiania, aby załadować sterowniki urządzeń peryferyjnych obecnych w czasie uruchamiania.

Możliwe jest również ręczne zażądanie załadowania modułu za pomocą polecenia modprobelub insmod. Większość dystrybucji zawiera skrypt startowy, który ładuje moduły wymienione w /etc/modules. Innym sposobem ładowania modułów jest to, że zależą one od modułu: jeśli moduł A zależy od modułu B, to modprobe Aładuje B przed załadowaniem A.

Po załadowaniu modułu pozostaje on załadowany do momentu jawnego rozładowania, nawet jeśli wszystkie urządzenia korzystające z tego sterownika zostaną odłączone. Dawno temu istniał mechanizm automatycznego rozładowywania nieużywanych modułów, ale został usunięty, jeśli dobrze pamiętam, kiedy udev pojawił się na scenie. Podejrzewam, że automatyczne rozładowywanie modułów nie jest częstą cechą, ponieważ systemy, które zwykle tego potrzebują, to w większości komputery stacjonarne, które i tak mają dużo pamięci (w skali kodu sterownika).


Dzięki. Nie zmodyfikowałem /etc/modules. rt2800usbjest w wyjściu lsmodi czy to oznacza, że ​​podłączyłem jego urządzenie do mojego komputera przed uruchomieniem?
Tim

1
@Tim Jeśli moduł jest załadowany, a nie został załadowany jawnie i nie ma go na liście /etc/modules, to tak, prawdopodobnie przyczyną załadowania modułu jest to, że urządzenie było w pewnym momencie obecne.
Gilles 'SO - przestań być zły'

5

Moduły są ładowane, gdy system uruchamia się za pomocą początkowego dysku RAM, czyli initrd . Sekcja uzasadnienia stanowi:

Wiele dystrybucji Linuksa dostarcza pojedynczy, ogólny obraz jądra Linuksa - taki, który programiści tworzą specjalnie dla rozruchu na szerokiej gamie sprzętu. Sterowniki urządzeń dla tego ogólnego obrazu jądra są zawarte jako ładowalne moduły jądra, ponieważ statyczna kompilacja wielu sterowników w jednym jądrze powoduje, że obraz jądra jest znacznie większy, być może zbyt duży, aby można go było uruchomić na komputerach z ograniczoną pamięcią. Rodzi to problem z wykrywaniem i ładowaniem modułów niezbędnych do zamontowania głównego systemu plików podczas rozruchu lub, w tym przypadku, dedukowaniem gdzie lub czym jest główny system plików.

Ubuntu, podobnie jak wiele innych dystrybucji, wybiera ładowanie każdego sterownika urządzenia do tego initrd, niezależnie od tego, czy sterownik jest potrzebny, czy nie, a także niezależnie od tego, czy urządzenie jest obecne w systemie, czy nie. Jak zauważył Giles, całość jest ładowana do pamięci RAM, a następnie używane moduły są wykrywane podczas uruchamiania, a nieużywane są usuwane z pamięci RAM. Korzystanie z tego podejścia gwarantuje, że Ubuntu zawsze uruchomi się na dowolnym systemie, niezależnie od konfiguracji. Ubuntu naśladuje monolityczne jądro za pomocą konstrukcji mikrojądra. Zobacz powód, dla którego to działa


  1. Moduł rt2800usbzawsze będzie ładowany podczas uruchamiania, ponieważ moduł był zawarty w initramfs , o którym wspomniał Gilles. Initramfs jest następcą initrd, dlatego zawsze będzie pokazywany przez lsmod. Zauważ, że możesz wstawić nowo skompilowany moduł do jądra za pomocą, modprobea następnie nazwy modułu.

W ramach testu uruchom ponownie system z odłączoną kartą sieci bezprzewodowej. Jeśli wszystko pójdzie dobrze, moduł nie zostanie wymieniony w lsmoddanych wyjściowych, ponieważ podczas uruchamiania proces wykrywania rozpoczęty przez initramfs i init sstem nie znalazł urządzenia podczas sondowania, a moduł został usunięty z pamięci RAM.

  1. Aby usunąć moduł podczas działania systemu, możesz użyć poleceń takich jak rmmodlub modprobe -rpo nazwie modułu. Przy następnym uruchomieniu moduł zostanie ponownie załadowany. Patrz wyżej. W większości przypadków moduł nie jest usuwany dynamicznie, ponieważ spowodowałoby to wyłączenie hotplugging, tj. Po usunięciu modułu urządzenia go używającego nie można ponownie wykryć po ponownym podłączeniu.

Aby usunąć moduł lsmod, musisz go usunąć z obrazu initramfs utworzonego przez rekompilację jądra bez wybranego modułu, a następnie przebudowanie obrazu. Wykonanie tej czynności wyłącza wszelkie wykrywanie wspomnianego modułu.


3
Mylicie ładowanie pliku do pamięci RAM jako część dysku RAM i ładowanie (tj. Dynamiczne łączenie) modułu do działającego jądra. Moduły ładowane są tymczasowo do pamięci - nie do jądra - z initrd (technicznie obecnie jest to initramfs), ale są następnie usuwane z pamięci po zamontowaniu prawdziwego katalogu głównego. Moduły ładowane są do jądra tylko wtedy, gdy wykryte zostanie urządzenie, które ich używa (z kilkoma wyjątkami).
Gilles 'SO - przestań być zły'

Chociaż zgadzam się tutaj, mówił o rozładowaniu i załadowaniu jednego modułu, czego nie można zrobić, chyba że zdecyduje się na rekonfigurację dysku RAM Ubuntu, co nie jest zalecane, ponieważ Ubuntu wybiera ładowanie wszystkich modułów do pamięci RAM przy każdej aktualizacji jądra. Wszystkie moduły są ładowane za każdym razem, po prostu nie wszystkie są używane.
eyoung100

2
Nie, pytanie dotyczy ładowania i rozładowywania modułu do jądra. Ani pierwotna odpowiedź, ani poprawiona odpowiedź nie rozwiązują tego problemu. Initramfs nie ma znaczenia (lub co najwyżej ma znaczenie peryferyjne) dla tego pytania.
Gilles „SO- przestań być zły”

@Gilles Czy to lepiej?
eyoung100 21.04.15

1
@ eyoung100, zgadzam się z Gilles. Dyskusja o initramfs nie ma znaczenia dla pytania. Moduły są zazwyczaj ładowane przez wyliczanie urządzeń /sysi ładowanie sterowników urządzeń faktycznie znalezionych w systemie. Dzieje się tak, niezależnie od tego, czy urządzenie jest obecne podczas rozruchu, czy jest podłączane podczas pracy. udevma z tym znacznie więcej wspólnego niż initramfs / initrd, i to, czy wszystkie, większość lub tylko niektóre moduły są kopiowane do initramfs (opcja konfiguracji w /etc/initramfs-tools/initramfs.conf) nie jest szczególnie istotne.
Celada
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.