(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より大きいパーティションがあるかどうかを確認できます。
答え2
MBRパーティショニング方式を使用する場合sd*[1-4]
、Linuxはデフォルトパーティション用に最初の4つのパーティションスロットを予約します(例:)。論理区画を持つには、これら4つの区画のうちの1つを拡張区画として使用する必要があります。これにより、論理区画は常にスロット5から表示されます。
MBRパーティションディスクには通常、1つ以上の拡張パーティションが必要です。独自の論理パーティションチェーンを持つ2つ以上の拡張パーティションがある場合は、大きな警告を表示し、それ以上進行しないことが正しいアクションであると思います。オペレーティングシステムの解析方法の考え方が異なる場合があります。
指定した場所で/sys/block/sda/sda2/start
以下を見つける必要があります。EPBR(拡張パーティションブートレコード)本質的にMBRのシンプルなバージョンです。最初のパーティション表エントリーは、最初の論理区画の始まりとサイズを識別する必要があります。より多くの論理区画がある場合、EPBRの2番目の区画項目は別のEPBRを指します。ディスクレイアウトを完全に分析するには、EPBRチェーンをナビゲートする必要があるかもしれません。
答え3
あなたはそれをしたいと思いますparted -l
。 MBRテーブルと拡張パーティションを持つシステムの1つから得たものは次のとおりです。
$ sudo parted -l
Model: ASMT ASM1156-PM (scsi)
Disk /dev/sda: 1500GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 32.3kB 10.5GB 10.5GB primary ntfs boot
3 10.5GB 1500GB 1490GB primary ext4
Model: ASMT ASM1156-PM (scsi)
Disk /dev/sdb: 2000GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 1963GB 1963GB primary ext4 boot
2 1963GB 2000GB 37.7GB primary ext4
Model: SD USD (sd/mmc)
Disk /dev/mmcblk0: 16.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 4194kB 1686MB 1682MB primary fat32 lba
2 1686MB 16.0GB 14.3GB extended
5 1686MB 1720MB 33.6MB logical ext4
6 1720MB 1792MB 72.4MB logical fat32 lba
7 1795MB 16.0GB 14.2GB logical ext4
これは、パーティションがプライマリパーティションか拡張パーティションか、論理パーティション(拡張パーティションで作成されたパーティション)であるかを明確に示しています。別の有用なコマンドは、lsblk
同じシステムから印刷することです。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1.4T 0 disk
├─sda1 8:1 0 9.8G 0 part
└─sda3 8:3 0 1.4T 0 part /media/pi/movies
sdb 8:16 0 1.8T 0 disk
├─sdb1 8:17 0 1.8T 0 part /media/pi/bigboy
└─sdb2 8:18 0 35.2G 0 part
mmcblk0 179:0 0 14.9G 0 disk
├─mmcblk0p1 179:1 0 1.6G 0 part
├─mmcblk0p2 179:2 0 1K 0 part
├─mmcblk0p5 179:5 0 32M 0 part
├─mmcblk0p6 179:6 0 69M 0 part /boot
└─mmcblk0p7 179:7 0 13.2G 0 part /
ここでは、サイズが無視できるようにパーティションが拡張されていることがわかります(mmcblk02
拡張パーティション、1Kで示されています)。