Назад | Перейти на главную страницу

Как указать статические точки монтирования для съемных USB-накопителей?

У меня куча usb портов и хабов. Когда вы подключаете флэш-накопители USB, Linux назначает их виртуальным блочным устройствам в порядке очереди. Он создает sdd, sde, sdf и так далее, независимо от того, в какой порт я подключаю диски. Мы копируем файлы на эти диски, и когда возникает ошибка, я не могу сказать, на каком диске произошла ошибка.

Я бы хотел настроить udev так, чтобы он отображал физические аппаратные устройства / порты на определенные виртуальные устройства. То есть порт 1 => sdd, порт 2 => sde, порт 3 => sdf и т. Д. Это позволило бы мне определить, на каком флэш-накопителе произошла ошибка.

Я нашел несколько ресурсов (например, http://reactivated.net/writing_udev_rules.html), из чего я могу сказать, что это возможно. Однако у меня нет опыта работы с такими низкоуровневыми конфигурациями. Они меня сбивают с толку.

Есть ли еще одна ссылка, которая может прояснить ситуацию? Или, возможно, какое-то программное обеспечение, которое сделает это за меня? Или библиотека, которая упрощает работу?

/dev/disk/by-path будут содержать согласованные имена, которые будут соответствовать определенным портам USB (по крайней мере, они есть на моем компьютере).

Также проверьте /dev/disk/by-id и /dev/disk/by-uuid для способов доступа к определенным устройствам независимо от того, какой путь используется для доступа к ним.

Я использую этот хак с двумя скриптами Python для той же цели:

ophis@tlatoani:~$ more /usr/bin/drive.py
# !/usr/bin/env python

import os, sys

if len(sys.argv) == 2:

  label = sys.argv[1]

  os.system("drivelabels.py >/tmp/drv.txt")

  drvmap = map(lambda x:map(lambda y:y.strip(), x.split("\t")), file("/tmp/drv.txt").readlines())

  for d in drvmap:

    if d[0] == label:

      print d[1]

      sys.exit()

print "/srv"

ophis@tlatoani:~$ more /usr/bin/drivelabels.py

#!/usr/bin/env python

import os

os.system("ls -lh /dev/disk/by-label >/tmp/bylabels.txt ; df -ha >/tmp/drivemap.txt")

bylabel_text=map(lambda x:x.split(" "), file("/tmp/bylabels.txt").readlines())

l, ll = {}, {}

for byl_t in bylabel_text:

  label, dev = byl_t[len(byl_t)-3], byl_t[len(byl_t)-1]

  dev = dev[-dev.rfind("/"):].strip()

  if dev != "": l[ label ] = dev

drivemap_txt=map(lambda x:x.split(" "), file("/tmp/drivemap.txt").readlines())

for k in l.keys():

  for d in drivemap_txt:

    if d[0].strip() == "/dev/%s" % l[k]: ll[ k ] = d[-1].strip()

for assign in ll.keys(): print "%s\t%s" % (assign, ll[assign])

Таким образом, это позволяет мне получать доступ к дискам через метку:

target=`drive.py STICKY`
cp -v *.tex $target

Надеюсь, что кому-нибудь это поможет!

Наиболее типичным вариантом использования будет совпадение по uuid файловой системы, но если вы пишете устройства, идентичные целому диску, этого не будет. Вместо этого вы можете сопоставить по модели и серийному номеру. Пример (непроверенный) udev Правило для этого:

KERNEL=="sd*", ATTR{removable}=="1", ATTR{vendor}=="Yoyodine", ENV{ID_SERIAL}=="123-456-789", NAME=="disk/by-serial/scsi-$attr{vendor}-$env{ID_SERIAL}"

Чтобы увидеть, что ATTR значения существуют для данного устройства, теперь известного как /dev/sdz, бегать udevinfo -n /dev/sdz -a. Чтобы увидеть, что ENV ценности существуют, запустить udevinfo -n /dev/sdz --query=env.

Если вы хотите сопоставить данные по порту, а не по серийному номеру, найдите родительские устройства в цитируемом вами документе. Я подозреваю что-то вроде KERNELS=="usb42" будет работать, но я не пробовал.

Эти диски монтируются автоматически? Какой инструмент вы используете для автоматического монтажа? Вы воссоздаете файловую систему каждый раз, когда они монтируются, или разделы / файловая система довольно стабильны?

Если вы однозначно маркируете файловые системы, обычно вы можете смонтировать файловую систему по метке вместо имени устройства.

Когда вы создаете файловую систему, ей присваивается UUID. Вы можете поместить на USB-устройство какую-нибудь этикетку, соответствующую UUID.