Każdy węzeł urządzenia /dev
ma swoją własną parę liczb głównych / podrzędnych. Wiem, że możemy pobrać tę parę liczb z węzła urządzenia za pomocą stat
:
stat -c 'major: %t minor: %T' <file>
Lub ls -l
też pokazuje te liczby.
Ale w jaki sposób możemy uzyskać węzły urządzeń według danych liczb głównych i pomocniczych? Jedyny sposób, w jaki jestem świadomy, to jakaś sztuczka ls -l
+ awk
, ale naprawdę mam nadzieję, że istnieje lepsze rozwiązanie.
Odpowiedzi:
Znalazłem prostsze podejście przy użyciu pseudofilesystemu sys , w / sys / dev masz urządzenia uporządkowane według typu, a następnie według major / minor, plik uevent zawiera nazwę urządzenia i kilka innych informacji.
Na przykład
Echa,
Uwaga: Zostało to przetestowane w Debian Wheezy
źródło
for file in $(ls /sys/dev/block/ ); do source /sys/dev/block/${file}/uevent; if [ "$DEVNAME" == "sda1" ] ; then echo ${file}; fi done;
Nie wiem co masz na myśli.
Utworzy plik urządzenia nazywany
foo
jako urządzenie blokowe z wersją główną 8 i podrzędną 0. Jeśli chcesz znaleźć jeden lub jeden z plików/dev
tego samego typu, główny i podrzędny, możesz (za pomocązsh
):W przypadku urządzenia blokowego
8:0
:dla urządzenia char
226:0
:Zauważ, że wszystko może tworzyć pliki
/dev
. W dawnych czasach był to skrypt tworzący tam pliki statyczne. W pewnym momencie miałeś nawet specjalny system plików à la/proc
.W nowoczesnych wersjach Linuksa zwykle
udev
opiera się na danych wejściowych z jądra.Nazwa, którą wybiera dla podstawowego pliku urządzenia, jest oparta na
DEVNAME
dostarczonej przez jądro.udev
reguły mogą to zmienić, ale generalnie nie, a niektóreudev
reguły dodają więcej dowiązań symbolicznych dla wygody (jak/dev/disk/by...
te).Możesz przejść z wersji major: minor na jądro
DEVNAME
, patrząc na:Możesz również uzyskać te informacje z
udev
bazy danych, jak pokazał mikeserv.źródło
Najwyraźniej można to zrobić prościej
udevadm
, a ja właśnie dowiedziałem się, jak to zrobić.Aby uzyskać
DEVNAME
odudevadm
, musisz tylko:Na przykład, jeśli chcesz poznać
/dev
nazwę/sys/dev/char/5:1
, którą możesz zrobić:WYNIK
-r
Opcją jest, aby określić--root
ścieżkę Ed - bez niego wynik powyżej będzie tylko do odczytuconsole
.-q
Opcja określa bazę danych--query
i przyjmuje argumentname
tutaj - bo chcemyDEVNAME
.Bardzo prosty sposób znalezienia ścieżki do urządzenia char i / lub block, biorąc pod uwagę tylko główne: liczby mniejsze:
Tak działa:
drukuje ...
Oto pierwszy, który napisałem.
To po prostu skanuje
udevadm info --export-db
dane wyjściowe w celu znalezienia pasujących liczb. Dane wyjściowe wyglądają następująco:Przepływ pracy wygląda następująco:
spróbuj usunąć
[^=]*DEVNAME=
sznurek z nagłówka każdej liniijeśli linia nie ma pierwszego znaku lub jego pierwszym znakiem jest
/
skopiowanie tej linii nadh
starą spacjąJeśli linia pasuje
MAJOR=
DołączN
linię wejściową ext do przestrzeni wzorcajeśli w obszarze wzorca znajdują się 2 wiersze,
=$1\n.*=$2$
skopiujh
starą przestrzeń nad obszarem wzorca i wydrukuj automatycznie; w przeciwnym razie usuń przestrzeń wzorcaWięc jeśli to zrobię:
WYNIK
Ale, jak wskazuje @xae, urządzenia typu blok / char mogą współdzielić kombinacje maj: min, więc może to wydrukować więcej niż jedną ścieżkę na połączenie.
źródło
Niestety ,
/sys/dev
hierarchia została dodana do jądra dopiero w wersji 2.6.27 ( por . Odpowiednie zatwierdzenie przeciw bazie kodowej jądra), więc potrzebujemy podejścia „rozwidlonego”.Niech
$M
i$m
odpowiednio będą główną i podrzędną liczbą naszego pliku urządzenia.Zakładać 2.6.27 jądra
Jak sugerują inni, najprostsze podejście uwalnia moc
sysfs
„wirtualnego” systemu plików, goniąc prosto za plikami nazwanymi$M:$m
w folderze/sys/dev
(więcej niż jeden plik należy się spodziewać, jeśli nie wiemy, czy nasze urządzenie jest znakiem lub oparty na blokach), a następnie sourcinguevent
pliku (w podpowłoce, aby zapobiec zanieczyszczeniu przestrzeni nazw):Jądra wersji wcześniejszej niż 2.6.27
Załóżmy, dla uproszczenia, że nasz plik jest urządzeniem blokowym (podobne podejście dotyczy urządzeń znakowych). Będziemy wyszukiwać ciąg w
$M:$m
całej/sys/block
hierarchii, badając (pod tym folderem) zawartość każdego pliku, którego nazwa jest przypadkowadev
. Jeśli/sys/block/<...>/<DEV>/dev
jest to jeden z takich plików,DEV
to na pewno będzie to nazwa naszego urządzenia:źródło
W systemie Linux można korzystać z niektórych plików w
/proc
wirtualnym systemie plików.Prosta forma wzorca już dostarcza informacji o pożądanym urządzeniu na wyjściu, jednak możliwe jest również dodatkowe filtrowanie w celu wyodrębnienia tylko jednego określonego ciągu.
źródło
Istnieje funkcja biblioteki:
makedev()
Biorąc pod uwagę główne i mniejsze identyfikatory urządzeń, makedev () łączy je w celu utworzenia identyfikatora urządzenia, zwracanego jako wynik funkcji.
Więcej informacji na stronie: http://man7.org/linux/man-pages/man3/major.3.html
źródło