Czy klucz USB będzie miał tę samą nazwę za każdym razem, gdy go podłączę?


9

Mam klucz USB, który będzie używany do codziennego zapisywania danych za pomocą skryptu bash. Udało mi się zamontować go, aby określony użytkownik mógł pisać w nim foldery za pomocą polecenia:

mount /dev/sdc1 /media/usb -o rw,uid=sysop,gid=sysop

Skrypt może uruchamiać i tworzyć katalogi, jak chce i jest idealny. W pewnym momencie klucz USB zostanie odłączony i zastąpiony nowym (tym samym modelem). Czy nowy klucz USB nadal będzie miał nazwę, /dev/sdc1czy będzie inny?

Jeśli jest inny, jak mogę dołączyć część montażową do mojego skryptu, aby została wykonana automatycznie?


2
Odpowiedź brzmi: nie, ale możesz obejść to z regułami udev . Zobacz tutaj, aby uzyskać lepsze, ale nieco nieaktualne wyjaśnienie.
Satō Katsura,

@AlexTartan Jeśli podłączysz inny dysk USB do dowolnego innego portu USB, zanim będzie mógł uzyskać SDC. Więc twoje ograniczenie „i nic innego nie jest przypisane do sdc1” jest prawdziwe. Ogólnie jest to bardzo niebezpieczne założenie, którego nigdy nie można przyjąć. Nigdy nie warto używać sd [az] jako trwałych nazw urządzeń. Jest to spuścizna po czasach, gdy mieliśmy kontrolery IDE z czterema statycznymi portami, które można ustawić, ustawiając zworki sprzętowe i wybierając odpowiednią wtyczkę kabla.
ikrabbe

1
@ikrabbe, wiem, dlatego opublikowałem odpowiedź na podstawie identyfikacji etykiety (można to trochę łatwiej zarządzać).
Alex Tartan

Odpowiedzi:


6

Chociaż dostęp do niego /dev/sdXyjest ryzykowny, dokładniejsza identyfikacja może być wykonana przez UUID.

Ponieważ wspominasz (w pewnym momencie) o zmianie pamięci USB, aby zachować zgodność, możesz chcieć zidentyfikować pamięć USB za pomocą etykiety. Aby to zrobić, możesz: /dev/disk/by-label/YourLabelHere.

Pamiętaj, że musisz ustawić etykietę na nową pamięć USB przed uruchomieniem skryptu, a także /dev/disk/by-labeljest dostępna tylko wtedy, gdy (przynajmniej) jedna pamięć USB jest podłączona (w przeciwnym razie zostanie usunięta).

Szczegółowe informacje na temat konfiguracji etykiety USB można znaleźć tutaj: /ubuntu/194510/how-to-edit-label-of-usb-drive


1
Jeśli twój system plików nie ma etykiet, /dev/disk/by-id/możesz go użyć (to jest to, czego używam w moich systemach plików).
Toby Speight

3

W ten sposób rozwiązuję ten problem, ale ogólnie, jak powiedział ci Sato Katsura, musisz napisać regułę udev.

  1. Podłącz urządzenie, sprawdź, jakie urządzenie ma (na przykład oglądając dmesg).
  2. Jako połączenie superużytkownika udevadm info --query all /dev/sdc(lub cokolwiek innego).
  3. Skonfiguruj regułę udev, oto przykład mojego portfela. Pola ID_SERIAL_SHORTi ID_FS_UUIDczytam z informacji w kroku 2:

    SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="YT440900877400W000Y0", ENV{ID_FS_UUID}=="3878-D432", ENV{DEVTYPE}=="disk", SYMLINK+="pocketbook", OWNER="ingo"
    SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="YT440900877400W000Y0", ENV{ID_FS_UUID}=="9016-4EF8", ENV{DEVTYPE}=="disk", SYMLINK+="pocketbook-sd", OWNER="ingo"
    

    Tutaj ustawiam WŁAŚCICIELA, że mogę go zamontować na moim głównym koncie użytkownika. Również z moim portfelem nie mam partycji, ale montuję zwykłe dyski. Jeśli masz zmiany partycji:

    ENV{ID_PART_ENTRY_NUMBER}=="1", ENV{DEVTYPE}=="partition",
    

    dla partycji 1 w liniach reguł udev.

Zasady udev znajdują się w /etc/udev/rules.d, jeśli masz rozsądny system.

  1. Teraz możesz

    udevadm control --reload
    

    przeładować zasady i

    udevadm monitor
    

    aby monitorować, co dzieje się podczas kroku 5.

  2. Podłącz i podłącz swoje urządzenie USB (oczywiście po wcześniejszym odmontowaniu, jeśli je zamontowałeś). Monitor powinien poinformować Cię o nowym urządzeniu podczas jego inicjalizacji.

  3. Sprawdź, czy /dev/zawiera odpowiednie dowiązania symboliczne. W moim przykładzie mam to:

    brw-rw---- 1 ingo disk    8,  48 Aug  3 10:32 sdd
    brw-rw---- 1 ingo disk    8,  32 Aug  3 10:32 sdc
    lrwxrwxrwx 1 root root         3 Aug  3 10:32 pocketbook-sd -> sdd
    lrwxrwxrwx 1 root root         3 Aug  3 10:32 pocketbook -> sdc
    

Teraz możesz zdefiniować trwałe reguły za pomocą dowiązań symbolicznych /dev/pocketbooki /dev/pocketbook-sd/ lub jakkolwiek masz na imię w polu SYMLINK pliku reguł udev.


1
Dziękuję za Twoją odpowiedź. Jednak nie będę mógł z niego korzystać. Urządzenie, nad którym pracuję, jest zainstalowane na wulkanie, a pamięć USB służy do przechowywania danych tam uzyskanych. Będziemy tam tylko raz na trzy miesiące, aby zmienić pamięć USB. Mam tylko zdalny dostęp, bez żadnego interfejsu „ekranowego”. Ponieważ USB będzie cały czas inny, ale podłączony do tych samych portów USB, myślę, że łatwiejszym sposobem jest utrzymanie ścieżki sdc1. Zobaczę z regułami udev, co mogę zrobić.
Gudrun

0

Aby dodać do odpowiedzi @ alextartan.

Uruchomiłem własny system tworzenia kopii zapasowych, który wykorzystuje dyski USB jako cele. Muszę się upewnić, co się gdzieś dzieje. Ponieważ identyfikatory UUID nie są szczególnie przyjazne dla użytkownika, polegam na etykietach dysków.

UUID są również nieco problematyczne, ponieważ za każdym razem, gdy formatujesz partycję, otrzymuje ona nowy unikalny UUID, więc wszelkie skrypty używające tego UUID muszą zostać zmodyfikowane. Mogę przypisać tę samą etykietę co poprzednio do sformatowanej partycji (lub nawet do partycji na nowym / zastępczym dysku) i pozostawić moje skrypty w spokoju.

Wymyśliłem własną unikalną (przyjazną dla ludzi) konwencję etykietowania i używam gparted do oznaczania różnych partycji podczas ich tworzenia.

Kiedy moje skrypty muszą uzyskać dostęp do określonej partycji, szukam nazwy urządzenia za pomocą etykiety.

function get_dev {
  ## Return the device name of a partition
  ## In DEV
  ## Given its label
  ## Partition does not need to be mounted
  ## Usage get_dev <partition_label>
  ## Copyleft 04/28/2014 JPmicrosystems
  local LINE
  local VERBOSE=1  ## Verbose version
  local USAGE="ERROR Usage is: get_dev <partition_label>"
  unset DEV

  if [ -z "${1}" ]
  then
    (( VERBOSE )) && echo $USAGE
    return 1
  fi

  LINE=$(ls -l /dev/disk/by-label | grep " ${1} ")
  if (( $? ))
  then
    (( VERBOSE )) && echo "ERROR Partition [${1}] not found"
    return 1
  fi

  DEV="/dev/${LINE##*/}"
  return 0
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.