Linux 内核分区扇区大小(以字节为单位)的记录大小

Linux 内核分区扇区大小(以字节为单位)的记录大小

我的主要问题是权威地查看扇区中使用的块大小是否计数:

/sys/block/<disk>/<partition>/size

实际上是 512 B,或者这可能会有所不同。

我认为这很容易找到答案,但例如这里:

https://lore.kernel.org/lkml/[电子邮件保护]/T/#u

有人问:

There are /sys/block/<device>/size and 
/sys/block/<device>/<device><partition>/size.

But these values are reported in sectors, not in bytes. As discs with 4K 
sectors are on the horizon now, I don't want to make wrong assumptions on the 
sector size.

So what is the correct sector size for /sys/block/<device>/size?

并且在文档中提供了一个补丁,显然可以一劳永逸地回答文档中的这个问题: https://lore.kernel.org/lkml/[电子邮件保护]/T/

由于其含义 13 年来从未改变,我希望将这些属性形式化,以便用户可以依赖它[1][2]。扇区定义受到 block/stat.txt 文档的启发。

使用补丁:

diff --git a/Documentation/ABI/testing/sysfs-block   b/Documentation/ABI/testing/sysfs-block
+What:      /sys/block/<disk>/<partition>/size
+Date:      October 2002
+Contact:   [email protected]
+Kernel Version:    2.5.43
+Description:
+       Size of the partition in standard UNIX 512-byte sectors
+       (not a device-specific block size).

这一切看起来都很简单,但是当我查看当前现有的文档时: https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-block

没有这个补丁的存在。这是否意味着,事实上这个看似简单的问题可能并不简单?

有人可以指出这个问题的真正权威答案吗,最好使用内核文档或带有注释的代码?

目前我依赖于工具的输出,但如果它实际上不总是 512B,那么输出可能会有误,这会导致我正在处理的代码在某些情况下也会出现错误。

我很惊讶找到一个真正权威的答案竟然如此困难,

https://unix.stackexchange.com/questions/52215/determine-the-size-of-a-block-device

/proc/partitions 中的大小单位没有意义

其中一些指向此处的补丁,但似乎没有人意识到该补丁似乎尚未被接受,尽管它似乎已被签署,但据我所知它并不在文档代码中。

如果我们能够一劳永逸地确定内部内核代码到底在做什么,并且这种行为是否有记录,或者仅仅是假设,那就太好了,这意味着理论上它可以随时随机改变。

答案1

Linux源代码注释:

Linux 始终认为扇区长度为 512 字节,与设备实际块大小无关

也就是说,我认为扫描/sys/block/<disk>/是获取磁盘和分区大小的最糟糕(或至少最难)的方法:

  • lsblk --bytes --list产生信息丰富、无歧义且可解析的输出;
  • cat /proc/partitions给出类似的信息1K 大小的块
  • blockdev --getsize64 <dev>以字节为单位返回设备大小;
  • blockdev --getsz <dev>返回设备尺寸512 字节扇区
  • ...肯定还有其他方法我现在不记得了......

相关内容