Будет ли 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. Таким образом, ваше ограничение "и ничто другое не назначено для sdc1" верно. В целом это очень опасное предположение, которое никогда не может быть сделано. Никогда не рекомендуется использовать sd [az] в качестве постоянных имен устройств. Это наследие со времен, когда у нас были контроллеры IDE с четырьмя статическими портами, которые можно было установить, установив аппаратные перемычки и выбрав правильный штекер кабеля.
Икраббе

1
@ikrabbe, я знаю, поэтому я разместил ответ, основанный на идентификации ярлыка (им можно управлять немного легче).
Алекс Тартан

Ответы:


6

Хотя доступ к нему /dev/sdXyопасен, более точная идентификация может быть сделана UUID.

Поскольку вы упоминаете (в какой-то момент) об изменении USB-флешки, для обеспечения совместимости вы можете идентифицировать ваш USB-флешку по метке. Чтобы сделать это, вы можете: /dev/disk/by-label/YourLabelHere.

Обратите внимание, что вам нужно установить метку для новой флешки перед запуском скрипта, а также /dev/disk/by-labelона доступна, только если (как минимум) подключена одна флешка (в противном случае она будет удалена).

Подробную информацию о том, как настроить ярлык USB, можно найти здесь: /ubuntu/194510/how-to-edit-label-of-usb-drive.


1
Если ваши файловые системы не имеют меток, то /dev/disk/by-id/вместо этого может быть полезно (это то, что я использую для моих файловых систем).
Тоби Спейт

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, я думаю, что более простой способ - сохранить путь 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.