如何让 Linux 系统看起来像 USB 驱动器

如何让 Linux 系统看起来像 USB 驱动器

我有一个基于 CentOS 6.5 基线构建的自定义 NAS。我需要可以通过 USB 端口访问该 NAS 的存储。我无法使用网络连接。我的手机可以做到这一点,必须有一种方法让 Linux 盒子也能做到这一点。我发现了以下类似的问题: 我可以让 Linux 计算机上的 USB 端口看起来像大容量存储设备吗? 这实质上是说你不能这样做,声称 USB 设备必须处于客户端模式。这是没有意义的,请求实际上是针对服务器模式的不同实现/处理。显然需要对驱动程序进行某种修改,我猜测有使用 BusyBox 或类似工具的外部驱动器托架已经可以做到这一点,但我没有明确找到完成此操作所需的内容。

答案1

USB最初设计为星形拓扑:在中心,有一个主机控制器管理整个总线。从那里,连接向外延伸至设备枢纽,并且这两者都需要主机控制器来管理它们,否则不会发生任何流量。本质上,主机控制器是主控制器,总线上的所有其他控制器都是从控制器。

仅更改软件是不够的:主机控制器具有与任何从设备不同类型的 USB 接口芯片,并且主机控制器需要更改硬件才能充当从设备。

随着智能手机和其他移动设备的出现,人们发现这是有问题的,并且USB随身携带制定了规范。由此,引入了双角色设备的概念:这需要修改主机控制器芯片以支持主设备和从设备角色,以及新的子协议来协商将主设备角色从一个设备切换到另一个设备。

不幸的是,具有 USB-On-The-Go 功能的主机控制器芯片往往仅用于智能手机、平板电脑和其他移动设备,而不用于台式机和服务器主板。

如果您的 NAS 具有能够充当从设备的 USB 端口硬件,那么问题就会相当简单:Linux 内核也已经支持设备端 USB(而不是更常见的主机端支持) )。不过,我认为 CentOS 6.x 没有启用这些功能,因此您可能必须编译一个启用了“USB Gadget Support”子系统的自定义内核。在该子系统中,您必须启用设备端 USB 硬件的特定驱动程序以及 USB 海量存储协议的设备端驱动程序。

不幸的是,设备端似乎没有像 UHCI/OHCI/EHCI/XHCI 这样的接口标准:所有设备端控制器芯片设计似乎都是独特的雪花,您必须确切地知道您的 NAS 中使用的是哪种芯片。

驱动程序问题解决后,还有一个技术问题:USB 大容量存储访问是一种低级协议,访问存储设备上的各个块,很像 SATA;不是像 NFS 这样的文件级别。因此,NAS 设备必须停止共享并卸载它通过 USB 提供的任何存储,因为访问它的系统会假设它完全控制 USB 存储的文件系统,并且会处理 NAS 设备所做的任何更改文件系统损坏的同时,自身或通过网络访问 NAS 的任何其他设备也会损坏。

解决此问题的一种方法是在 USB 共享存储上运行集群文件系统。集群文件系统(如 GFS 或 OCFS2)就是为这种多路访问而设计的,但它要求所有参与的系统相互协作和通信。这增加了相当多的额外复杂性。另一种方法是不使用 USB 海量存储协议,而是使用 USB MTP(媒体传输协议)或其更简单的版本 PTP(图片传输协议)——这两种协议都在文件级别工作,而不是在块级别工作USB 大容量存储器。这将允许 NAS 在 USB 共享处于活动状态时保持对共享文件系统的总体控制,因此将允许它同时通过网络继续共享文件系统。

答案2

如果您的 NAS 的 USB 硬件支持在 USB 客户端模式下工作,您可以使用Linux-USB 小工具 API 框架(或基于它的东西)。

相关内容