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