Zarządzanie sprzętem

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).

  • Urządzenie to fizyczny sprzęt taki jak procesor, dysk czy karta graficzna.
  • Intefejs to oprogramowanie, które umożliwia dostęp do urządzenia. Urządzenie może mieć więcej niż jeden interfejs. Intefejs jest zwykle tworzony przez sterownik.

Sterowniki dzielimy na dwie grupy:

  • Moduły jądra, które pozwalają na dostęp do sprzętu. Moduly mogą być ładowane i wyłączane podczas działania systemu.
  • Sterowniki przestrzeni użytkownika, które dają dostęp do dodatkowych urządzeń, jak np. drukarki czy skanery.

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ń:

  • lsmod - pokazuje listę załadowanych modułów
  • insmod moduł - ładuje wybrany moduł (zalecane jest używanie polecenia modprobe)
  • rmmod moduł- usuwa wybrany moduł
  • modprobe moduł - ładuje wybrany moduł oraz, jeśli jest potrzeba, inne moduły niezbędne do działania; zależności są wczytywane z pliku /lib/modules/wersja/modules.dep (generowanego przez depmod); dodatkowo wczytywane jest konfiguracja z pliku /etc/modprobe.conf
  • modprobe -r moduł - usuwa wybrany moduł
  • depmod - tworzy plik zależności między modułami /lib/modules/wersja/modules.dep.
  • modinfo [opcje] module - wyświetla informacje o module

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:

  • initrd - tutaj są ładowane bardzo niskopoziomowe sprzętu, jak np. dysk twardy.
  • skrypty inicjujące - tutaj przykładem są sterowniki do karty dźwiekowej
  • udev - większość pozostałych sprzętów ładowanych przez hwup
  • X Server - sterownik graficzny do obsługi np. grafiki 3D
  • ręcznie - korzystając z modprobe lub bardziej niskopoziomowe hwup

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:

  • /sys/bus, /sys/devices - katalogi reprezentujące sprzęt fizyczny; w obu jest to samo, ale prezentowane na rózne sposoby,
  • /sys/class, /sys/block - interfejsy urządzeń, podobnie, w obu katalogach jest to samo, ale prezentowane na różne sposoby. Poszczególne interfejsy ma swóje katalogi, w których są pliki zawierające różne informacje (np. rozmiar - plik size).

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:

  • Automatycznie tworzy pliki urządzeń w /dev w momencie, gdy się one pojawiają w systemie. Za czasów devfs katalog był statyczny, tzn. utworzone były pliki wszystkich urządzeń które są i którą potencjalnie mogą sie pojawić.
  • Stałe nazwy urządzeń, czyli niezależne od restartów i kolejości ładowania się sterowników.
  • udev działa w przestrzeni użytkownika, a nie w przestrzeni jądra, co m.in. powoduje przeniesieni obsługi nazw urządzeń poza jądro systemu.

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:

  • tworzy urządzenie wywołując hwup (będzie omówione dalej)
  • tworzy pliki w /dev
  • konfiguruje interfejsy sieciowe przez ifup, jeśli trzeba, zmienia nazwy interfejsów sieciowych
  • jeśli rozpozna urządzenie jako typu hotplug, montuje zgodnie z konfiguracją w pliku /etc/fstab
  • poprzez HAL-a (Hardware Abstraction Layer) powiadamia pozostałe aplikacje o pojawieniu się nowego urządzenia

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:

  • kolejności ładowania sterowników,
  • kolejności podłączania urządzeń do komputera.

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:

  • w plikach konfiguracyjnych,
  • z systemu sysfs.

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.

Literatura