13

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

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

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

[...] 它提供了一个简单的接口来读取和写入数据扇区——很像用于访问任何硬盘驱动器的低级接口 [...]。操作系统可能会将 USB 驱动器视为硬盘驱动器,并且可以使用它们喜欢的任何文件系统对其进行格式化。(来自维基百科

所以没有机会通过大容量存储来拥有动态文件系统......这似乎是为什么我的安卓手机在连接到 PC 时会卸载手机上的所有数据的原因。

选项

  • 在用户空间中创建一个“块设备” - 类似于 FUSE(当我想动态提供文件时,需要一个反向 FAT 驱动程序)
  • 实现我自己的 nbd-server 以创建块设备(还需要反向 FAT 驱动程序吗?)
  • 我将加密文件保存到一个分区,并将这个分区传递给大容量存储小工具(问题是性能和缺乏动态交互)
  • 不要提供大容量存储设备并注意其他想法(eth over USB)

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

我将感激不尽!

查理

4

4 回答 4

11

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 加密原始块设备,并将整个块设备(加密为一个块)暴露给 Windows。
  5. 您可以实现一个MTP小工具。

这些方法都有自己的问题:

  1. 需要安装 Windows 驱动程序,并由微软等签署。不能在没有管理权限的机器上使用来安装驱动程序。
  2. 不会自动播放;用户需要通过网络浏览器浏览才能访问文件。防火墙设置可能会干扰。可能有很大的开销。
  3. 非常复杂。在后端处理元数据更新可能非常困难。意外拔出事件可能是毁灭性的。如果用户尝试访问锁定的文件,Windows 接收 IO 错误的行为可能会成为问题。
  4. 没有可用的文件级加密,但否则应该可以正常工作。
  5. 我不确定 MTP 对非媒体文件有多少支持;支持不如大容量存储支持广泛。
于 2011-05-16T20:16:50.990 回答
6

您可能会感兴趣的是,以前将自己作为 USB 大容量存储设备暴露给主机的 Android 正在充当 MTP 设备(如 Honeycomb)。

话虽如此,有人已经实现了您的选项 1,尽管“设备”和“主机”有点颠倒。 QEMU有一个名为vvfat的疯狂 hack ,它能够创建一个伪造的块设备,在 VM 看来,它包含仅来自主机上的目录/文件树的 VFAT 文件系统。它需要在开始之前进行完整的递归扫描,取决于操作系统如何写入文件系统的详细信息,并且如果您在使用时独立更改任何文件,但(不知何故)设法(有时)工作,它会失败。

于 2011-05-17T02:22:12.363 回答
1

可以将 NBD 协议转换为 USB,并且“bit-bang”usb 在 USB 主机中显示为 USB 大容量存储设备。

  • NBD 和 USB msas 存储都是块级设备,因此可以将一种协议转换为另一种协议。但是,这几乎肯定需要编程,因为我认为这不存在。但是,http ://travisgoodspeed.blogspot.com/2012/07/emulating-usb-devices-with-python.html看起来对 USB 端相当有用,而https://bitbucket.org/hirofuchi/xnbd/wiki/ Home应该为您提供NBD客户端的一个很好的例子。
  • 使用 VFAT 意味着 Windows 可以将其视为普通的 USB 磁盘驱动器,无需驱动程序。
    • 正如另一位海报所建议的那样,qemu 的 vvfat 模块可用于自动执行其中的一些操作。
  • 流量加密需要通过 SSH 或 OpenVPN 对 NBD 流量进行隧道传输。

最终设置如下所示:

+---------------------------------+                +------------------+
| 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 
+----+----------------------+-----+                +------------------+   
于 2012-11-06T14:11:30.067 回答
0

查看选项,我会考虑使用 ethernet-gadget,并在设备中进行 IP 自动配置,然后运行 ​​Samba 以将文件系统导出到 Windows 主机。这将为您提供所需的控制级别。

于 2011-05-16T21:05:59.363 回答