33.DOC

(174 KB) Pobierz









Rozdział 33.
Urządzenia









E:\Moje dokumenty\HELION\Linux Unleashed\Indeks\33.DOC              535










Rozdzia³ 33. ¨ Urządzenia              555

Tim Parker

W tym rozdziale:

u                                          Urządzenia znakowe i blokowe             

u                                          Drukarki             

u                                          Terminale             

u                                          Modemy             

Ten rozdział poświęcony jest urządzeniom, które podłączyć można do systemu linuxowego – takim jak terminale, modemy i drukarki. Omawia problemy dotyczące dodawania poszczególnych urządzeń i zarządzania nimi, jak również polecenia służące do tego celu.

Informacje przedstawione w tym rozdziale będą niezbędne w przypadku, jeśli chcesz, by system działał bez zarzutu. Nawet jeśli nie zamierzasz podłączać terminalu czy modemu, powinieneś wiedzieć co nieco o procesie uruchamiania systemu i o tym, jak obsługiwane są pliki konfiguracyjne.

Urządzenia znakowe i blokowe

Wszystko, co podłączone jest do komputera, traktowane jest przez Linuxa jednakowo – jako urządzenie. Nie ma znaczenia, czy jest to terminal, dysk twardy, drukarka czy modem. Wszystko, co potrafi wysyłać albo odbierać dane od systemu operacyjnego, jest urządzeniem.

Koncepcja traktowania wszystkich urządzeń jednakowo przeniesiona została z systemów UNIX-owych. Każdy typ urządzenia posiada w jądrze systemu przeznaczony do jego obsługi kod, nazywany sterownikiem. Zawiera on wszystkie, potrzebne do komunikowania się z urządzeniem. Nowo opracowane urządzenie może być używane w systemie linuxowym dopiero po napisaniu odpowiedniego sterownika.

Dzięki temu, że sterowniki urządzeń są zapisywane w osobnych plikach, mogą być one ładowane w razie potrzeby (w przypadku urządzeń używanych rzadko) lub przechowywane w pamięci przez cały czas pracy systemu. Jeśli urządzenia zostaną w jakiś sposób zmodyfikowane, możliwe jest również dołączenie do jądra odpowiednio dostosowanego sterownika, pozwalającego poprawić wydajność czy udostępniającego nowe możliwości.

Kiedy aplikacja odwołuje się do urządzenia, jądro systemu nie musi martwić się szczegółami jego obsługi. Po prostu przekazuje żądanie dalej, do sterownika, pozwalając mu obsłużyć komunikację. Jeśli na przykład wpisujesz coś z klawiatury terminalu, jego sterownik przyjmuje informacje o naciśnięciach klawiszy, a następnie przekazuje je do powłoki czy innej aplikacji, filtrując po drodze wszystkie kody specjalne, z którymi jądro systemu nie umiałoby sobie poradzić i zastępując je kodami zrozumiałymi dla kernela.

Pliki urządzeń przechowywane są w katalogu /dev. Wiąże się to z ogólnie przyjętą konwencją, ale można je przechowywać w dowolnym miejscu.

Urządzenia mogą komunikować się z systemem na dwa sposoby: przesyłając informacje znak po znaku lub blokami. Terminale, drukarki i modemy asynchroniczne są urządzeniami znakowymi, tzn. wykorzystują pierwszy mechanizm komunikacji, przesyłając jednorazowo tylko jeden znak, który jest odbierany przez urządzenie na drugim końcu połączenia. Dyski twarde i większość napędów taśmowych używa komunikacji blokowej, ponieważ pozwala ona na osiągnięcie większych prędkości przesyłania danych – są one nazywane urządzeniami blokowymi.

 

Urządzenia znakowe można również odróżnić od blokowych rozpatrując sposób, w jaki buforowana jest transmisja danych. Urządzenia znakowe zwykle same dokonują buforowania. Urządzenia blokowe, które przeważnie przesyłają i odbierają dane w blokach po 512 lub 1024 bajty, wymagają buforowania przez jądro systemu.

Niektóre urządzenia mogą działać zarówno jako urządzenia blokowe, jak i znakowe – dotyczy to np. niektórych napędów taśmowych. Posiadają one wtedy dwa osobne sterowniki, a wybór trybu komunikacji zależy od użytkownika.

Urządzenia blokowe i znakowe można rozróżnić wydając polecenie ls –l w katalogu /dev. W kolumnie zawierającej prawa dostępu pierwsza litera oznacza typ urządzenia: c – urządzenie znakowe, b – blokowe.

Pliki urządzeń zwykle mają nazwy pozwalające na ich identyfikację (na przykład nazwy terminali zaczynają się od liter tty, ang. teletype) i zawierające numer czy litery identyfikujące konkretne urządzenie (np. tty1, tty1A czy tty04). W połączeniu ze ścieżką dostępu /dev daje to pełne nazwy urządzeń, takie jak /dev/tty01 itp.

Główne i poboczne numery urządzeń

W systemie linuxowym może działać więcej niż jedno urządzenie danego typu – można na przykład zainstalować kartę multiport, do której podłączonych jest 10 terminali. Dla wszystkich tych terminali Linux może używać tego samego sterownika (zakładając, że są to terminale tego samego typu).

Musi jednak istnieć metoda pozwalająca systemowi zorientować się, który z terminali chcesz zaadresować. Służą do tego numery urządzeń. Numer główny identyfikuje sterownik, którego należy użyć, natomiast numer poboczny jest numerem samego urządzenia. Wszystkie terminale z powyższego przykładu będą więc posiadały taki sam numer główny, ale różne numery poboczne, dzięki czemu system będzie mógł je rozróżnić.

Każde urządzenie w systemie ma przypisaną unikalną parę numer główny-numer poboczny. Jeśli dwa urządzenia miałyby takie same numery, Linux nie potrafiłby komunikować się z nimi poprawnie.

Niektóre sterowniki urządzeń wykorzystują jednak te numery w dość dziwaczny sposób. Przykładowo, sterowniki napędów taśmowych czasem używają numeru pobocznego, by zidentyfikować gęstość zapisu danych na taśmie.

Pliki urządzeń tworzy się poleceniem mknod (ang. make node), a usuwa tak, jak normalne pliki – poleceniem rm.

Polecenie mknod

Polecenie mknod spełnia w systemie Linux kilka funkcji. Potrafi utworzyć kolejkę (ang. FIFO – first in, first out) oraz pliki urządzeń blokowych i znakowych. Jego składnia jest następująca:
mknod [opcje] urządzenie b|c|p|u nr_główny nr_poboczny

Opcje mogą przybierać następujące wartości:

--help:               wyświetlenie krótkiej instrukcji obsługi i zakończenie programu,

-m:               ustalenie praw dostępu do tworzonego pliku
(domyślnie 0666 – dozwolona jest tylko notacja symboliczna),

--version:               wyświetlenie informacji o wersji i zakończenie programu.

Argument po nazwie urządzenia określa jego typ; dostępne wartości to: b – urządzenie blokowe, c – urządzenie znakowe, p – kolejka (FIFO) i u – niebuforowane urządzenie znakowe. Trzeba użyć dokładnie jednej z tych wartości.

Następnie podać należy dwie liczby, określające główny i poboczny numer urządzenia. Oba te numery są wymagane w przypadku urządzeń znakowych, blokowych i niebuforowanych. Nie trzeba ich podawać w przypadku tworzenia kolejki.

Przykłady użycia tego polecenia pojawią się w dalszej części tego rozdziału, gdy omawiać będziemy dodawanie do systemu nowych urządzeń.

Drukarki

Drukarki są bardzo często używanymi urządzeniami i raczej nie sprawiają kłopotów administratorom. Łatwo je skonfigurować, o ile dostępne są dane techniczne sprzętu. Zarządzanie kolejkami drukowania również nie jest trudne, ale jak to często bywa w Linuxie, żeby system sprawował się bez zarzutu, trzeba znać kilka drobnych „sztuczek”.

Linux oparty jest na wersji BSD systemu UNIX, która – niestety – nie była najlepiej rozwiązana, jeśli chodzi o obsługę drukowania. Mimo tego, ponieważ Linux rzadko używany jest w bardzo dużych sieciach posiadających wiele drukarek, administrowanie nimi można sprowadzić do niezbędnego minimum. Trzeba jednak zdawać sobie sprawę z faktu, że polecenia służące do administrowania drukarkami w systemie BSD UNIX uważane są za niespójne i generalnie niezbyt przyjemne.

lpd – rezydentny program drukujący

Drukowanie w systemie Linux obsługiwane jest przez program rezydentny lpd. Podczas uruchamiania systemu lpd odczytuje zawartość pliku /etc/printcap, szukając sekcji dotyczących drukarek podłączonych do systemu. Używa on dwóch innych procesów, listen i accept, które przyjmują zlecenia drukowania kopiując je do katalogu kolejki (ang. spool directory).

W większości przypadków modyfikacja zachowania programu lpd nie jest konieczna. Może się jednak zdarzyć, że trzeba będzie go zrestartować. Należy wtedy zakończyć odpowiedni proces (za pomocą polecenia kill), a następnie uruchomić go ponownie poleceniem:

 

lpd [-l] [port]

Opcja –l załącza rejestrowanie wszystkich zleceń drukowania, co czasem przydaje się przy szukaniu błędów w systemie drukowania. Parametr port jest internetowym numerem portu, który należy podać, jeśli nie chcemy używać domyślnych ustawień systemowych. Najprawdopodobniej nigdy nie będziesz musiał użyć tych opcji.

Rozmiar kolejek drukowania (każda drukarka posiada własny katalog, zawierający pliki do wydrukowania, nazywany po angielsku spool directory) jest określony w plikach o nazwie minfree zawartych w każdym z katalogów kolejek. Plik taki zawiera liczbę bloków dysku, które należy zarezerwować, dzięki czemu duże zadania drukowania nie zapełniają dysku twardego. Plik minfree może być modyfikowany za pomocą dowolnego edytora tekstów.

Nie każdy użytkownik ma jednak prawo drukować. Program lpd sprawdza zawartość plików /etc/hosts.equiv i /etc/host.lpd; jeśli nazwa systemu, z którego loguje się użytkownik, nie jest wymieniona w żadnym z tych plików, żądanie drukowania zostanie zignorowane. Ponieważ nazwa systemu lokalnego zawsze znajduje się w pliku hosts.equiv, jego użytkownicy zawsze mogą drukować.

Proces drukowania

Prześledźmy proces drukowania, idąc tropem zlecenia wydruku. Jest ono generowane przez program lpr. Zbiera on razem dane przeznaczone do wydrukowania i kopiuje je do katalogu kolejki, w którym oczekują na obsłużenie przez program lpd.

 

Program lpr jest jedynym programem, który może wstawiać pliki do kolejki drukowania. Wszystkie inne programy pozwalające na drukowanie działają w oparciu o ten program.

Sposób, w jaki plik ma zostać wydrukowany, można określić w wierszu poleceń (podając odpowiednie opcje polecenia lpr) lub ustalając odpowiednie wartości zmiennych środowiskowych – jeśli nie zostaną przekazane żadne argumenty i wartości odpowiednich zmiennych nie są zdefiniowane, użyte zostaną domyślne wartości systemowe.

Program lpr wie, do której kolejki ma dołączyć plik do wydrukowania, dzięki oznaczeniu drukarki docelowej. Nazwę drukarki docelowej można podać w wierszu poleceń lub ustalając wartość odpowiedniej zmiennej środowiskowej. Po określeniu, do której drukarki skierowane jest żądanie wydruku, lpr szuka wpisu w pliku /etc/printcap zawierającego informacje o tejże drukarce, między innymi o ścieżce dostępu do jej katalogu kolejki (zwykle /usr/spool/nazwa_drukarki, na przykład /usr/spool/lp1).

Następnie program lpr tworzy w katalogu kolejki dwa pliki. Nazwa pierwszego z nich zaczyna się od liter cf (ang. control file), po których następuje numer identyfikacyjny zlecenia drukowania. W tym pliku zawarte są informacje dotyczące zadania drukowania, między innymi identyfikator użytkownika, który wydał zlecenie drukowania. Drugi plik ma nazwę zaczynającą się od liter df (ang. data file) i zawiera dane, które mają zostać wydrukowane. Po zakończeniu tworzenia pliku z danymi program lpr informuje program lpd o fakcie, że w kolejce czeka na obsłużenie nowe zadanie.

Kiedy program lpd otrzymuje sygnał od lpr, sprawdza w pliku /etc/printcap, czy drukarka docelowa jest drukarką lokalną, czy sieciową. Jeśli jest to drukarka sieciowa, otwarte zostaje połączenie z systemem zdalnym, a następnie plik kontrolny i plik danych zostają przeniesione do tego systemu.

Jeśli drukarka jest drukarką lokalną, lpd sprawdza, czy jest ona dostępna i aktywna, a następnie wysyła zlecenie drukowania do programu rezydentnego obsługującego daną kolejkę drukowania.

Plik /etc/printcap i katalogi kolejki

Zarówno program lpr, jak i lpd korzysta z danych zapisanych w pliku /etc/printcap. Plik ten zawiera informacje o wszystkich drukarkach dostępnych w systemie linuxowym.

Format tego pliku jest prosty (i podobny do formatu pliku /etc/termcap, zawierającego informacje o terminalach). Oto przykładowy wpis:

 

# HP Laserjet
lp|hplj|laserjet-michal|HP LaserJet 4M w pokoju 425:\
              :lp=/dev/lp0:\
              :sd=/usr/spool/lp0:\
              lf=/usr/spool/errorlog:\
              mx#0:\
              of=/usr/spool/lp0/hpjlp:\

Pierwsze pole każdego wpisu to lista nazw danej drukarki (nazwy te mogą być używane zamiennie). Za pomocą tych nazw identyfikowana jest drukarka, która ma wydrukować określone dane – nazwa taka może być użyta przy ustalaniu wartości jednej ze zmiennych środowiskowych lub jako jeden z argumentów polecenia lpr. Dostępne nazwy rozdzielane są kreską pionową.

Zwykle każda drukarka posiada co najmniej trzy nazwy: krótką, składającą się z czterech lub mniej znaków (np. hplj), nieco dłuższą, zawierającą np. identyfikator jej właściciela (np. laserjet-michal), oraz pełną, opisową nazwę, zawierającą informacje niezbędne do zidentyfikowania urządzenia (np. HP LaserJet 4M w pokoju 425).

 

Jeśli zlecenie drukowania nie zawiera informacji o drukarce docelowej, a informacja taka nie jest również dostępna poprzez zmienne środowiskowe, zadanie zostaje skierowane do drukarki o nazwie lp. Z tego powodu jedna z drukarek powinna posiadać nazwę (jedną z kilku) lp.

W pliku /etc/printcap komentarze oznacza się znakiem # na początku wiersza. Po nazwie drukarki następuje zestaw dwuznakowych nazw parametrów i ich wartości. Format tych wpisów jest następujący:

NN              wartość logiczna

NN=tekst              wartość tekstowa tekst;

...

Zgłoś jeśli naruszono regulamin