如何写入字符特殊设备?

如何写入字符特殊设备?

由于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 存储设备。

话虽如此,您的其他帖子看起来您必须完成一次真正史诗般的数据救援操作。为此,我尊重您的成就...但我也希望您了解备份的重要性。

相关内容