挑战:我有一个Linux手持设备,它记录数据并将其存储到光盘。它应该通过USB与Windows应用程序交换这些数据。当用户可以访问此数据时 - 例如通过USB大容量存储 - 它必须加密。它应该是开箱即用的,具有各种操作系统,也适用于Citrix终端会话等。
计划:我使用FUSE在用户空间中创建文件系统,并通过大容量存储将其提供给Windows。每当Windows访问一个文件时,我都会得到一个回调并动态加密数据。此外,我们可以有一些动态内容 - 例如当一些密码写入文件时,会显示更多内容。
问题:使用大容量存储小工具(例如g_file_storage)时,它只接受文件或块设备 - 但不接受文件系统(目录)。为什么呢?
[...]它为读取和写入数据扇区提供了一个简单的接口 - 非常类似于用于访问任何硬盘驱动器的低级接口[...]。操作系统可以将USB驱动器视为硬盘驱动器,并可以使用他们喜欢的任何文件系统对其进行格式化。 (来自wikipedia)
因此没有机会通过大容量存储获得动态文件系统......这似乎是为什么我的Android手机在手机上卸载所有数据的原因,当我将它连接到PC。
选项:
目前,只有最后一个选项似乎是现实的 - 或者你还有另一个提示吗?
我将不胜感激!
查理
答案 0 :(得分:9)
USB大容量存储协议是一种块设备协议;它不在文件或目录级别运行。 Windows主机希望看到g_mass_storage驱动程序公开的原始VFAT文件系统,并将根据需要对VFAT元数据进行写入和读取,以确定目录的结构。
因此,将FUSE文件系统暴露给Windows主机是非常重要的。您必须模拟VFAT,将虚拟文件系统中的块分配给元数据和数据,并且由于Windows主机可以自由地缓存它读取的任何数据或元数据,因此一旦您分配了一些元数据或数据,它就无法更改(因此更改为您的FUSE数据无法反映在Windows文件系统中)。 Windows主机还可以延迟和重新排序对元数据和数据的写入 - 如果您尝试模拟,那么这一切都非常混乱。
现在,您可以做一些事情:
这些方法都有自己的问题:
答案 1 :(得分:5)
您可能会感兴趣的是,以前将自己作为USB大容量存储设备暴露给主机的Android正在充当MTP设备(从Honeycomb开始)。
话虽这么说,有人已经实现了你的选项1,尽管“设备”和“主机”有点颠倒了。 QEMU有一个名为vvfat的疯狂黑客,它能够创建一个假的阻止设备,该虚拟阻塞设备看起来只包含一个来自主机上目录/文件树的VFAT文件系统。它需要在开始之前进行完整的递归扫描,这取决于操作系统如何写入文件系统的详细信息,如果您在使用时独立更改任何文件,则会失败,但(以某种方式)设法(有时)工作。
答案 2 :(得分:1)
有可能将NBD协议转换为USB,并将“bit-bang”usb转换为USB主机作为USB大容量存储设备。
最终的设置看起来像这样:
+---------------------------------+ +------------------+
| data collection device | | client device |
| +----------------+ | | |
| | collected data | | | SSH -> NBD |
| | -> linux fs | | | client |
| +--+-------------+--------+ | | | |
| -> | qemu vvfat | SSH +-{some network}-+ V |--> client PC
| | run NBD inside the VM| | | USB Mass Storage | USB port
+----+----------------------+-----+ +------------------+
答案 3 :(得分:0)
查看选项,我会考虑使用ethernet-gadget,并在设备中进行IP自动配置,然后运行Samba将文件系统导出到Windows主机。这将为您提供所需的控制级别。