Czy major, minor
numer jest unikalny?
Czy mamy jakieś cytaty i odniesienia do tego?
NAME MAJ:MIN RM SIZE RO MOUNTPOINT
sda 8:0 0 465.8G 0
├─sda1 8:1 0 298.2M 0
├─sda2 8:2 0 3G 0
├─sda3 8:3 0 458.7G 0 /
├─sda4 8:4 0 1K 0
└─sda5 8:5 0 3.8G 0
sr0 11:0 1 1024M 0
Odpowiedzi:
Z interfejsu programowania systemu Linux , § 14.1
Zobacz także ten stary (2001 ) rozdział Linux Device Drivers (2e) .
tzn. celem jest zapewnienie unikalnego mapowania major: minor na device: instance dla każdego typu urządzenia. Ściśle, to może mieć dwa różne urządzeń z tym samym główny: poboczny, tak długo, jak jeden jest char a jeden blok:
W systemie Linux w dowolnym momencie w jednym systemie główne: mniejsze liczby dla każdego typu urządzenia są unikalne. Liczby te mogą się jednak zmieniać z czasem i nie muszą być takie same w różnych systemach Linux (nawet ta sama dystrybucja, jądro i sprzęt). Zauważ, że urządzenia znakowe i blokowe mają odrębne spacje numeracyjne, np. Blok główny 1 jest przypisany do dysków RAM, char główny 1 jest przypisany do zestawu urządzeń jądra, w tym zerowego i zerowego.
Historycznie główne urządzenia były (przeważnie) statycznie przydzielane przez rejestr (również nadal obecny, choć nieobsługiwany, w źródle jądra
Documentation/devices.txt
). Obecnie wiele urządzeń jest przydzielanych dynamicznie, zarządza nimi udev , a mapowania są widoczne w/proc/devices
. Naprawione urządzenia nadal istnieją wincude/uapi/linux/major.h
(ostatnio przeniesioneinclude/major.h
)Teraz, chociaż kombinacja główna: niewielka jednoznacznie identyfikuje określone wystąpienia urządzenia, nic nie stoi na przeszkodzie, aby utworzyć wiele węzłów urządzeń (plików), które odnoszą się do tego samego urządzenia. Nie trzeba ich nawet tworzyć
/dev
(ale muszą znajdować się w systemie plików, który obsługuje tworzenie węzłów urządzeń i nie jest montowany znodev
opcją).Powszechnym zastosowaniem jest tworzenie duplikatów zerowych, zerowych i losowych urządzeń w chroot:
Nazwy są tylko aliasami, jądro nie dba o większość nazw lub lokalizacji, dba o numer główny, aby mógł wybrać odpowiedni sterownik, a sterownik (zwykle) dba o mniejszy numer, aby mógł wybrać poprawna instancja.
Większość nazw to po prostu konwencje (choć niektóre są zdefiniowane przez POSIX ). Zauważ też, że jedno urządzenie może zarejestrować wiele głównych numerów, sprawdź
sd
sterownik/proc/devices
; nazwa modułu sterownika (.ko
) nie musi być taka sama jak nazwa urządzenia i nie musi być taka sama jak nazwa węzła urządzenia w/dev
, a pojedynczy moduł sterownika może zarządzać wieloma logicznymi / fizycznymi urządzeniami lub nazwami urządzeń.Reasumując: możesz mieć dwa lub więcej węzłów urządzeń (w
/dev/
lub w innym miejscu), które mają te same główne: mniejsze liczby, ale jeśli są tego samego typu, odnoszą się do tego samego urządzenia. Możesz mieć jeden sterownik, który może obsługiwać wiele głównych instancji, ale w jądrze i w sterowniku, dla każdego typu (char lub block) numer major: minor odnosi się do konkretnego urządzenia (major) i określonej instancji ( drobne) urządzenia.Nie można mieć dwóch węzłów urządzeń tego samego typu i głównych: mniejszych i oczekiwać, że uzyskają dostęp do dwóch różnych urządzeń logicznych lub fizycznych. Podczas uzyskiwania dostępu do urządzenia jądro wybiera jeden sterownik na podstawie typu i numeru głównego (a nie na podstawie nazwy węzła urządzenia), a zgodnie z konwencją liczba podrzędna deterministycznie wybiera określoną instancję lub podfunkcję.
Aktualizacja Trochę interesującej historii i niektóre * perspektywy BSD można znaleźć w prezentacji BSDCon Poul-Henning Kamp 2002 : https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/
Jeśli cofniesz się w czasie do 1978 r. (Dzięki uprzejmości Alcatela-Lucenta, Bell System Technical Journal, lipiec-sierpień 1978 r.), „ Unix Time Sharing System ” jasno to określa (str. 1937):
źródło
MAJ:Min
numerzeGdy plik urządzenia jest tworzony przez
mknode
, dostarczane są numerymajor
iminor
. W ten sposób Linux identyfikuje podstawowe urządzenie sprzętowe powiązane z plikiem urządzenia. W większości przypadkówmajor
numer identyfikuje kierowcę, aminor
rozróżnia różne urządzenia sterowane przez kierowcę.W związku z tym liczby muszą być unikalne dla każdego urządzenia, w przeciwnym razie nie będzie możliwe utworzenie poprawnych plików urządzeń dla wszystkich.
źródło
Nie, w systemie Linux nie zawsze są wyjątkowe.
Linux używa
devpts
wirtualnego systemu plików do zapewnienia pseudoterminalów (ptys), a ten wirtualny system plików można zamontować więcej niż jeden raz w różnych miejscach, co jest praktyczne przy konfigurowaniu chrootów lub kontenerów przestrzeni nazw. Podczas gdymajor:minor
krotka jest unikalna nadevpts
przykład systemu plików, nie jest unikalna na działającym systemie:W powyższym przykładzie
script(1)
polecenie tworzy pseudo-terminal i uruchamia w nim powłokę. To cholernie oczywiste, że pseudo-terminal utworzony przez pierwszyscript
proces nie jest taki sam jak ten utworzony przez drugi proces, ale mają tę samą nazwę i główne, mniejsze liczby.Aby jednoznacznie zidentyfikować pseudoterminal, musisz użyć ich
device:inode
krotki lub połączyć numer urządzenia (systemu plików devpts) z ichmajor:minor
. Problem polega na tym, że pole „tty”/proc/PID/stat
(siódma, patrz stronaproc(5)
podręcznika; to tam narzędzia takie jaklsof
lubps
pobierają informacje) zawiera tylkost_rdev
tty (spakowanemajor:minor
); jeśli jest to pty slave,devpts
system plików, który go zapewnia , nie ma żadnych wskazówek . Te same problemy wpływają na numer urządzenia, który można uzyskać za pomocąTIOCGDEV
ioctl.AFAICS nie ma niezawodnego sposobu na zidentyfikowanie terminala sterującego procesem w systemie Linux. Korekty i sugestie są mile widziane!
źródło