Device file

Specjalny plik (zwykle w /dev) reprezentujący urządzenie sprzętowe lub wirtualne dla przestrzeni użytkownika. Pozwala obsługiwać sprzęt jak zwykły plik.

Device file (plik urządzenia) to specjalny plik — najczęściej leżący w katalogu /dev — który reprezentuje urządzenie sprzętowe (dysk, klawiaturę, port) albo wirtualne (np. generator losowych bajtów) i udostępnia je przestrzeni użytkownika. Dzięki niemu w Linuksie i innych systemach uniksowych obowiązuje zasada „wszystko jest plikiem”: zamiast wymyślać osobne API do każdego sprzętu, gadasz z nim tak, jak ze zwykłym plikiem — przez open, read, write i close.

Device file nie przechowuje danych jak zwykły plik. To raczej wskaźnik do sterownika w jądrze. System rozpoznaje go po dwóch liczbach: major number (który sterownik obsługuje urządzenie) i minor number (które konkretne urządzenie spośród obsługiwanych). Pliki urządzeń dzielą się na dwa typy: character devices (oznaczone literą c w ls -l, przesyłają dane strumieniowo bajt po bajcie — np. terminale, /dev/random) oraz block devices (litera b, operują blokami danych z buforowaniem — np. dyski /dev/sda).

W praktyce nie tworzysz tych plików ręcznie — robi to udev, który dynamicznie zarządza zawartością /dev przy podłączaniu i odłączaniu sprzętu. Wpinasz pendrive’a i nagle pojawia się /dev/sdb1? To właśnie udev w akcji.

Przykład z praktyki

Klasyk: chcesz zrobić surowy obraz całego dysku. Odwołujesz się do block device, nie do zamontowanego katalogu:

sudo dd if=/dev/sda of=backup.img bs=4M status=progress

Albo wyzerować plik o rozmiarze 100 MB z pseudourządzenia /dev/zero:

dd if=/dev/zero of=plik.bin bs=1M count=100

Detale pliku urządzenia podejrzysz przez ls -l /dev/sda — zamiast rozmiaru zobaczysz parę liczb 8, 0, czyli major i minor. Do ręcznego stworzenia węzła służy mknod, ale dziś to raczej ciekawostka niż codzienność.

Na co uważać

  • Nie mylisz urządzenia z partycją. /dev/sda to cały dysk, /dev/sda1 to pierwsza partycja. Pomyłka przy dd potrafi skasować tablicę partycji.
  • Device file to nie punkt montowania. /dev/sda1 montujesz dopiero w jakimś katalogu, np. /mnt. Sam plik urządzenia nic ci nie pokaże w eksploratorze.
  • Litera dysku potrafi się zmienić między restartami. Dlatego w /etc/fstab używasz UUID, a nie sztywnego /dev/sdb.

Pojęcia powiązane, które warto skojarzyć: udev, major i minor number, character device, block device, mknod, /dev oraz uniksowa filozofia „everything is a file”.