![在 Ubuntu 上,USB 设备->块设备映射?](https://linux22.com/image/522384/%E5%9C%A8%20Ubuntu%20%E4%B8%8A%EF%BC%8CUSB%20%E8%AE%BE%E5%A4%87-%3E%E5%9D%97%E8%AE%BE%E5%A4%87%E6%98%A0%E5%B0%84%EF%BC%9F.png)
如果这是重复的,请见谅。
我有 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