Linux環境である段階で低レベルのディスク操作を実行するアプリケーションを書いています。アプリは実際には2つの部分で構成されています。1つはWindowsで実行され、ユーザーと対話します。もう1つは、LiveCDから実行されるLinuxの部分です。ユーザーがWindowsドライブ文字を選択すると、Linuxパーツが対応するパーティションでアクションを実行します。問題は、Windowsのドライブ文字(C :など)とLinuxのデバイス名(/ dev / sda1など)の一致を見つけることです。これは私が醜いと評価している私の現在の解決策です:
パーティション情報(つまり、ドライブ文字、ブロック数、ドライブのシリアル番号など)をWindowsの事前定義された場所(つまり、システムパーティションのルート)に保存します。
/ proc/partitionsからパーティションのリストを読み取ります。SCSIまたはIDEハードドライブのメジャー番号と、ディスク全体ではなく実際のパーティションとしてそれらを識別するマイナー番号を持つパーティションのみを取得します。
ntfsまたはvfatファイルシステムのいずれかを使用して、それぞれをマウントしてみてください。マウントされたパーティションにWindowsアプリによって保存された情報が含まれているかどうかを確認します。
Windowsアプリによって書かれた必要な情報を見つけたら、実際に一致させます。/ proc / componentsで見つかった各パーティションについて、ドライブのシリアル番号(HDIO_GET_IDENTITY syscallを介して)、ブロック数(/ proc / componentsから)、およびドライブオフセット(/ sys /blocks/drive_path/partition_name/start)を取得します。これをWindowsと比較します。情報とこれが一致する場合-Linuxデバイス名と一緒にWindowsドライブ文字を保存します。
このスキームにはいくつかの問題があります。
これは醜いです。Windowsでデータを書き込み、それをLinuxで読み取ると、テストが悪夢になります。
Linuxデバイスのメジャー番号は、IDEまたはSCSIデバイスとのみ比較されます。これはおそらく失敗します。つまり、USBまたはFireWireディスクでは失敗します。これらのタイプのディスクを追加することは可能ですが、アプリを可能なデバイスの既知のサブセットのみに制限することは、かなり悪い考えのようです。
HDIO_GET_IDENTITYはIDEおよびSATAドライブでのみ機能するようです。
/ sys / blockハックは、IDEまたはSATAドライブ以外では機能しない場合があります。
このスキーマを改善する方法について何かアイデアはありますか?おそらく、Windowsアプリにすべてのデータを書き込まずにWindows名を決定する別の方法がありますか?
PSアプリの言語はC++です。これは変更できません。