Jos*_*sen 2 linux devices usb-drive usb-device character-special-files
由于udev
我试图从中抢救数据的机器上的设置损坏(请参阅我的这篇文章),我试图写入与 USB 闪存驱动器相对应的“特殊字符”设备,但遇到了困难。
我期望的是(具有 root 权限)我可以这样做:
echo "test 123" > /dev/bus/usb/001/031
Run Code Online (Sandbox Code Playgroud)
但我得到
bash: echo: write error: Invalid argument
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?如何写入字符设备?
PS:这很有趣,因为我通常期望的块设备(/dev/sdb
,里面的东西/dev/block
)由于某种原因没有被创建。然而,我注意到插入 USB 驱动器时确实会创建一个字符设备(并在我移除它时移除)。如果我能找到某种方式来写入该设备,我可以省去很多麻烦,通过音频电缆缓慢传输数据(这是我目前最好的方法)。
这些是“原始 USB”设备。使用它们需要几个特定于 USB 的ioctl()
功能:仅从 shell 将原始数据写入它们不太可能完成太多工作。必须首先将数据格式化为有效的 USB 数据包,然后ioctl()
使用用于建立与该设备内正确 USB 端点的连接的函数。
由于我们谈论的是 USB 存储设备,所以过程会更加复杂:对于这些 USB 数据包,应该有六个可能的存储命令集之一。实际上,最常见的命令集是“SCSI 透明”命令集 - 一种封装在 USB 中的 SCSI 协议。
因此,您首先必须/dev/sg*
通过制作自己的 SCSI 命令包来学习如何使用设备写入磁盘设备。一旦实现了这一点,您就可以在该过程中添加特定于 USB 的包装器,只有这样您才能使用这些/dev/bus/usb/<busnum>/<devnum>
设备将原始块写入 USB 存储设备。
在大多数情况下,ioctl()
除非您需要非常具体的东西,否则使用原始 USB是非常乏味的:大多数需要原始 USB 访问的程序员将使用libusb
或其他一些库(例如libftdi
硬件开发人员级访问 FTDI USB 到串行转换器芯片)来为他们处理 USB 的基本机制。简而言之,您必须已经是一名成熟的 USB I/O 程序员,才能在像您这样的救援情况下成功使用原始 USB 存储设备。
话虽如此,您的另一篇文章看起来像是您必须完成一场真正史诗般的数据救援行动。为此,我尊重您的成就……但我也希望您已经了解了备份的重要性。
归档时间: |
|
查看次数: |
1414 次 |
最近记录: |