Prawie wszystkie pliki poniżej /dev
to pliki urządzeń . Podczas gdy odczyt i zapis do zwykłego pliku przechowują dane na dysku lub innym systemie plików, dostęp do pliku urządzenia komunikuje się ze sterownikiem w jądrze, który generalnie z kolei komunikuje się ze sprzętem (urządzenie, stąd nazwa).
Istnieją dwa typy plików urządzeń: urządzenia blokowe (oznaczone b
jako pierwszy znak na wyjściu ls -l
) i urządzenia znakowe (oznaczone przez c
). Rozróżnienie między urządzeniami blokowymi i znakowymi nie jest całkowicie uniwersalne. Urządzenia blokowe to takie dyski, które zachowują się jak duże pliki o stałym rozmiarze: jeśli zapisujesz bajt z pewnym przesunięciem, a później odczytujesz urządzenie z tym przesunięciem, odzyskujesz ten bajt. Urządzenia znakowe są czymkolwiek innym, gdzie zapisanie bajtu ma natychmiastowy efekt (np. Jest emitowany na linii szeregowej), a odczyt bajtu ma również natychmiastowy efekt (np. Odczyt z portu szeregowego).
Znaczenie pliku urządzenia zależy od jego numeru, a nie nazwy (nazwa ma znaczenie dla aplikacji, ale nie dla jądra). Liczba to tak naprawdę dwie liczby: większa liczba wskazuje, który sterownik jest odpowiedzialny za to urządzenie, a podrzędny numer pozwala kierowcy sterować kilkoma urządzeniami¹. Liczby te pojawiają się na ls -l
liście, gdzie zwykle znajduje się rozmiar pliku. Np. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ to urządzenie ma major 8, minor 0.
Niektóre pliki urządzeń poniżej /dev
nie odpowiadają urządzeniom. Jednym z nich jest każdy system uniksowy /dev/null
; zapisywanie do niego nie ma żadnego efektu, a czytanie z niego nigdy nie zwraca żadnych danych. Jest to często wygodne w skryptach powłoki, gdy chcesz zignorować dane wyjściowe polecenia ( >/dev/null
) lub uruchomić polecenie bez wprowadzania danych ( </dev/null
). Inne typowe przykłady to /dev/zero
(które zwraca null bajty ad infinitum ) /dev/urandom
(które zwraca losowe bajty ad infinitum ).
Kilka plików urządzeń ma znaczenie, które zależy od procesu, który uzyskuje do nich dostęp. Na przykład /dev/stdin
wyznacza standardowe wejście bieżącego procesu; otwarcie z ma w przybliżeniu taki sam efekt jak otwarcie oryginalnego pliku, który został otwarty jako standardowe wejście procesu. W podobny sposób /dev/tty
oznacza terminal, z którym proces jest połączony. Pod Linuksem współcześnie /dev/stdin
przyjaciele i przyjaciele nie są implementowani jako urządzenia postaci, ale zamiast tego jako dowiązania symboliczne do bardziej ogólnego mechanizmu, który pozwala na odwołanie się do każdego deskryptora pliku (w przeciwieństwie do 0, 1 i 2 w tradycyjnej metodzie); na przykład /dev/stdin
jest dowiązaniem symbolicznym do /proc/self/fd/0
. Zobacz Jak odnosi się / dev / fd do / proc / self / fd /? .
Znajdziesz kilka symbolicznych linków pod /dev
. Może się to zdarzyć z przyczyn historycznych: plik urządzenia został przeniesiony z jednej nazwy na drugą, ale niektóre aplikacje nadal używają starej nazwy. Na przykład /dev/scd0
jest dowiązaniem symbolicznym do /dev/sr0
systemu Linux; oba oznaczają pierwsze urządzenie CD. Innym powodem, dla łączy symbolicznych jest organizacja: pod Linuksem, znajdziesz dysków twardych i partycji w kilku miejscach: /dev/sda
i /dev/sda1
i przyjaciele (każdy dysk oznaczony literą, arbitralny i przegrody zgodnie z układem partycji), /dev/disk/by-id/*
(dyski oznaczone przez niepowtarzalny numer seryjny) /dev/disk/by-label/*
(partycje z systemem plików, oznaczone etykietą wybraną przez człowieka); i więcej. Łącza symboliczne są również używane, gdy ogólna nazwa urządzenia może być jedną z kilku; na przykład/dev/dvd
może to być symboliczny link do /dev/sr0
, lub może to być link do, /dev/sr1
jeśli masz dwa czytniki CD, a drugi ma być domyślnym czytnikiem DVD.
Na koniec istnieje kilka innych plików, które możesz znaleźć /dev
z tradycyjnych powodów. Nie znajdziesz tego samego w każdym systemie. W większości jednorożców /dev/log
jest gniazdem używanym przez programy do wysyłania komunikatów dziennika. /dev/MAKEDEV
to skrypt, który tworzy wpisy w /dev
. W nowoczesnych systemach Linux wpisy w /dev/
są tworzone automatycznie przez udev , przestarzałe MAKEDEV
.
¹ W rzeczywistości nie jest to prawdą w Linuksie, ale ten szczegół ma znaczenie tylko dla autorów sterowników urządzeń.