Чи матиме USB-ключ однакове ім'я кожного разу, коли я його монтую?


9

У мене є USB-ключ, який буде використовуватися для збереження даних на ньому щодня за допомогою скрипту bash. Мені вдалося встановити його для конкретного користувача, щоб він міг писати в нього папки за допомогою команди:

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

Сценарій може працювати і створювати каталоги так, як він хоче, і це ідеально. У якийсь момент USB-ключ буде від'єднано від мережі та замінено новою (та ж модель). Чи буде новий ключ USB все-таки мати ім'я /dev/sdc1чи буде іншим?

Якщо це інший, як я можу включити монтажну частину до свого сценарію, щоб вона була зроблена автоматично?


2
Відповідь - ні, але ви можете обійти це за допомогою правил udev . Дивіться тут для кращого, але трохи застарілого пояснення.
Satō Katsura

@AlexTartan Якщо ви підключите будь-який інший диск USB в будь-який інший порт USB, перш ніж він може отримати SDC. Тож ваше обмеження "і більше нічого не є assigend to sdc1" є правдою. Взагалі це дуже небезпечне припущення, яке ніколи не можна зробити. Ніколи не рекомендується використовувати sd [az] як стійкі назви пристроїв. Це спадщина з тих часів, коли у нас були контролери IDE з чотирма статичними портами, які можна було встановити, встановивши апаратні перемички та вибравши правильний штекер кабелю.
ikrabbe

1
@ikrabbe, я знаю, тому я опублікував відповідь на основі ідентифікації етикетки (цим можна керувати трохи простіше).
Алекс Тартан

Відповіді:


6

Хоча отримати доступ до нього /dev/sdXyризиковано, може бути здійснена більш точна ідентифікація UUID.

Оскільки ви згадуєте (в якийсь момент) про зміну USB-накопичувача, щоб зберегти сумісність, можливо, ви захочете ідентифікувати ваш usb-накопичувач за міткою. Щоб зробити це, ви можете: /dev/disk/by-label/YourLabelHere.

Зауважте, що вам потрібно встановити мітку на нову паличку usb перед запуском сценарію, а також /dev/disk/by-labelвона доступна лише у тому випадку, якщо (принаймні) одна USB-паличка підключена (інакше вона буде видалена).

Докладніше про те, як налаштувати ярлик usb, можна знайти тут: /ubuntu/194510/how-to-edit-label-of-usb-drive


1
Якщо ваші файлові системи не мають міток, то /dev/disk/by-id/натомість вони можуть бути корисними (це те, що я використовую для моєї файлової системи).
Toby Speight

3

Ось як я вирішую цю проблему, але загалом, як сказав вам Сато Кацура, вам потрібно написати правило udev.

  1. Підключіть свій пристрій, перевірте, який у нього пристрій (наприклад, переглянувши dmesg).
  2. Як дзвінок суперпользователя udevadm info --query all /dev/sdc(або що завгодно).
  3. Налаштуйте правило udev, ось приклад моєї кишенькової книги. Поля ID_SERIAL_SHORTта ID_FS_UUIDя читаю з інформації на кроці 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"
    

    Тут я встановив ВЛАСНИКА, що можу встановити його за допомогою свого основного облікового запису користувача. Крім того, у моїй кишеньковій книжці я не маю перегородок, але монтую звичайні диски. Якщо у вас є зміни розділів:

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

    для розділу № 1, у рядках правил udev.

Правила udev знайдені /etc/udev/rules.d, якщо у вас є нормальна система.

  1. Тепер ти можеш

    udevadm control --reload
    

    перезавантажити правила і

    udevadm monitor
    

    контролювати, що відбувається під час кроку 5.

  2. Підключіть та підключіть свій USB-пристрій (звичайно після його відключення, якщо ви його встановили). Монітор повинен повідомити вас про новий пристрій при його ініціалізації.

  3. Перевірте, чи /dev/містить правильні символьні посилання. У своєму прикладі я зрозумів це:

    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
    

Тепер ви можете визначити стійкі правила за допомогою символьних посилань /dev/pocketbookі /dev/pocketbook-sd, або будь-яких ваших імен, у полі SYMLINK файлу правил udev.


1
Спасибі за вашу відповідь. Однак я не зможу ним користуватися. Пристрій, над яким я працюю, встановлений на вулкані, і USB-палиця використовується для зберігання отриманих там даних. Ми будемо їздити туди лише раз на три версії, щоб змінити USB-палицю. У мене є лише віддалений доступ до нього, без будь-якого "екранного" інтерфейсу. Оскільки usb буде постійно відрізнятися, але підключений до одних і тих же портів usb, я думаю, що простішим способом є збереження шляху до sdc1. Я з правилами udev побачу, що я можу зробити.
Гудрун

0

Просто для додання відповіді @ alextartan.

Я прокатав власну систему резервного копіювання, яка використовує USB-накопичувачі для цілей. Мені потрібно бути впевненим, що відбувається куди. Оскільки UUID не особливо зручні для користувачів, я покладаюся на етикетки дисків.

UUID також трохи проблематичні, тому що кожного разу, коли ви переформатуєте розділ, він отримує новий унікальний UUID, тому будь-які сценарії, що використовують цей UUID, повинні бути змінені. Я можу призначити ту ж мітку, що і раніше, для переформатованого розділу (або навіть для розділу на новому / замінному диску) і залишити свої сценарії в спокої.

Я придумав свою власну унікальну конвенцію щодо маркування і використовую gparted для позначення різних розділів, коли я створюю їх.

Коли мої сценарії потребують доступу до певного розділу, я шукаю ім’я пристрою за допомогою мітки.

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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.