![硬盘分区的单位是什么?](https://linux22.com/image/144740/%E7%A1%AC%E7%9B%98%E5%88%86%E5%8C%BA%E7%9A%84%E5%8D%95%E4%BD%8D%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我知道分区表的单位是扇区。但它的大小是物理扇区大小还是逻辑扇区大小呢?
当逻辑扇区大小与物理扇区大小不同时,Linux内核和分区工具如何处理分区大小,因为分区表中的数字总是记录为扇区数。
答案1
正如你所看到的,例如维基百科,GPT 中的条目是 LBA(逻辑块地址)。这些是基于逻辑扇区大小的地址。
当硬盘开始具有不同(更大)的物理扇区大小时,供应商将旧的物理扇区大小保留为逻辑扇区大小,以帮助旧系统使用新硬盘。这意味着硬盘固件包含可以处理逻辑扇区读取和写入的代码:对于读取,它将读取正确的(较大的)物理扇区并仅返回其中的一部分。对于写入,它将首先读取(较大的)物理扇区,然后修改其中的一部分,然后将其移回。
除非读取和写入发生在与物理扇区的起始位置相对应且长度是物理扇区的倍数的 LBA 处,否则这是低效的。
因此,内核处理大物理扇区的方式是尝试仅使用此类读取和写入。为此,分区必须是对齐正确(在物理扇区的边界上)。通常,分区程序将确保这种情况,并在您尝试以不正确的方式使用它们时打印警告。
内核不必这样做;即使不这样做,它也会起作用,但效率会降低。
编辑
用户态应用程序是否可以仅通过 /sys 读取逻辑扇区大小并读取分区表,然后将它们相乘以告诉用户分区有多大?
是的,用户态应用程序就是fdisk
这样做的(尽管我认为物理和逻辑扇区大小是 in /proc
,而不是 in /sys
,但我必须查找这一点)。
内核操作文件系统时,不需要知道底层存储的大小,只需要通过读取文件系统的元数据来知道文件系统结构的大小,对吗?
这有点困难:基本的内核单元是“页”(MMU单元),而特定文件系统的基本单元是“块”(有时是多个页)。内核只需要知道这与底层存储的逻辑块大小有何关系,因为计算 LBA 需要它。
但是当用户态访问 /dev/sda2 这样的原始分区设备时,内核需要知道分区的起始位置和大小,不是吗?
是的。这就是为什么它在创建诸如 之类的条目之前读取分区表/dev/sda2
。
当内核这样做时,它需要知道分区表中记录的数字单位是逻辑扇区大小,而不是物理扇区大小,对吗?
是的。