(g)parted
以下是我使用或命令得到的信息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
是否有基于系统调用或文件系统(/sys/block 等)的信息可用于了解分区是否是扩展/主分区以及 sda2 下的层次结构 sda5 等?如果是,有没有办法知道所选扩展分区下是否有哪些逻辑分区?
我想避免解析命令的输出。我尝试阅读 fdisk 的代码,但它太复杂了,我无法理解。
编辑1:阅读评论和答案后,我开始知道我不知道MBR/GPT等。所以,我决定阅读有关MBR和EBR内部结构的内容https://thestarman.pcministry.com/asm/mbr/PartTables2.htm#ebr并编写了一段代码来获取磁盘的分区详细信息。
答案1
这个问题没有很好的定义。
如果磁盘使用 GPT 进行格式化,则不存在扩展分区,因此不存在层次结构。
如果磁盘使用 MBR 进行格式化,以便 Microsoft 操作系统可以访问它,则最多有 1 个扩展分区,总共最多有 4 个主分区和扩展分区。它们的名称格式为 /dev/sdf[0-3]。如果有任何逻辑分区,它们的分区号将大于 4。为了拥有逻辑分区,您必须有一个扩展分区来容纳它们。
不过,并没有要求Linux系统最多有一个扩展分区,也没有什么非扩展分区不能重叠的说法,只要你不使用它们即可。
因此,特别是您可以让分区 1 成为一个较小的引导分区,分区 2 覆盖分区 1 中不存在的所有内容,分区 3 覆盖分区 2 的前半部分并且属于“扩展”类型,分区 4 是分区 2 的后半部分。分区 2。在分区 3 中,您可以有分区 5 和 6,各占分区 3 的一半。只要您实际上没有尝试使用分区 2,这一切都可以正常工作。但是,分区 5 和 6 都在分区 2 中3,所以“层次结构”不是DAG(有向无环图),所以“客户需求”不能满意。
我对此类客户的建议是将费用加倍。
主分区/扩展分区的“类型”记录在 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了解更多信息。
这样你就可以看到是否有扩展分区(本例中是第二个),然后你就知道其中有数字大于 4 的分区。
答案2
当使用MBR分区方式时sd*[1-4]
,Linux为主分区保留前 4 个分区槽(例如)。为了拥有逻辑分区,这 4 个分区之一需要用作扩展分区。然后逻辑分区将始终从插槽 5 开始出现。
MBR 分区磁盘通常应该有不超过一个扩展分区:如果有两个或多个扩展分区有自己的逻辑分区链,我认为正确的做法可能是显示一个大警告而不继续更进一步,因为不同的操作系统对于如何解析它可能有不同的想法。
在您指定的位置/sys/block/sda/sda2/start
,您应该找到一个扩展分区引导记录 (EPBR)它本质上是 MBR 的精简版本。它的第一个分区表条目应该标识第一个逻辑分区的开始和大小。如果还有更多逻辑分区,则 EPBR 中的第二个分区条目将指向另一个 EPBR,依此类推。要全面分析磁盘布局,您可能需要遍历 EPBR 链。
答案3
听起来你只是想要parted -l
。以下是我在具有 MBR 表和扩展分区的系统之一上得到的结果:
$ 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)。