文件级别的USB海量存储

时间:2011-05-16 20:07:39

标签: linux usb-mass-storage block-device

挑战:我有一个Linux手持设备,它记录数据并将其存储到光盘。它应该通过USB与Windows应用程序交换这些数据。当用户可以访问此数据时 - 例如通过USB大容量存储 - 它必须加密。它应该是开箱即用的,具有各种操作系统,也适用于Citrix终端会话等。

计划:我使用FUSE在用户空间中创建文件系统,并通过大容量存储将其提供给Windows。每当Windows访问一个文件时,我都会得到一个回调并动态加密数据。此外,我们可以有一些动态内容 - 例如当一些密码写入文件时,会显示更多内容。

问题:使用大容量存储小工具(例如g_file_storage)时,它只接受文件或块设备 - 但不接受文件系统(目录)。为什么呢?

  

[...]它为读取和写入数据扇区提供了一个简单的接口 - 非常类似于用于访问任何硬盘驱动器的低级接口[...]。操作系统可以将USB驱动器视为硬盘驱动器,并可以使用他们喜欢的任何文件系统对其进行格式化。 (来自wikipedia

因此没有机会通过大容量存储获得动态文件系统......这似乎是为什么我的Android手机在手机上卸载所有数据的原因,当我将它连接到PC。

选项

  • 创建一个'block-device in userspace' - 类似于FUSE(需要反向FAT驱动程序,当我想动态提供文件时)
  • 实现我自己的nbd-server来创建一个块设备(还需要一个反向FAT驱动程序?)
  • 我将加密文件保存到分区,并将此分区传递给大容量存储小工具(问题是性能和缺乏动态交互)
  • 不要提供大规模存储设备,并留意其他想法(通过USB传播)

目前,只有最后一个选项似乎是现实的 - 或者你还有另一个提示吗?

我将不胜感激!

查理

4 个答案:

答案 0 :(得分:9)

USB大容量存储协议是一种块设备协议;它不在文件或目录级别运行。 Windows主机希望看到g_mass_storage驱动程序公开的原始VFAT文件系统,并将根据需要对VFAT元数据进行写入和读取,以确定目录的结构。

因此,将FUSE文件系统暴露给Windows主机是非常重要的。您必须模拟VFAT,将虚拟文件系统中的块分配给元数据和数据,并且由于Windows主机可以自由地缓存它读取的任何数据或元数据,因此一旦您分配了一些元数据或数据,它就无法更改(因此更改为您的FUSE数据无法反映在Windows文件系统中)。 Windows主机还可以延迟和重新排序对元数据和数据的写入 - 如果您尝试模拟,那么这一切都非常混乱。

现在,您可以做一些事情:

  1. 您可以在Windows端编写自定义IFS驱动程序,以通过在文件/目录级别工作的自定义协议与您的Linux设备进行交互。
  2. 您可以将USB设备视为虚拟以太网端口,并将CIFS说成Windows主机
  3. 您可以以某种方式在连接时创建静态VFAT布局以暴露给Windows主机;尚未解密的数据可能会返回I / O错误,以避免Windows主机缓存原始加密数据。
  4. 您只需使用dm-crypt加密原始块设备,并将整个块设备(加密为一个块)暴露给窗口。
  5. 您可以实施MTP小工具。
  6. 这些方法都有自己的问题:

    1. 需要安装Windows驱动程序,并由microsoft等签名。如果没有管理员权限,则无法在没有安装驱动程序的计算机上使用。
    2. 不会自动播放;用户需要浏览网络浏览器才能访问这些文件。防火墙设置可能会干扰可能会有很大的开销。
    3. 非常复杂。处理后端的元数据更新可能非常困难。惊喜拔掉事件可能是毁灭性的。如果用户尝试访问锁定的文件,则在收到IO错误时的Windows行为可能会出现问题。
    4. 没有文件级加密可用,否则应该可以正常工作。
    5. 我不确定MTP对非媒体文件有多少支持;支持并不像大容量存储支持那样普遍。

答案 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主机。这将为您提供所需的控制级别。