【问题标题】:Linux: How to map a blockdevice to a USB-device?Linux:如何将块设备映射到 USB 设备?
【发布时间】:2011-03-30 11:04:44
【问题描述】:

如果我插入 USB 记忆棒,我会在 /sys/bus/usb/devices 中看到一个新文件夹...因此是一个新的 USB 设备。

我还在 /sys/block 中看到了一个新文件夹……因此是一个新的块设备。

我的问题是:如何获得这两个设备之间的防水映射?方法: 如果我在 /sys/bus/usb/devices 中有一个新设备,我如何以编程方式(通过检查 /sys/...)找出哪个块设备映射/与此 USB 设备相关,反之亦然? !

【问题讨论】:

    标签: linux usb-drive device


    【解决方案1】:

    据我所知,可以通过“libudev”库访问 udev 信息。网上也有很好的示例:http://www.signal11.us/oss/udev/

    我能够对其进行修改以读出所有“/dev/sd*”设备并获取它们的供应商 ID、产品 ID 以及序列号。我认为这个解决方案足够独立于内核/Linux 发行版。但我仍然需要验证这一点。

    【讨论】:

      【解决方案2】:

      /sys 中的信息以多种方式组织(按驱动程序、按总线等),并且从一个层次结构到另一个层次结构有许多符号链接。

      恰当的例子(在内核 2.6.26 上看到的示例):从 /sys/block/sdc 中的块设备开始,符号链接 /sys/block/sdc/device 指向每个设备类型层次结构内。您可以看到它是一个 USB 设备,因为链接的目标类似于

      ../../devices/pci0000:00/0000:00:1d.7/usb8/8-2/8-2:1.0/host9/target9:0:0/9:0:0:0
      

      相反,USB 设备在/sys/bus/usb/devices 中列出,我们可以看到8-2:1.0 是一个类似磁盘的设备,因为/sys/bus/usb/devices/8-2:1.0/driver 链接到usb-storage。要找出关联的块设备是什么,似乎我们需要进入目录/sys/bus/usb/devices/8-2:1.0/host9/target9:0:0/9:0:0:0,其中包含一个符号链接block:sdc,其目标是/sys/block/sdc

      添加:注意:/sys 的确切结构因内核版本而异。例如,在内核 2.6.32 中,/sys/block/sdc/device 直接指向/dev/bus/scsi 而无需通过 USB 跃点。


      另一种方法是调用udevadm info 命令。 udevadm info -p /sys/block/sdc --query=… 根据其/sys 条目提供有关设备的信息,而udevadm info -n sdc --query=… 提供有关设备/dev/sdc 的信息。

      信息包括公交信息,例如udevadm info -p /sys/block/sdc --query=env节目

      ID_BUS=usb
      ID_PATH=pci-0000:00:1d.7-usb-0:2:1.0-scsi-0:0:0:0
      

      udev 文档可能包含您感兴趣的更多信息。


      最后一句警告:有各种复杂的情况可能会使你不防水的东西变得如此防水。您的程序将如何处理单个 USB 设备,该设备是分配了多个块设备的磁盘阵列?相反,您的程序将如何处理由多个设备组装而成的 RAID 阵列(可能其中一些是 USB,而有些不是)?您是否关心其他可移动媒体类型,例如 Firewire 和 e-SATA?等等。您无法预测所有极端情况,因此请确保优雅地失败。

      【讨论】:

      • 感谢您的解释。我可以在 debian 机器上跟踪您的示例。但是在 Ubuntu f.i. /sys/block/sdb 包含指向“../../../7:0:0:0”的“设备”链接。如果我按照你们其他人的示例进行操作,则没有“block:sdb”符号链接。从 /sys/block 开始的所有设备路径都不会显示这是 USB 设备的任何提示 :-( 所以对于 debian 它可能有效,但 Ubuntu 似乎有所不同。命令“udevinfo”不适用于 Ubuntu。但是有“udevadm”,它似乎很相似。但是解析命令行输出可能不是最好的?!
      • 关于防水问题:我的用例不关心不同类型设备的突袭。它只是关于 USB 闪存盘。我需要的只是供应商 ID + 产品 ID + 序列号 + 与挂载点的关系。就是这样。
      • @Alex:好的,我看了一下,似乎更新的内核版本在/sys 下具有不同的符号链接结构。据我所知udevinfo(它存在的地方)完全等同于udevadm info。看起来udevadm info 是可行的方法(它还为您提供供应商和序列号信息)。
      • 你知道是否有办法以编程方式获取这些信息吗?通过 .so 文件或系统调用,而不是执行命令并解析输出......?!
      • @Alex:信息必须以某种方式来自内核。据我所知(不多),大部分信息只能通过/sys 提供给用户空间,我们已经发现内核版本的变化。 Udev 与内核保持同步,并且有一个以udevadm 形式记录的大部分API。 udevadm 通过读取 /dev/.udev/db 中的文件(我猜是 udevd 创建的)来工作,但是这些文件也会被重新组织(例如,它们在 Debian lenny 和 Ubuntu lucid 上不一样)。其他接口我不知道。所以udevadm 看起来是迄今为止最可靠的方式。
      猜你喜欢
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 2021-11-07
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多