(g)parted
以下は、orコマンドを使用して取得した情報ですfdisk
。
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 196265983 196263936 93.6G 83 Linux
/dev/sda2 196268030 229468159 33200130 15.9G 5 Extended
/dev/sda5 196268032 229468159 33200128 15.9G 82 Linux swap / Solaris
パーティションが拡張/基本であり、sda2の下の階層がsda5などであることを確認するために使用できるsyscallまたはファイルシステム(/sys/blockなど)ベースの情報はありますか?それでは、選択した拡張パーティションの下に論理パーティションがあるかどうかを知る方法はありますか?
コマンド出力を解析しないでください。 fdiskのコードを読んでみましたが、理解するのは複雑すぎました。
編集1:コメントと回答を読んだ後、MBR / GPTなどについて知らないことがわかりました。そこでMBRとEBRの内部構造について読むことにしました。https://thestarman.pcministry.com/asm/mbr/PartTables2.htm#ebrディスクのパーティションの詳細を取得するコードを書きました。
ベストアンサー1
問題は明確に定義されていません。
ディスクがGPTでフォーマットされている場合、拡張パーティションがないため、階層もありません。
MicrosoftオペレーティングシステムからアクセスできるようにディスクがMBRとしてフォーマットされている場合は、最大1つの拡張パーティション、合計4つのプライマリパーティション、および拡張パーティションがある可能性があります。その名前は /dev/sdf[0-3] 形式です。論理区画がある場合、その区画番号は4より大きいです。論理区画を持つには、それを保持する拡張区画が必要です。
ただし、Linuxシステムには最大1つの拡張パーティションが必要である必要はありません。拡張パーティションを使用しない限り、非拡張パーティションが重複することはできません。
したがって、特にパーティション1をより小さなブートパーティションにし、パーティション2はパーティション1にないすべてをカバーし、パーティション3はパーティション2の前半を覆って「拡張」タイプになり、パーティション4はパーティションにすることができます。 2後半。パーティション2.パーティション3には、それぞれパーティション3の半分を占めるパーティション5と6があります。実際には、パーティション2を使用しない限り、これはすべてうまくいきます。ただし、パーティション 5 と 6 は両方ともパーティション 2 3 にあるため、「階層構造」は DAG (方向性非循環グラフ) ではないため、「顧客要件」できない解く。
そのような顧客に私が与えるアドバイスは、手数料を2倍に増やすことです。
基本/拡張パーティションの「タイプ」はMBRに文書化されているため、同様のコードを使用してdd bs=1 skip=446 count=64 if=/dev/sdf | hexdump -C
次のようなものを取得できます。
00000000 00 20 21 00 83 df 13 0c 00 08 00 00 00 20 03 00 |. !.......... ..|
00000010 00 df 14 0c 05 19 0d cc 00 28 03 00 00 e0 2e 00 |.........(......|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 19 0e cc 83 15 50 05 00 08 32 00 00 f8 0d 00 |......P...2.....|
5番目のバイト(83、05、00、83)を選択して4つの値を取得できます。拡張パーティションの一般的な「タイプ」は05ですが、0fと85も使用されます。バラよりhttps://www.win.tue.nl/~aeb/partitions/partition_types-1.htmlより多くの情報を知りたいです。
これにより、拡張パーティション(この場合は2番目のパーティション)があることを確認し、数字が4より大きいパーティションがあるかどうかを確認できます。