У меня куча 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.