Na początku wyjaśnimy pewną istotną kwestię związaną z terminologią, a mianowicie różnicę między terminami urządzenie (device) a interfejs (interface).
Sterowniki dzielimy na dwie grupy:
Zwykle sterowniki przestrzeni użytkownika korzystają ze jakichś modułów jądra.
[tu będzie obrazek]
Obsługa steroników użytkownika jest związane z dodatkowych oprogramowaniem, to do obsługi modułów jądra mamy kilka podstawowych poleceń:
Moduły jądra oraz pliki z nimi związane są w katalogu:
/lib/modules/wersja-jądra/
Moduły są w plikach o rozszerzeniu .ko. Jako argument do poleceń lsmod, modprobe, itd. podajemy samą nazwę modułu (bez rozszerzenia .ko).
Moduły mogą być załadowane:
System plików sysfs
sysfs to wirtualny system plików podmontowany w katalogu /sys. Zawiera on generowane przez jądro informacje o sprzęcie. Mamy w nim 4 główne katalogi:
Wartą uwagi rzeczą jest tutaj wykorzystanie linków symbolicznych do powiązania urządzeń z intefejsami tych urządzeń, np.
# ls -l /sys/block/sda/device lrwxrwxrwx 1 root root 0 Jan 27 13:30 /sys/block/sda/device -> ../../devices/pci0000:00/0000:00:10.0/host0/target0:0:0/0:0:0:0
udev
Jest to podsystem odpowiedzialny za obsługę katalogu /dev. Pojawił się w systemie od jądra w wersji 2.6 i zastąpił devfs. Jego podstawowe cechy są następujące:
udev działa jako usługa (udevd) i jest uruchamiany przez skrypt /etc/init.d/boot.d/S02boot.udev. Jego działanie jest sterowane przez komunikaty uevent: jądro wysyła komunikat uevent z informacją, że urządzenie zostało do systemu dodane lub z niego usunięte i wtedy udev działa w oparciu o następujące zasady:
Wszelkie działania udev są określone za pomocą reguł, które są zapisane w /etc/udev/rules.d/. Tworzenie reguł to jest osobny, spory temat, którego tu nie będziemy na razie poruszać. Zainteresowani mogę sobie poczytać tutaj.
Do śledzenia działania udev mamy program udevmonitor.
Trwałe nazewnictwo interfejsów urządzeń
Pliki intefejsów urządzeń są tworzone w katalogu /dev dla sprzętu uruchomionego przez odpowiednie sterowniki. Niestety nazewnictwo tych plików interfejsów może zależeć od:
Taka sytuacja oczywiście prowadziłaby do sytacji, w której po każdym włączeniu komputera nie wiedzielibyśmy jak dostać się do np. aparatu, bo raz plik nazywa się np. /dev/sda, a za chwilę /dev/sdb. Z pomocą przychodzi udev, który potrafi tworzyć sie linki symboliczne o przyjaznej nazwie. Co więcej, nazwy tych linków możemy określić za pomocą reguł udev i przykładowo domyślnie w katalogu /dev/disk tworzone są podkatalogi: by-id, by-path, by-uuid, które umożliwiają dostęp do dysków po nazwach dostawcy i urządzenia (by-id), po fizycznej lokalizacji urządzenia w slotach na płycie głównej (by-path) oraz po numerze seryjnym (by-uuid). Te reguły są zebrane w pliku /etc/udev/rules.d/60-persistent-storage.rules. Dzięki tym regułom możemy do pewnego stopnia zapanować nad nazewnictwem plików do urządzeń i tym samym dostępem do nich.
Wyjątkiem są tutaj interfejsy sieciowe, które nie mają swoich plików w /dev, ale mają plik reguł, który określa nazwy tych intefejsów: /etc/udev/rules.d/30-net_persistent_names.rules. Często się zdarza, że po przekładaniu kart sieciowych lub kombinowaniu przy maszynie wirtualnej, nagle interfejsy mają nazwy eth3 i eth4. Możemy to zmienić edytując ww. plik.
Program hwup
Polecenie to służy do załadowania modułu sterownika oraz do uruchomienia urządzenia. Jest ono używane przede wszystkim przez udev, chociaż można także używać go manualnie. Polecenie przyjmuje jeden argument, który jest identyfikatorem urządzenia, np.:
# hwup bus-pci-0000:02:01.0
co w ty przypadku reprezentuje kartę sieciową (bus i pci określają rodzaj urządzenia). Identyfikatory można uzyskać podając polecenie lspci (w wyniku dostajemy ID bez prefiksu 0000:). Analogicznie mamy polecenia hwdown i hwstatus, które jednak nie są osobnymi poleceniami, tylko linkami do hwup, przykładowo:
# hwstatus bus-pci-0000:02:01.0 DRIVER=pcnet32 MODULE=pcnet32
Są dwa miejsca, w których hwup szuka informacji o tym, który moduł sterownika załadować dla urządzenia:
Pliki konfiguracyjne
Pliki konfiguracyjne są w katalogu /etc/sysconfig/hardware. Przykładowo, dla naszej karty sieciowej będzie to plik
/etc/sysconfig/hardware/hwcfg-bus-pci-0000:02:01.0
o zawartości
MODULE='pcnet32' MODULE_OPTIONS='' STARTMODE='auto'
Wystarczy jak widać niewiele, żeby urządzenie skonfigurować (wystarczy znać tylko nazwę modułu). Jednak jeśli nie pamiętamy, jak taki plik ma wyglądać lub potrzebujemy większej liczby szczegółów, to mamy do dyspozycji pliki z katalogu
/etc/sysconfig/hardware/skel/
Przykładowo plik hwcfg-qeth może być szablonem dla urządzenia karty sieciowej.
Punktem wyjścia do szukania informacji może być man hwup
System sysfs
W przypadku, gdy brakuje pliku konfiguracyjnego, hwup używa sysfs, aby ustalić sterownik do załadowania. Dokładniej, szuka pliku /sys/bus/devices/<id>/modalias, który identyfikator urządzenie i następnie przekazuje ten plik do polecenia modprobe. Modprobe z kolei szuka odpowiedzi w pliku modules.alias, który jest poniekąd bazą danych sterowników.
Aby zablokować automatyczne ładowanie sterowników, możemy je dopisać do pliku /etc/modprobe.c/blacklist. Tak jest np. w przypadku karty dźwiękowej, której sterownik jest ładowany przez skrypt alsasound.
Na koniec nie sposób nie wspomnieć o YaST. Mamy do dyspozycji moduł Hardware, Hardware Information, za pomocą którego możemy w wygodny sposób przeglądać sprzęt dostępny w systemie.