USB Mass Storrage на уровне файлов - PullRequest
10 голосов
/ 17 мая 2011

Задача : У меня есть портативное устройство Linux, которое записывает данные и сохраняет их на диске.Он должен обмениваться этими данными с приложением Windows через USB.Когда эти данные доступны пользователю - например, через USB-накопитель - они должны быть зашифрованы.Он должен работать "из коробки", с различными ОС, также для терминальных сессий Citrix и т. Д.

План : я создаю файловую систему в пространстве пользователяс FUSE , и предлагать его для окон через запоминающее устройство.Всякий раз, когда Windows обращается к одному файлу, я получаю обратный вызов и шифрую данные на лету.Более того, у нас может быть некоторое динамическое содержимое - например, когда в файл записывается какой-либо пароль, отображается больше содержимого.

Проблема : при использовании гаджета-накопителя (например, g_file_storage ) он принимает только файлы или блочные устройства - но не файловые системы (каталоги).Почему?

[...] он обеспечивает простой интерфейс для чтения и записи секторов данных - во многом как низкоуровневый интерфейс, используемый для доступа к любому жесткому диску [...].Операционные системы могут относиться к USB-накопителю как к жесткому диску и могут форматировать его в соответствии с любой файловой системой.(из wikipedia )

Так что нет никакой возможности иметь динамическую файловую систему через запоминающее устройство большой емкости ... и это, кажется, причина, почему мой мобильный Androidтелефон отключает все данные на телефоне, когда я подключаю его к ПК.

Опции :

  • Создание блочного устройства 'в пользовательском пространстве '- аналогично FUSE (нужен динамический FAT-драйвер, когда я хочу динамически предлагать файлы)
  • Реализация собственного nbd-сервера для создания блочного устройства (требуется обратныйТакже и FAT-драйвер?)
  • Я сохраняю зашифрованные файлы в раздел и передаю этот раздел в гаджет памяти (проблема может быть в производительности и отсутствии динамического взаимодействия)
  • Не предлагайте устройство массовой памяти и следите за другими идеями (например, через USB)

На данный момент только последний вариант кажется реалистичным - или у вас есть другой совет для меня?

Буду благодарен!

Чарли

Ответы [ 4 ]

9 голосов
/ 17 мая 2011

Протокол запоминающего устройства USB является протоколом блочного устройства;он не работает на уровне файлов или каталогов.Хост Windows ожидает увидеть необработанную файловую систему VFAT, предоставляемую драйвером g_mass_storage, и будет выполнять записи и чтения в метаданные VFAT в зависимости от ситуации, чтобы выяснить, как структурированы каталоги.

Из-за этого нетривиально выставлятьФайловая система FUSE для хоста Windows.Вам нужно будет эмулировать VFAT, назначая блоки в виртуальной файловой системе метаданным и данным, и поскольку хост Windows может свободно кэшировать любые данные или метаданные, которые он читает, после того, как вы назначите некоторые метаданные или данные, которые он не может изменить (поэтому изменяется наВаши данные FUSE не могут быть отражены в файловой системе Windows).Хост Windows также может задерживать и переупорядочивать записи как метаданных, так и данных - если вы попытаетесь эмулировать, все будет в порядке.

Теперь есть несколько вещей, которые вы можете сделать:

  1. Вы можете написать собственный драйвер IFS на стороне Windows, чтобы взаимодействовать с вашим устройством Linux через пользовательский протокол, который работает на уровне файлов / каталогов.
  2. Вы можете рассматривать устройство USB как виртуальный порт Ethernet и говоритьCIFS для хоста Windows
  3. Вы можете каким-то образом создать статическую компоновку VFAT во время соединения для показа хосту Windows;еще не расшифрованные данные могут возвращать ошибки ввода-вывода, чтобы избежать кэширования необработанных зашифрованных данных на хосте Windows.
  4. Вы можете просто зашифровать необработанное блочное устройство с помощью dm-crypt и выставить все это блочное устройство (
  5. Вы можете реализовать гаджет MTP .

У этих подходов есть свои проблемы:

  1. Требуется установка драйвера для Windows, подпись от Microsoft и т. Д. Не может использоваться на машине без административного доступа для установки драйвера.
  2. Не запускается автоматически;пользователю нужно будет просматривать браузер сети, чтобы получить доступ к файлам.Настройки брандмауэра могут мешать.Может иметь значительные накладные расходы.
  3. Очень сложный.Обработка обновлений метаданных на сервере может быть чрезвычайно сложной.События неожиданного отключения могут быть разрушительными.Поведение Windows при получении ошибки ввода-вывода может быть проблемой, если пользователь пытается получить доступ к заблокированному файлу.
  4. Шифрование на уровне файлов недоступно, но в остальном должно работать хорошо.
  5. I'mточно не знаете, сколько поддерживает MTP;поддержка не так широко распространена, как поддержка запоминающих устройств.
5 голосов
/ 17 мая 2011

Вам может быть интересно узнать, что Android, который ранее выставлял себя в качестве запоминающего устройства USB для хоста, вместо этого выступает в качестве устройства MTP (как у Honeycomb).

При этом кто-то сказалуже реализовал ваш вариант 1, хотя «устройство» и «хост» немного поменялись местами. QEMU имеет безумный хак под названием vvfat , который способен создать поддельное блочное устройство, которое для виртуальной машины выглядит так, как будто оно содержит файловый элемент VFAT только из дерева каталогов / файлов на хосте.Он требует полной рекурсивной проверки перед запуском, зависит от деталей того, как операционные системы пишут в файловые системы, и падает, если вы самостоятельно изменяете какие-либо файлы во время их использования, но (каким-то образом) удается (иногда) работать.

1 голос
/ 06 ноября 2012

Может быть возможно преобразовать протокол NBD в USB и usb "bit-bang" для отображения на хосте 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 может быть использован для автоматизации некоторых из них.
  • Шифрование трафика потребует туннелирования трафика NBD через SSH или OpenVPN.

Окончательная настройка будет выглядеть примерно так:

+---------------------------------+                +------------------+
| 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 
+----+----------------------+-----+                +------------------+   
0 голосов
/ 17 мая 2011

Рассматривая варианты, я бы подумал об использовании ethernet-гаджета и выполнении автоконфигурации IP на устройстве, а затем запустил Samba для экспорта файловой системы на хост Windows.Это даст вам необходимый уровень контроля.

...