像 fdisk -l 这样的命令如何找到扇区大小?

Joh*_*n P 6 linux hard-disk cluster command disk

磁盘的 MBR 是否包含此信息,因此当我调用 fdisk 之类的命令时,内核级代码最终会运行并从 MBR 中的特定部分读取它?如果有,是哪一部分?什么抵消?

如果它不在MBR中,那么这些类型的命令如何找到它?他们不能从分区的开头读取它,因为他们需要计算该分区的起始地址并且他们需要扇区大小来这样做,不是吗?

如何fdisk实现命令来查找这些信息?他们从哪里读到的?

Ste*_*itt 8

设备的扇区大小不存储在 MBR 中。

用户空间命令,例如fdisk使用BLKBSZGETBLKSSZGET ioctls 从磁盘检索扇区大小。这些ioctls 由内核中的驱动程序处理,它从驱动器本身检索相关信息。

(相关ioctl的文档不多,你需要查看内核源代码。)

您可以使用其他直接查询驱动器的工具查看相关信息,例如hdparm。在小型 SSD 上,hdparm -I告诉我

[...]
Logical  Sector size:                   512 bytes
Physical Sector size:                   512 bytes
Logical Sector-0 offset:                  0 bytes
[...]
cache/buffer size  = unknown
Form Factor: 2.5 inch
Nominal Media Rotation Rate: Solid State Device
[...]
Run Code Online (Sandbox Code Playgroud)

在具有 4K 扇区的大型旋转磁盘上,我得到了

[...]
Logical  Sector size:                   512 bytes
Physical Sector size:                  4096 bytes
Logical Sector-0 offset:                  0 bytes
[...]
cache/buffer size  = unknown
Form Factor: 3.5 inch
Nominal Media Rotation Rate: 5400
[...]
Run Code Online (Sandbox Code Playgroud)