lsblk 和 fdisk 如何显示同一分区的不同大小?

lsblk 和 fdisk 如何显示同一分区的不同大小?

我正在运行 virtualbox 虚拟机,我可以看到 /dev/sda2 的大小在两个输出中显示不同。另外,在 fdisk 的输出中,/dev/sda2 和 /dev/sda5 似乎重叠

~$ lsblk /dev/sda
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0 29.3G  0 disk 
├─sda1   8:1    0  512M  0 part /boot/efi
├─sda2   8:2    0    1K  0 part 
└─sda5   8:5    0  9.5G  0 part /

~$ sudo fdisk -l /dev/sda
Disk /dev/sda: 29.3 GiB, 31457280000 bytes, 61440000 sectors
Disk model: VBOX HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x8f66391d

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sda1  *       2048  1050623  1048576  512M  b W95 FAT32
/dev/sda2       1052670 20969471 19916802  9.5G  5 Extended
/dev/sda5       1052672 20969471 19916800  9.5G 83 Linux

答案1

sda2分区是容器分区。它的格式与磁盘非常相似主引导记录(MBR)并被称为扩展引导记录(EBR),本身占用四个可能的主分区插槽之一。它的存在是为了克服 MBR 中 4 个分区的历史限制。它内部包含扩展分区(在 Linux 中从分区 5 开始显示)并相互链接:每个扩展分区还具有一个 EBR,其中包含两个条目:一个用于引用分区的数据本身,另一个用于引用下一个扩展分区的 EBR如果有的话。所有扩展分区(所以这里sda5)都是里面它们的容器分区(此处sda2),因此 fdisk 将始终报告重叠块。

来自膜生物反应器从我的角度来看,它使用了为在其中添加扩展分区而保留的所有空间,因此它的大小必须大于所有扩展分区的大小。

从向用户空间报告的内核 API 的角度来看lsblk,分区 2 只是出于礼貌而显示的粘合分区,不应被篡改。报告的数据大小只是 EBR 开销,此处为 1K,否则对分区 2 的读取或写入(这已经很糟糕,因为它可能会破坏到其中所有扩展分区的初始链接)也将允许对分区 5 进行读取或写入。即使选择报告大小为 0,也没有多大关系。这与sda代表整个磁盘的自身处理不同。当您考虑到更多扩展分区是从每个先前扩展分区的 EBR 链接时,这是有道理的:它们的内部 EBR 甚至不可用,只能看到它们的实际数据。

你应该考虑使用GPT分区而不是 MBR/EBR 分区:这是一种现代的分区方案,更加明智,并且没有此类限制和解决方法。或者你也可以选择左心室容量在一个(主要的,不需要扩展的)分区中:这也是一种用于在不同抽象层对块进行分区的容器形式,并提供了很多功能。

相关内容