私は最小限のLinuxといくつかのカスタムコードを実行する単純な「デバイス」タイプのデバイスを構築しようとしています。私が提供する機能の1つは、ユーザーがUSBフラッシュドライブまたはハードドライブを特定のUSBポートに接続でき、デバイスがそのデバイスのファイルシステムにデータを書き込むことができることです。
この質問には2つの部分があります。
#1:特定のハードウェアUSBポートに接続されているUSB大容量記憶装置の物理ブロックデバイスファイルを確認するには?
単にUSBストレージデバイスが常に接続されていると仮定することは、ユーザー/dev/sdb
がハブをポートに接続すると仮定したり、複数のエンドポイントを持つデバイス(カードリーダーなど)を使用していると仮定するのと同じくらい危険です。また、デバイスがUSBポートのUSBデバイスを使用して再起動または起動し、何らかの理由でシステムがUSBデバイス/dev/sda
と内部ストレージを作成することを決定したと仮定します/dev/sdb
。 (おそらくデバイスのブートメディアもUSBであるので、その可能性が非常に高いです。)
だから基本的に私がしたいのは「USB大容量記憶装置のためのデバイスファイル(例えば/dev/sdb)をください」と言うことです。特定USBポート「ポートで複数のブロックデバイスが見つかった場合は、「配列」またはその単一デバイスに関連するすべてのエンドポイントのリストが必要です。
たとえば、誰かがハブをポートに接続し、複数のフラッシュドライブをそのハブに接続すると、次のいずれかを選択できます。直接)または2)ハブに接続されているすべてのブロックデバイスのリストを取得します(マルチエンドポイントデバイスと同様)。
また、誰かがそのポートにストレージデバイスではなくデバイスを接続している場合は、私が何を考えてもストレージノードを提供しないでください。
#2:書き込みが行われない限り、最初にアンマウントせずに安全に削除できるように、ファイルシステムをマウントする最良の方法は何ですか?
例えば、ユーザは、デバイスのインジケータが点滅している間にデバイスを絶対に取り外さないように指示される。しかし、ユーザーに手動除去プロセスを実行するように要求すると、デバイスのユーザーエクスペリエンスが悪くなる可能性があります。 (非常に小さなユーザーインターフェイスがあるため、アクセスしやすく安全なハードウェアの取り外しオプションを実装することは困難です)。なし より多くの書き込みが発生します。
明らかに、ほとんどの接続デバイスはvfatです。また、ntfs(ntfs-3g経由)とexfat(exfat-fuse経由)をサポートしたいと思います。
私のコードでデータを書き込むたびに簡単に同期を実行できますが、1つのユースケースはデータをチャンク単位でUSBデバイスにストリーミングする外部アプリケーションです。データロガーを考えてみてください。ファイルを作成してデータをチャンクに転送しますが、〜サイ各ブロックは、ユーザーが書き込み間にドライブをインポートできるようにし、システムがそれを検出してデータのロギングを完全に停止させ、ドライブ構造が安全であることを確認する必要があります。
また、デバイスをインポートした後、私のコードがマウントを削除し、ドライブを見ることが期待されるすべてのタスクを停止できるようにすばやく認識する必要があります。
私はユーザーがドライブを勝手に引き出すことができるように多くのことを求めていることを知っています。明らかに、ユーザーがドライブを引っ張った場合期間これを書くのは問題になります。しかし、私は少なくともこの聖杯にできるだけ近づきたいと思います。
アイデアはありますか?
答え1
(1)の場合は、udiskを確認してください。 udiskは多くの問題を解決しました。 「ユーザーが挿入するとどうなりますか?」同じものも含まれます。二つストレージデバイス? (覚えておいてください:USBハブともちろん、いくつかのデバイスは2つ以上の形式で利用できます。)udiskを使用すると、利用可能なデバイスを簡単に見つけて、デバイスを使用または削除したときに通知され、さまざまなデバイスのプロパティを確認できます。また、さまざまなファイルシステムのサポートを含むインストールを処理します。
(2)の場合、可能であれば、書き込み間にデバイスをアンマウントします。それ以外の場合は、マウントおよびsync
/またはdirsync
モードを使用すると役立ちます。これにより、書き込み間でファイルシステムを一貫した状態に保つ必要があります。さらに、事前に割り当てられたスペースに書き込むと、通常、ファイルシステムのメタデータの変更はまったく(または少なくともmtimeのみ)発生します。 (ログを作成するときは、10 MBのゼロを書き、最初に戻ってデータをストリーミングします。10 MBに達すると、別のログを生成します。まれに作成された操作だけが実際にファイルシステムの破損の危険に直面します。)
しかし、Julie Pelletierが指摘したように、一種のフライアウトボタンがより良いでしょう。
さらに、外部アプリケーションがそのデータをパイプに書き込むことができる場合(生成された名前付きパイプの使用を含むmkfifo
)、コードはパイプからデータを読み取り、USBへの実際の書き込みを処理できます。 tmpfsの一時ファイルに書き込む外部アプリケーションがある場合も同様です。