問題

私はいくつかの段階でLinux環境で低レベルのディスク操作を実行するアプリケーションを書いています。アプリは実際には2つの部分で構成され、1つはWindows上で実行され、ユーザーとやりとりし、もう1つはLiveCDから実行されるLinux部分です。ユーザーはWindowsドライブ文字を選択し、Linux部分は対応するパーティションでアクションを実行します。問題は、Windowsドライブ文字(C:など)とLinuxデ

  • Windows のパーティション情報(ドライブ文字、ブロック数、ドライブシリアル番号など)をあらかじめ定義された場所(つまり、システムパーティションのルート)に保存します。

  • /proc/partitions からパーティションのリストを読んでください。

  • ntfs または vfat ファイルシステムでそれぞれをマウントしてみてください。

  • Windowsアプリケーションによって書かれた必要な情報を見つけると、実際に一致します。 / proc/partitionsにある各パーティションに対して、ドライブシリアル番号(HDIO_GET_IDENTITYシステムコール経由)、ブロック数(/ proc/partitionsから)、ドライブオフセット数(/ sys/blocks/drive_path/partition_name/sta

このスキームにはいくつかの問題があります:

  • これは醜いです。 Windowsでデータを書き込んでLinuxで読むと、テストが悪夢になります。

  • Linuxデバイスのメジャー番号は、IDEまたはSCSIデバイスとのみ比較されます。これはおそらく失敗します。つまり、USBまたはFireWireディスクです。これらのタイプのディスクを追加することは可能ですが、アプリを既知のデバイスのサブセットのみに制限することはむしろ悪い考えです。

  • HDIO_GET_IDENTITYはIDEとSATAドライブでのみ動作します。

  • /sys/block は IDE や SATA ドライブ以外では動作しないかもしれません。

このスキーマを改善する方法に関するアイデアはありますか?おそらく、Windowsアプリケーションにすべてのデータを書き込まずにWindows名を決定する別の方法がありますか?

P.S.アプリの言語はC ++です。私はこれを変更することはできません。

  ベストアンサー

パーティションにはUUIDが関連付けられています。私はWindowsでこれらを見つける方法を知らないが、Linuxでは各パーティションのUUIDを見つけることができる:

sudo vol_id -uデバイス(例:/ dev/boxora1)

Windowsに等価関数がある場合は、選択したパーティションに対してUUIDを格納するだけで、Linuxのすべての既知のパーティションを繰り返し処理し、UUIDと一致させることができます。

編集:これはlinux-onlyのものかもしれません、そして、それは何かからこれらを生成するボリッドutilであるかもしれません(ドライブのmeta-dataを読み取る代わりに)。それを言ったことで、ボリッドのソースを取得し、それが何をするかをチェックアウトするのを止めるものはありません。

  同じタグがついた質問を見る

c++linuxdrives