![如何写入字符特殊设备?](https://linux22.com/image/123341/%E5%A6%82%E4%BD%95%E5%86%99%E5%85%A5%E5%AD%97%E7%AC%A6%E7%89%B9%E6%AE%8A%E8%AE%BE%E5%A4%87%EF%BC%9F.png)
由于udev
我试图从中抢救数据的机器上的设置损坏(请参阅我的这篇文章)我试图写入与 USB 闪存驱动器相对应的“字符特殊”设备,但遇到了困难。
我期望的是(具有 root 权限)我可以这样做:
echo "test 123" > /dev/bus/usb/001/031
但我得到
bash: echo: write error: Invalid argument
这是怎么回事?如何写入字符设备?
聚苯乙烯:这特别有趣,因为我通常期望的块设备(/dev/sdb
, 中的东西/dev/block
)由于某种原因没有被创建。但我注意到,当我插入 USB 驱动器时,确实会创建一个字符设备(当我删除它时,也会删除它)。如果我能找到某种方法写入该设备,我可以省去很多通过音频电缆缓慢传输数据的麻烦(这是我目前最好的方法)。
答案1
这些是“原始 USB”设备。使用它们需要几个特定于 USB 的ioctl()
函数:仅从 shell 将原始数据写入它们根本不可能完成太多任务。必须首先将数据格式化为有效的 USB 数据包,然后ioctl()
使用函数来建立与该设备内正确 USB 端点的连接。
由于我们讨论的是 USB 存储设备,因此过程会更加复杂:对于这些 USB 数据包,应该有六种可能的存储命令集之一。实际上,最常见的命令集是“SCSI 透明”命令集——一种封装在 USB 中的 SCSI 协议。
因此,您首先必须/dev/sg*
通过制作自己的 SCSI 命令数据包来学习如何使用设备写入磁盘设备。一旦实现了这一点,您就可以将 USB 特定的包装器添加到该过程中,只有这样您才可以使用这些/dev/bus/usb/<busnum>/<devnum>
设备将原始块写入 USB 存储设备。
在大多数情况下,使用原始 USBioctl()
是极其乏味的,除非您需要非常具体的东西:大多数需要原始 USB 访问的程序员将使用libusb
或其他一些库(例如libftdi
对 FTDI USB 转串行转换器芯片的硬件开发人员级访问)来为他们处理 USB 的基本机制。简而言之,您必须是一名相当成熟的 USB I/O 程序员才能在像您这样的救援情况下成功使用原始 USB 存储设备。
话虽如此,您的其他帖子看起来您必须完成一次真正史诗般的数据救援操作。为此,我尊重您的成就...但我也希望您了解备份的重要性。