Устройство с USB-портом для хранения пользователей – как определить / как разрешить небезопасные отключения?

Я пытаюсь создать простое устройство типа «устройство» с минимальным Linux и некоторым пользовательским кодом. Часть функциональности, которую я предлагаю, заключается в том, что пользователь может подключить флэш-накопитель USB или жесткий диск к определенному порту USB, и устройство может записывать данные в файловую систему на этом устройстве.

Этот вопрос состоит из двух частей:


# 1: Как я могу определить фактический файл блочного устройства для запоминающего устройства USB, которое было подключено к одному конкретному USB-порту устройства?

Просто предполагая, что устройство хранения USB всегда будет на /dev/sdb кажется немного рискованным, потому что предположим, что пользователь подключает концентратор к порту или предположим, что вы получаете устройство с несколькими конечными точками (например, считывающее устройство для карт). Кроме того, предположим, что устройство перезагружается или запускается с USB-устройством в USB-порту и по какой-либо причине система решает сделать устройство USB /dev/sda и внутреннее хранилище /dev/sdb . (Можно предположить, что загрузочный носитель для этого устройства также будет USB, поэтому это вполне вероятно.)

Так что я в основном хочу иметь возможность сказать: «Дайте мне файл устройства (например, / dev / sdb) для запоминающего устройства USB на этом конкретном USB-порту». Если на одном порту найдено несколько блочных устройств, мне нужен «массив» или список всех конечных точек, специфичных для этого единственного устройства.

Для примера, что кто-то присоединяет концентратор к порту и подключает несколько флеш-накопителей к этому концентратору, я был бы в порядке: либо 1) ничего не отображалось вообще (и сообщать пользователям, что хабы не разрешены, и они должны просто просто напрямую присоединяться ) или 2) получение списка всех блочных устройств, подключенных к концентратору (аналогично устройству с несколькими конечными точками).

Также очевидно, что если кто-то присоединяет к этому порту устройство без хранения, любой метод, который я придумал, не должен давать узел устройства хранения.


# 2: Какова наилучшая практика для монтирования файловой системы таким образом, чтобы ее можно было безопасно удалить без предварительного ее размонтирования до тех пор, пока не происходит никаких записей?

Очевидно, пользователям будет предложено никогда не удалять устройство, пока его свет мигает, и т. Д. Однако, для того, чтобы пользователь мог пройти процесс ручного размонтирования, может быть плохой UX для этого устройства. (У него будет очень минимальный пользовательский интерфейс, поэтому реализовать безопасно-удаляемый вариант оборудования, который легко получить доступ и использовать, будет сложным.) В принципе, пользователь должен иметь возможность вытаскивать свой диск, как только визуально очевидно, что больше писем не происходит.

Очевидно, что большинство подключенных устройств будут vfat. Я также хотел бы поддержать ntfs (через ntfs-3g) и exfat (через exfat-fuse).

Я могу просто отправлять синхронизацию всякий раз, когда я пишу данные в своем собственном коде, но один случай использования – это внешнее приложение, которое передает данные на USB-устройство в куски. Подумайте о регистраторе данных. Создается файл, и данные передаются ему в куски, но между каждым блоком должно быть приемлемым для пользователя, чтобы вытащить диск, когда он находится между записью, система обнаруживает его и полностью останавливает регистрацию данных и имеет структуру привода быть безопасным.

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


Я знаю, что я много прошу разрешить пользователям просто тянуть диски по своему усмотрению, и, очевидно, если пользователь вытащит диск во время записи, это будет проблемой, но я хочу позволить, по крайней мере, ближе всего к этой святой Грааль, который я могу.

Идеи?

  • Проблемы с сохранением папок Linux и Windows на одном USB?
  • У моего Ubuntu есть модуль для USB 2.0?
  • Неустранимая ошибка: linux / smp_lock.h: нет такого файла или каталога при попытке скомпилировать tiusb
  • usb_submit_urb (ctrl) не удалось: -1 Corsair k65 RGB-клавиатура
  • Ubuntu 14.04 - Несколько ручек Powermate для технологии Griffin
  • Opticon OPN-3002i нет ttyUSB0
  • Почему «cat ttyUSB0» не производит выход?
  • запись модуля ядра USB-нюхания
  • One Solution collect form web for “Устройство с USB-портом для хранения пользователей – как определить / как разрешить небезопасные отключения?”

    Для (1) я предлагаю взглянуть на удисков – они уже много решили для вас. Включая такие вещи, как «что произойдет, если пользователь подключится к двум устройствам хранения?» (помните: USB-хабы, и, конечно, некоторые устройства представляют собой несколько). udisks позволяет легко находить доступные устройства, получать уведомления, когда становится доступным (или удаляется), проверять различные атрибуты устройства и т. д. Он также будет обрабатывать вас, включая поддержку большого количества файловых систем.

    Для (2), если возможно, я отключил устройство между write. Если нет, вы можете установить его sync и / или режим dirsync , что должно помочь – это должно поддерживать файловую систему в согласованном состоянии между записью. Кроме того, если вы пишете на предварительно выделенное пространство, это часто будет включать в себя изменения (или, по крайней мере, минимальные, только mtime) метаданные файловой системы. (Когда вы создаете журнал, напишите 10 МБ нуля, затем возвращайтесь к началу и передавайте ему данные. Когда вы нажмете 10 МБ, создайте еще один журнал. Только редкая операция создания действительно рискует повреждением файловой системы.)

    Однако, как отметила Джулия Пеллетье, предпочтительнее была бы какая-то кнопка извлечения.

    Кроме того, в качестве дополнительной заметки, если вы можете заставить внешнее приложение записывать свои данные в канал (включая именованный, созданный с помощью mkfifo ), тогда ваш код может читать из канала и обрабатывать фактическую запись на USB. То же самое происходит, если внешнее приложение записывается во временный файл на tmpfs.

    Interesting Posts
    Linux и Unix - лучшая ОС в мире.