如何在 Linux 中检查分区是扩展分区还是主分区

如何在 Linux 中检查分区是扩展分区还是主分区

(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)。

相关内容