文件级别的USB Mass Storrage

Cha*_*rly 10 linux usb-mass-storage block-device

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

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

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

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

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

选项:

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

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

我会很感激!

查理

bdo*_*lan 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小工具.

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

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


eph*_*ent 5

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

话虽这么说,有人已经实现了你的选项1,虽然"设备"和"主机"有点颠倒. QEMU有一个名为vvfat的疯狂黑客,它可以创建一个假的阻止设备,它只是从主机上的目录/文件树中看到它包含一个VFAT文件系统.它需要在开始之前进行完整的递归扫描,这取决于操作系统如何写入文件系统的详细信息,如果您在使用中独立更改任何文件,但是(某种程度上)设法(有时)工作,则会失败.