/proc/partitions 和 /sys/dev/block/ 中的值是什么单位/尺寸?

/proc/partitions 和 /sys/dev/block/ 中的值是什么单位/尺寸?

我有来自 Android 设备的示例 emmc 块信息

/proc/partitions

major minor  #blocks  name
 179    1    5120    mmcblk0p1

凭借我的一点智慧,我假设/proc/partitions使用块,因为它说分区 1 有 5120 个块

/sys/dev/block/179:0/mmcblk0p1/size

10240

/sys/…/size 中的分区值似乎是 /proc/partitions 值的两倍。那么为什么它们不同以及它们的单位是什么?

答案1

/proc/partitions显示 1024 字节块的大小。

/sys/dev/block/*/*/size显示 512 字节扇区的大小。

两者都与设备的逻辑/物理块/扇区大小无关。


首先,您可以查看proc(5)联机帮助页:

/proc/partitions

包含每个分区的主编号和次编号以及 1024 字节块的数量和分区名称。

对于第二,它当然应该被记录下来某处但你也可以直接查看Linux源代码block/partition-generic.c

ssize_t part_size_show(struct device *dev,
                       struct device_attribute *attr, char *buf)
{
        struct hd_struct *p = dev_to_part(dev);
        return sprintf(buf, "%llu\n",(unsigned long long)part_nr_sects_read(p));
...
static DEVICE_ATTR(size, 0444, part_size_show, NULL);

/proc/partitions以及它与生成信息的代码有何关系block/genhd.c

static int show_partition(struct seq_file *seqf, void *v)
{
        ...
        while ((part = disk_part_iter_next(&piter)))
                seq_printf(seqf, "%4d  %7d %10llu %s\n",
                           MAJOR(part_devt(part)), MINOR(part_devt(part)),
                           (unsigned long long)part_nr_sects_read(part) >> 1,
                           disk_name(sgp, part->partno, buf));
        disk_part_iter_exit(&piter);
...
static const struct seq_operations partitions_op = {
        ...
        .show   = show_partition

两者都使用which 来表示被除以 2part_nr_sects_read()的情况(使用)。/proc/partitions>> 1

part_nr_sects_read()检索nr_sects的字段struct hd_struct,该字段始终位于 512 字节扇区中,无论设备的扇区/块大小如何。例如,您可以查看如何drivers/block/nbd.c使用字节大小除以 512 的set_capacity()函数(设置相同的字段)(使用):nr_sects>> 9

static void nbd_size_update(struct nbd_device *nbd)
{
        ...
        set_capacity(nbd->disk, config->bytesize >> 9);

相关内容