ブロックデバイスノードをマウントされたディレクトリにどのように(簡単に)マップできますか?

ブロックデバイスノードをマウントされたディレクトリにどのように(簡単に)マップできますか?

ディスクブロックデバイス名とパーティション番号のみが指定されている場合は、ファイルシステム(Linux)で使用されているスペースをCまたはC ++で見つける必要があります。

ほとんどのファイルシステムでは、次のことができます。

  • 開発者名/dev/<block><part>または/dev/<block>p</part>既存の名前を作成してください。
  • デバイスを検索し/proc/mountsてマウントポイントを取得します。
  • statvfs()このマウントポイントで使用

やや冗長に見えるかもしれませんが、これで十分です。ただし、次の注意事項があります。

私のルートディレクトリは/dev/root実際のブロックデバイス名からマウントされます。それ以外の場合/dev/root- ノードは存在しません。これで、デバイスIDを/dev/<whatever>使用してプライマリ番号/マイナー番号で除算し、エントリを見つけてstat("/"...)ブロック名で逆参照してデバイスIDを取得できます。/sys/dev/block/<maj>:<min>/ueventDEVNAME=

完全に一般的な関数として保持すると、メソッドは次に拡張されます。

  1. 正しいデバイス名/dev/<block><part>または/dev/<block>p<part>存在する名前を設計してください。
  2. 各項目に対して、次の操作を行います/proc/mounts
    1. マウントポイントの抽出
    2. メジャー/マイナーペアのインポートstat()
    3. 親デバイス名の検索/sys/dev/block/<maj>:0/uevent
    4. デバイス名をブロックデバイス名と比較し、サブデバイス名をパーティション番号と比較します。
    5. 一致すると、使用されたスペースを取得します。statvfs()

今、その言葉は長すぎて気に入らない。はい、それはうまくいきますが、理想的ではありません。

それでは、これを行うためのより簡単なインターフェースがありますか?カーネルのマウントテーブルと直接対話するには?マウントされたファイルシステムごとに、構造のブロックデバイス(基本/部)とマウントされたパス(およびその他の情報)を取得する方法はありますか?

機能があると知っていますが、mount()機能がumount()ありますか?"tell me what is mounted"()

ベストアンサー1

私の最初の意見は、あなたが言うすべては、あなたが興味のあるデバイスのファイルシステムが現在マウントされている場合にのみ機能するということです。しかし、私はあなたがこれを知っていて、この制限を受け入れると思います。

あなたが提案した方法は非常に徹底的に見え、すべての状況を捉えると思います。

IP検索情報/sys/dev/block

  • あなたはあなたが探していると言うものを探しているわけではありません<maj>:0。あなたが探している<major>:<minor>
  • 見つからない状況に備えてください。一部のファイルシステム(たとえば/proc、およびタイプtmpfs)にはnfs接続されているデバイスがありません。目的のブロックデバイスと一致しない可能性が高いため、無視する必要があります。

デバイス名を探すときはスキャンしないでください/sys/dev/block/<major>:<minor>/uevent。代わりに、areadlink()自体/sys/dev/block/<major>:<minor>は結果のデフォルト名を取得します。同じ結果が得られますが、よりクリーンで効率的です。

複数のデバイスを探している場合は、/proc/mounts検索/sys全体を一度だけスキャンして実行し、次のデバイス検索の結果をキャッシュする必要があります。

show_me_mounts()システムコールがありません。 Linuxではこれが/proc/mounts目的です。しかし、ご存知のように、それは完璧ではありません。通常、/dev/root完全に近代的なinitramfsベースのブートを使用すると、仮想/存在しない問題は表示されません。

編集する要件に応じて、各パーティションに対応するディスク全体を見つけます。

特定の「内部」ブロックデバイス(=パーティション)の「外部」ブロックデバイス(=ディスク全体)を取得するにはできないマイナー番号を0に変更するだけです。

メジャー8とマイナー1を見つけたら、正しい方法は次のファイルを見ることです。

/sys/dev/block/8:1/../dev

これは作成されますが、8:0セカンダリデバイスIDが常にゼロになる可能性があると誤って仮定するわけではありません。

開こうとすると、ENOENTそのブロックデバイスの種類に内部/外部レイヤがないか、セカンダリデバイスIDが内部デバイスと一致しないためです。

おすすめ記事