Jeśli podłączę urządzenie fizyczne, skąd mogę wiedzieć, który plik urządzenia należy do niego?

13

Powiedzmy, że podłączam kilka napędów USB, które nie są automatycznie montowane. Jak mogę dowiedzieć się, który plik urządzenia należy do którego urządzenia fizycznego, aby na przykład go zamontować?

Używam Mac OS X, ale wolę odpowiedź, która działa na wszystkich (a przynajmniej najbardziej popularnych) systemach uniksowych. W przeszłości miałem ten problem z Linuksem.

po prawej stronie
źródło
W systemie Linux odpowiedź zwykle obejmuje udev. Spróbuj więc rozejrzeć się za odpowiednikami udev w OSX ; prowadzi to w szczególności do funkcji Alternative to udev w OSX i OSX USB Device Interface Guide .
Gilles „SO- przestań być zły”
W MacOSX najprościej jest zidentyfikować woluminy według ich etykiet. Ale Gilles ma rację co do idealnego rozwiązania.
peterh - Przywróć Monikę

Odpowiedzi:

14

Za pomocą udev:

Przydatne zapytania można uzyskać udev(w systemach, które ich używają - na pewno prawie wszystkie Linuxy typu stacjonarnego). Na przykład, jeśli chcesz wiedzieć, z którym podłączonym dyskiem jest powiązany /dev/sdb, możesz użyć:

udevadm info --query=property --name=sdb

Wyświetli listę właściwości tego urządzenia, w tym szeregowy (ID_SERIAL_SHORT). Mając te informacje, możesz spojrzeć na dane wyjściowe lsusb -vi znaleźć takie rzeczy, jak producent i nazwa produktu.

Byłaby to krótsza ścieżka do tego

udevadm info --query=property --name=sdb | grep "\(MODEL_ID\|VENDOR_ID\)"

i zobacz linię z dopasowaniem $ID_VENDOR_ID:$ID_MODEL_IDw znacznie krótszym wyjściu z lsusb.

Inną przydatną opcją jest udevadm monitor. Użyj go, jeśli chcesz wiedzieć, który węzeł urządzenia jest tworzony w momencie podłączania urządzenia . Więc pierwszy bieg

 udevadm monitor --udev --subsystem-match=block

A następnie podłącz urządzenie. Zobaczysz nazwy urządzeń wykrytych urządzeń blokowych (dysków / partycji) wydrukowanych na końcu każdej linii wyjściowej.

Praktyczna przykładowa funkcja powłoki:

Oto funkcja, którą możesz umieścić w swoim .bashrc(lub .zshrc):

listusbdisks () 
{
    [["x $ 1" == "xv"]] && shift && local VERBOSE = -v
    za dsk w $ {@ - / dev / sd?}
    robić
        / sbin / udevadm info --query = ścieżka - nazwa = "$ dsk" | grep --colour = auto -q usb || kontyntynuj
        echo "===== urządzenie $ dsk to:"
        (eval $ (/ sbin / udevadm info --query = property --name = "$ dsk" | grep "\ (MODEL \ | VENDOR \) _ ID))
          ["$ ID_VENDOR_ID: $ ID_MODEL_ID" == ":"] && echo „Nieznany” || \
            lsusb $ VERBOSE -d "$ ID_VENDOR_ID: $ ID_MODEL_ID"
        )
        grep -q "$ dsk" / proc / mounts && echo "----- URZĄDZENIE JEST ZAMONTOWANE ----"
        Echo
    gotowy
}

Użyj tego w ten sposób:

  • listusbdisks- rozpoznać wszystkie /dev/sdxurządzenia;
  • listusbdisks sdblub listusbdisks /dev/sdblub listusbdisks sdb sdc- aby uzyskać informacje tylko o niektórych urządzeniach;
  • listusbdisks -v [optional devices as above] - aby wyświetlić pełne wyniki lsusb

[Edytuj]: Dodano pewne funkcje, takie jak odpytywanie wielu urządzeń, sprawdzanie montowań i kontrolowanie szczegółowości lsusb.

rozcietrzewiacz
źródło
To prawda, o ile to możliwe, ale nie wszystkie systemy używają udev.
Caleb
@Caleb True ... Właściwie lsusbto także program opcjonalny. Ale oba są niezwykle powszechne.
rozcietrzewiacz
@rozcietrzewiacz Pytanie dotyczy przede wszystkim OSX, ale udev jest z natury specyficzny dla Linuksa.
Gilles „SO- przestań być zły”
@ Gil Cóż, prawda. Nie mam doświadczenia z OSX, więc właśnie zaktualizowałem swoją odpowiedź, aby nie była myląca.
rozcietrzewiacz
Generalnie w takim przypadku podłączam urządzenie i natychmiast uruchamiam dmesg. Ale to nie będzie pomocne, jeśli urządzenie jest już podłączone i jeśli po pierwszym podłączono więcej urządzeń. :)
Abhishek A
3

Nie ma uniwersalnej odpowiedzi. W Linuksie najprostszym sposobem jest prawdopodobnie uruchomienie narzędzia dyskowego gnome i wyświetli wszystkie wykryte dyski, niezależnie od tego, czy są zamontowane, czy nie. Z wiersza poleceń możesz sprawdzić dane wyjściowe blkidlub udevadm info --export-db.

psusi
źródło
3

W Mac OS X możesz spróbować użyć diskutil list.

x1a0
źródło
1

W odniesieniu do wszystkich Uniksów nie sądzę, aby było to wykonalne.

Obecnie zwykłe zewnętrzne autobusy nie używają ustalonego schematu numeracji dla swoich portów, podobnie jak IDE. Zatem jedynymi pozostałymi źródłami danych potrzebnymi do mapowania są nazwy producentów dysków, ich numery seryjne lub identyfikatory UID partycji.

Nazwy producentów niekoniecznie są unikalne na danym komputerze (załóżmy, że podłączasz dwa dyski zewnętrzne z tej samej serii - będą identyfikować się identycznie). Numery seryjne nie są „widoczne z zewnątrz”, podobnie jak identyfikatory UID partycji.

Tak więc, jedynym jedynym uniwersalnym rozwiązaniem, jakie mogę wymyślić, jest oznaczenie dysków fizycznych numerem seryjnym i użycie polecenia udevadm podanego w odpowiedzi rozcietrzewiacz, jeśli UDEV jest dostępny.

jstarek
źródło