如何手动添加 udev 添加的设备,然后在插入 USB 端口后删除?

如何手动添加 udev 添加的设备,然后在插入 USB 端口后删除?

我正在尝试将带有 MTK6260A 芯片组的廉价智能手表安装到我的电脑上,以便读取固件内容。但是,虽然 dmesg 显示设备已被正确检测到并创建:

[107204.279493] sd 12:0:0:0: [sdf] Test WP failed, assume Write Enabled
[107204.280474] sd 12:0:0:0: [sdf] Asking for cache data failed
[107204.280486] sd 12:0:0:0: [sdf] Assuming drive cache: write through
[107204.281588] sd 12:0:0:0: [sdf] Attached SCSI removable disk

udev 创建然后删除它(从 udevadm 监视器中):

KERNEL[107206.407012] add      /devices/virtual/bdi/8:80 (bdi)
KERNEL[107206.407083] add      /devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/host12/target12:0:0/12:0:0:0/block/sdf (block)
UDEV  [107206.407522] add      /devices/virtual/bdi/8:80 (bdi)
KERNEL[107206.408114] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/host12/target12:0:0/12:0:0:0/scsi_disk/12:0:0:0 (scsi_disk)
KERNEL[107206.408199] remove   /devices/virtual/bdi/8:80 (bdi)
KERNEL[107206.408241] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/host12/target12:0:0/12:0:0:0/block/sdf (block)
KERNEL[107206.408270] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/host12/target12:0:0/12:0:0:0 (scsi)
UDEV  [107206.408524] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/host12/target12:0:0/12:0:0:0/scsi_disk/12:0:0:0 (scsi_disk)
UDEV  [107206.408806] remove   /devices/virtual/bdi/8:80 (bdi)
KERNEL[107206.420107] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/host12/target12:0:0 (scsi)
KERNEL[107206.436186] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/host12/scsi_host/host12 (scsi_host)
KERNEL[107206.436204] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/host12 (scsi)
UDEV  [107206.436828] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/host12/scsi_host/host12 (scsi_host)
UDEV  [107206.470749] add      /devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/host12/target12:0:0/12:0:0:0/block/sdf (block)
UDEV  [107206.473577] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/host12/target12:0:0/12:0:0:0/block/sdf (block)
UDEV  [107206.474781] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/host12/target12:0:0/12:0:0:0 (scsi)
UDEV  [107206.475165] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/host12/target12:0:0 (scsi)
UDEV  [107206.475565] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-11/3-11:1.0/host12 (scsi)

有什么方法可以手动重新添加该设备吗?

答案1

(我会把这个作为答案并进行补充,尽管我没有现成的解决方案。在评论中这太尴尬了。)

问题不是udev,所以“调试 udev”不会有帮助。udev只是对来自内核的 .408114 的信号做出反应。

假设除了您显示的消息之外没有其他消息dmesg(这意味着“根本没有”,而不是“您认为没有相关的消息”,否则请使用代码片段前后的部分编辑问题),我们所知道的是内核尝试向智能手表发送命令以了解有关存储设备的更多信息,并且两者(写保护和缓存)都失败了。 之后,内核可能会进行更多交互,并最终决定这不是 USB 存储设备,因为它没有响应或返回错误。 因此,内核将其从存储层中删除,向发送信号,udevudev执行其应执行的操作并删除设备节点。 即使您阻止udev删除设备节点,它们也不会出现在内核级别,因此它们将毫无用处。

你可以使用usbmon嗅探 PC 和智能手表之间的 USB 数据包。wireshark可以解释这些数据包。如果你想调试它,你需要了解 USB 的工作原理、USB 存储的工作原理以及使 USB 存储层工作的 SCSI 命令。这可能会或可能不会提示哪里出了问题。通过谷歌搜索,不难找到这些标准。

廉价智能手表也可能没有正确实现 USB 存储标准,并且制造商编写了特殊的 Windows 驱动程序来隐藏这一事实。在这种情况下,您也可以在 Windows 上嗅探 USB 流量以了解其工作原理,但您必须为其编写自己的 Linux 内核或用户空间驱动程序,这需要大量工作。

相关内容