Zrozumienie / dev oraz jego podkatalogów i plików

52
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. Zastanawiałem się, czy wszystkie pliki /devi podkatalogi są deskryptorami plików urządzeń?
  2. Dlaczego jest tyle linków od siebie? Na przykład /dev/fd/0, /dev/stdin, /proc/self/fd/0są wszystkie linki do /dev/pts/2.
  3. Jeśli lw lrwx------średnim łącza, co ma cna crw--w---- myśli?
Tim
źródło
3
Aby odpowiedzieć # 3, c oznacza urządzenie postaci lub znak specjalny . b oznacza blok specjalny .
felixphew

Odpowiedzi:

78

Prawie wszystkie pliki poniżej /devto 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 bjako 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 -lliś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 /devnie 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/stdinwyznacza 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/ttyoznacza terminal, z którym proces jest połączony. Pod Linuksem współcześnie /dev/stdinprzyjaciele 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/stdinjest 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/scd0jest dowiązaniem symbolicznym do /dev/sr0systemu 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/sdai /dev/sda1i 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/dvdmoże to być symboliczny link do /dev/sr0, lub może to być link do, /dev/sr1jeś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źć /devz tradycyjnych powodów. Nie znajdziesz tego samego w każdym systemie. W większości jednorożców /dev/logjest gniazdem używanym przez programy do wysyłania komunikatów dziennika. /dev/MAKEDEVto 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ń.

Gilles „SO- przestań być zły”
źródło
Dzięki! Przez „znaczenie pliku urządzenia zależy od jego numeru”, czy masz na myśli jego deskryptor pliku?
Tim
@Tim: Nie, liczby pojawiają się na ls -lliście, gdzie zwykle znajduje się rozmiar pliku, przed datą, np. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ to urządzenie ma 8 lub mniejszy numer 0. Numery urządzeń nie pojawiają się często w praktyce, wspomniałem o nich co czyni urządzenie urządzeniem (co najważniejsze, nie jest to nazwa pliku). Numer deskryptora pliku ma znaczenie tylko w określonym procesie.
Gilles „SO- przestań być zły”,
Nie, otwarcie /dev/stdin(=> /proc/self/fd/0) w systemie Linux nie ma tego samego efektu, co powielenie standardowego wejścia. Aby zobaczyć różnicę su - non_root_user, a następnie exec 5</dev/stdinzakończy się niepowodzeniem z „Permission denied”, ale exec 5<&0uda. I to nie tylko, że nowy fd zostanie otwarty z różnymi flagami, wszystko o obiektu pliku ( „descrip Otwórz plik cji ” w żargonie POSIX) będzie inny (wskaźnik pliku offset, non / tryb blokowania, itp).
mosvy
14
  1. Tak - bezpośrednio lub jako dowiązania symboliczne - po to /dev/jest.
  2. Do różnych celów: czasami dla zgodności między schematami nazewnictwa, czasem jest to konieczne dla środowiska pracy - jak na przykład /dev/stdin. Ten sposób nie wskazują statycznie do /dev/pts/2lub jakakolwiek inna - wystarczy przełączyć się na inny terminal, a zobaczysz. /dev/stdinjest standardowym wejściem bieżącej sesji terminala. To także przykład, dlaczego musi to być dowiązanie symboliczne.
  3. Zobacz man mknodi info coreutils 'mknod invocation'. Zasadniczo coznacza typ urządzenia chararacter.
rozcietrzewiacz
źródło
3
„standardowe wejście bieżącej sesji terminala” jest nieco niejednoznaczne. /dev/stdinodnosi się do standardowego wejścia procesu, który go otworzy. Wszystko w tym /proc/$pidjest danymi zależnymi od procesu i /proc/selfjest rodzajem magicznego dowiązania symbolicznego do własnych danych procesu.
Stéphane Gimenez
11

W przypadku pierwszego pytania nie są to deskryptory plików, lecz pliki urządzeń. (alias „dev nodes”)

Pliki te są powiązane ze sterownikiem obsługującym urządzenie przy użyciu głównych i mniejszych liczb. (Na przykład „136, 2” w danych lswyjściowych odnosi się do sterownika urządzenia powiązanego z liczbą główną 136 i określa urządzenie nr 2 obsługiwane przez ten sterownik.)

Pierwsza litera wyniku ls -lto typ urządzenia w przypadku plików urządzeń. Jeśli jest to „c”, to jest to urządzenie znakowe lub jeśli jest to „b”, to jest to urządzenie blokowe.

Na drugie pytanie patrz powyższa odpowiedź rozcietrzewiacz.

rządzący
źródło
1
Link „Wprowadzenie do sterowników urządzeń” wydaje się być uszkodzony.
Slothworks,