У меня есть сервер, и одна из его задач - клонировать изображения, созданные DD, в одну из 3 целей:

  1. USB> SATA 2
  2. USB> CF (компактная вспышка)
  3. USB> CFAST

Я написал сценарии bash, которые позволяют пользователю выбирать тип изображения, которое он хочет клонировать, и он делает все для них, он прекрасно работает с одним исключением.

Идентификаторы устройств этих USB-накопителей меняются каждый раз при перезагрузке системы, и то, что когда-то было системным диском /dev /sda после перезагрузки, может стать /dev /sde, который мой сценарий, например, назначил для клонирования CF.

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

Например,

  1. USB> SATA 2) /dev /sdx
  2. USB> CF (компактная вспышка) /dev /sdy
  3. USB> CFAST /dev /sdz

Или есть альтернативное решение, где я могу обратиться к устройству USB при использовании dd для чтения или записи на него ??

Спасибо

редактировать

Я пытался создать правило, но оно не сработало:

# lsusb | grep Sony
Bus 001 Device 002: ID 054c:01bd Sony Corp. MRW62E Multi-Card Reader/Writer

# udevadm info --name=/dev/sdb --attribute-walk | grep 054c  
    ATTRS{idVendor}=="054c"
# udevadm info --name=/dev/sdb --attribute-walk | grep 01bd
    ATTRS{idProduct}=="01bd"

Создал файл:

nano /etc/udev/rules.d/10-usb.rules

ACTION=="add", ATTRS{idProduct}=="01bd", ATTRS{idVendor}=="054c", SYMLINK+="sonycf"

Затем попытался активировать его:

udevadm trigger

Но /dev /sonycf не появляется на моих устройствах.

Редактировать 2

Спасибо @ grawity

ACTION=="add", SUBSYSTEM=="block", ATTRS{idProduct}=="01bd", ATTRS{idVendor}=="054c", SYMLINK+="sonycf"

udevadm trigger --action=add --subsystem-match=block

Работает угощение :-)

1 ответ1

2

Имена устройств /dev/sd* всегда присваиваются последовательно, и их нельзя изменить.

Вместо этого используйте символические ссылки, которые udev создает для вас в /dev/disk:

$ tree /dev/disk
/dev/disk
├── by-id
│   ├── ata-Samsung_S3Z9NB0KA26420K -> ../../sda
│   ├── ata-Samsung_S3Z9NB0KA26420K-part1 -> ../../sda1
│   ├── wwn-0x50025408c38ebf36 -> ../../sda
│   └── wwn-0x50025408c38ebf36-part1 -> ../../sda1
├── by-label
│   ├── EFI -> ../../sda1
├── by-partlabel
│   ├── EFI -> ../../sda1
│   └── sys -> ../../sda3
├── by-partuuid
│   ├── b5b9724a-d13f-4d97-8bff-955bf012d7ad -> ../../sda1
│   └── cd1df94d-de5b-4e4e-9874-8bac9dc5835e -> ../../sda3
├── by-path
│   ├── pci-0000:00:1f.2-ata-1 -> ../../sda
│   ├── pci-0000:00:1f.2-ata-1-part1 -> ../../sda1
│   └── pci-0000:00:1f.2-ata-1-part2 -> ../../sda2
└── by-uuid
    ├── 7b6fad01-577a-4877-88f3-9762697e4993 -> ../../sda3
    └── BD26-0E7C -> ../../sda1
  • ссылки by-id и by-path основаны на физических устройствах (по их серийному номеру или порту, к которому они подключены);
  • by-partuuid и by-partlabel основаны на информации таблицы разделов (GPT);
  • by-uuid и by-label основаны на информации, встроенной в саму файловую систему.

Ваша собственная попытка создания правила выглядит нормально, но вы должны использовать SUBSYSTEM=="block" (и, возможно, даже KERNEL=="sd*"), чтобы указать, что оно должно соответствовать только блочному устройству, а не его родителям. Без этого правило будет соответствовать родительскому устройству "scsi LUN" и его устройству "scsi target" (и его родительскому устройству "scsi host", и его родительскому устройству «usb-интерфейс», и его родительскому "устройству usb"). устройство ...) ни один из которых не имеет никаких узлов устройства в /dev или какого-либо отношения к /dev /sdb.

Кроме того, обратите внимание, что udevadm trigger по умолчанию синтезирует события "изменения", которые не будут соответствовать вашему правилу, поскольку он проверяет только "добавление". Попробуйте либо udevadm trigger --action=add --subsystem-match=block либо измените правило на ACTION=="add|change" .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .