编辑

编辑

我有一台服务器,它的一项工作是将 DD 创建的图像克隆到以下三个目标之一:

  1. USB > SATA 2
  2. USB > CF(紧凑型闪存)
  3. USB > CFAST

我编写了 bash 脚本,允许用户选择他们想要克隆的图像类型,并且它会为他们完成所有工作,除了一个例外,它运行良好。

每次系统重启时,这些 USB 存储设备的设备 ID 都会发生变化,曾经的系统磁盘 /dev/sda 在重启后会变成 /dev/sde,例如,我的脚本将其分配给 CF 克隆。

那么,如何强制 USB 设备在连接时或重新启动时使用特定的设备 ID。

例如,

  1. USB > SATA 2) /dev/sdx
  2. USB > CF(紧凑型闪存)/dev/sdy
  3. USB > CFAST /dev/sdz

或者是否存在其他解决方案,让我可以在使用 dd 读取或写入 USB 设备时引用该 USB 设备?

谢谢

编辑

我尝试创建一条规则但似乎不起作用:

# 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

设备/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-partuuidby-partlabel基于分区表(GPT)信息;
  • by-uuidby-label基于文件系统本身嵌入的信息。

您自己创建规则的尝试似乎没问题,但您应该使用SUBSYSTEM=="block"(甚至可能是KERNEL=="sd*")来指定它只需要匹配块设备,而不匹配其任何父设备。如果不这样做,规则将匹配父“scsi LUN”设备及其“scsi 目标”设备(及其父“scsi 主机”设备、其父“usb 接口”设备及其父“usb 设备”设备……),其中任何一个都没有 /dev 下的任何设备节点或与 /dev/sdb 的任何关系。

此外,请注意,udevadm trigger默认情况下会合成“change”事件,这与您的规则不匹配,因为它仅检查“add”。请尝试udevadm trigger --action=add --subsystem-match=block或将规则更改为ACTION=="add|change"

相关内容