在 Ubuntu 上,USB 设备->块设备映射?

在 Ubuntu 上,USB 设备->块设备映射?

如果这是重复的,请见谅。

我有 2 个 USB 大容量存储设备,我需要能够确定哪个物理设备映射到块设备。

它们并不总是存在,所以我不能只依赖固定的块设备路径。

我试图从中确定设备路径lsusb,但这只提供了设备信息。

总线 001 设备 016:ID 0781:​​5406 SanDisk Corp. Cruzer Micro 1/2/4GB 闪存盘
总线 001 设备 015:ID 4971:ce23 SimpleTech

sudo fdisk -l无法读取任何分区,因为它是 truecrypt 加密卷。

有什么方法可以检测哪个物理设备映射到块设备?

除非我知道哪个是哪个,否则我无法挂载文件系统。

我是否以错误的方式处理了这个问题?

有什么建议 ?

答案1

两台设备的尺寸是否相同?它们是否也是同一品牌?

如果它们的大小不同,fdisk -l应该在标题中显示整个磁盘的大小以及块设备名称,这应该对您有所帮助。

您还可以检查 的输出dmesg。当 USB 设备连接时,dmesg将显示其联机的过程,以及它分配的块设备。以下是示例输出:

Aug 14 16:35:02 xen kernel: [2526561.710931] usb 5-5: new high speed USB device using ehci_hcd and address 4
Aug 14 16:35:02 xen kernel: [2526561.859909] usb 5-5: configuration #1 chosen from 1 choice
Aug 14 16:35:02 xen kernel: [2526562.138808] usbcore: registered new interface driver libusual
Aug 14 16:35:02 xen kernel: [2526562.162072] Initializing USB Mass Storage driver...
Aug 14 16:35:02 xen kernel: [2526562.163248] scsi4 : SCSI emulation for USB Mass Storage devices
Aug 14 16:35:02 xen kernel: [2526562.163452] usbcore: registered new interface driver usb-storage
Aug 14 16:35:02 xen kernel: [2526562.163455] USB Mass Storage support registered.
Aug 14 16:35:07 xen kernel: [2526567.161157] scsi 4:0:0:0: Direct-Access     WDC WD50 00AAKS-00A7B0         PQ: 0 ANSI: 2 CCS
Aug 14 16:35:07 xen kernel: [2526567.171712] sd 4:0:0:0: [sdb] 976773168 512-byte hardware sectors (500108 MB)
Aug 14 16:35:07 xen kernel: [2526567.172736] sd 4:0:0:0: [sdb] Write Protect is off
Aug 14 16:35:07 xen kernel: [2526567.173733] sd 4:0:0:0: [sdb] 976773168 512-byte hardware sectors (500108 MB)
Aug 14 16:35:07 xen kernel: [2526567.174606] sd 4:0:0:0: [sdb] Write Protect is off
Aug 14 16:35:13 xen kernel: [2526567.174616]  sdb: sdb1
Aug 14 16:35:13 xen kernel: [2526572.854493] sd 4:0:0:0: [sdb] Attached SCSI disk
Aug 14 16:35:13 xen kernel: [2526572.854544] sd 4:0:0:0: Attached scsi generic sg2 type 0

如您所见,内核将 /dev/sdb 分配给了 USB 设备。希望这能有所帮助!

答案2

您可以查询 sysfs 来报告驱动器的供应商和型号:

$ cat /sys/block/sdd/device/{vendor,model}
DSE     
MicroDrive 1GB  

$ cat /sys/block/sdc/device/{vendor,model}
JetFlash
Transcend 4GB   

如果你想更进一步,你可以添加 udev 规则(假设你的 Linux 发行版有 udev)来将不同的驱动器映射到不同的设备名称,或者根据驱动器模型提供不同的符号链接

例如,这里有一些例子。

我可以做这样的事情来创建一个 /dev/transcend 符号链接,并在适当的位置附加分区号,当我插入 Transcend 棒时,无论实际创建了什么实际设备:

KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}==\ 
 "Transcend 4GB", SYMLINK+="transcend%n"

当然,如果我放入多个相同型号的设备,就会发生冲突,但只要稍微花点功夫就可以解决这个问题

答案3

我想知道当多个设备具有相同的供应商:产品 ID 时该怎么办。

我尝试运行udevadm info -a /dev/sde,它“遍历父设备链”(不管它是什么意思?)。通过将“ATTRS{devnum}”和“ATTRS{busnum}”与 的总线 X 设备 Y 输出相匹配lsusb,我可以看到 udevadm 列表不仅生成了 USB 硬盘作为块设备 的“父”的总线和设备编号/dev/sde,还生成了它所连接的集线器的总线和设备编号以及主机控制器!如果您想通过设备所连接的端口来识别设备,这可能会很有用。

我有点困惑为什么获取与给定块设备相对应的 USB 设备似乎如此困难,我想这可以稍微澄清一下:设备并不相同,两者之间存在一种父子关系。

Udevadm 给出了每个父级的路径,因此您可以了解如何通过修剪子路径来找到正确的父级:

$ udevadm info --path=$(udevadm info -q path /dev/sde | cut -d / -f 1-7)
P: /devices/pci0000:00/0000:00:1d.7/usb2/2-2/2-2.4
N: bus/usb/002/024
E: BUSNUM=002
E: DEVNAME=/dev/bus/usb/002/024
E: DEVNUM=024
E: DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb2/2-2/2-2.4
E: DEVTYPE=usb_device
E: DRIVER=usb
E: ID_BUS=usb
E: ID_MODEL=External_HDD
....

我们可以将 DEVNAME 传递给 lsusb:

$ lsusb -D $(udevadm info --path=$(udevadm info -q path /dev/sde
    | cut -d / -f 1-7) | grep DEVNAME | cut -d = -f 2)
Device: ID 1058:0705 Western Digital Technologies, Inc. My Passport Elite (WDML)
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
...

因此我们可以使用它来判断,例如,/dev/sde 是否作为 USB 2.0 设备连接(从上面的 bcdUSB 行)。

我不确定这是否回答了您的问题,但它提供了一种从块设备中识别 USB 设备的方法。另外,它还不够完整,因为我认为如果控制器和设备之间没有集线器,您必须为“cut”提供不同的参数。可能我应该从设备路径的末尾而不是开头开始计数,但我找不到将数字参数传递给的方法dirname

更新:这是一个使用 zsh 从设备路径末尾修剪组件的解决方案,如果它对您有用,请告诉我:

$ cat usb-device-from-block-device
#!/bin/zsh                         
udevadm info --path ${${$(udevadm info -q path $1)}%/*/*/*/*/*/*} | grep DEVNAME | cut -d = -f 2

# Example:
$ usb-device-from-block-device /dev/sdc
/dev/bus/usb/001/017
$ lsusb -D $(usb-device-from-block-device /dev/sdc)
...

答案4

我还没有看到以 UUID 为中心的答案,所以这里有一个:

如果该设备上有文件系统,则该文件系统有一个 UUID。无论闪存驱动器在系统上属于哪个设备主/次块设备,您都可以使用此 UUID 可靠地挂载文件系统

您可以使用 轻松显示哪个设备属于哪个 UUID/文件系统lsblk -f。以下是我的系统中的示例,它显示了我的单个 NVMe 驱动器的漂亮描述树。这个问题中的闪存驱动器可能会提供更简单的输出。

[dhay@GLaDOS ~]$ lsblk -f
NAME              FSTYPE      LABEL       UUID                                   MOUNTPOINT
nvme0n1                                                                          
├─nvme0n1p1       vfat        ESP         F2F6-9BC7                              /boot/efi
├─nvme0n1p2                                                                      
├─nvme0n1p3       crypto_LUKS             abde2123-0ee9-46b5-8d05-2b0b91b21054   
│ └─syspvluks     LVM2_member             ZsBxHH-tvRz-xE3k-e2dJ-I0O0-Gv4e-Ckap71 
│   ├─system-root xfs         root        a3acf72b-3309-408e-b6a4-0c3f28b86a53   /
│   └─system-swap swap        swap        5006f803-af24-4179-a5fa-7c5720b383d2   [SWAP]
├─nvme0n1p4       ntfs        WINRETOOLS  A0B0BED5B0BEB0E0                       
├─nvme0n1p5       ntfs        Image       D6E6BF67E6BF4711                       
├─nvme0n1p6       ntfs        DELLSUPPORT 00CED73ECED72AA4                       
└─nvme0n1p7       xfs         boot        b3e3a722-e37a-4c15-8d6c-4085c00b778a   /boot

有了该 UUID,您就可以用它来识别文件系统,无论它们位于什么设备上。这对于将文件系统从一个设备迁移到另一个设备也非常有用,而无需更新任何配置。以下是我的 /etc/fstab 文件的示例,它使用设备标签、UUID 和 LVM 持久名称的组合,而不是块设备的直接内核名称:

/dev/mapper/system-root /                       xfs     defaults,discard       0 0
UUID=F2F6-9BC7          /boot/efi               vfat    umask=0077,shortname=winnt 0 2
/dev/mapper/system-swap swap                    swap    defaults        0 0
LABEL=boot              /boot                   xfs     defaults,discard     0 0

同样,我可以在此命令中使用 UUID 作为设备参数mount将我的根文件系统挂载到目录:

[dhay@GLaDOS ~]$ mount UUID=a3acf72b-3309-408e-b6a4-0c3f28b86a53 /mnt/root

相关内容