Filesystems

/proc/partitions 和 /sys/dev/block/<block>/size 中的值是什麼單位?

  • April 17, 2019

我有一個來自 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 值的兩倍。因此,為什麼它們不同,因此它們中的單位是什麼?

/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) &gt;&gt; 1,
                          disk_name(sgp, part-&gt;partno, buf));
       disk_part_iter_exit(&piter);
...
static const struct seq_operations partitions_op = {
       ...
       .show   = show_partition

兩者都使用part_nr_sects_read()which/proc/partitions除以 2 (with &gt;&gt; 1)。

part_nr_sects_read()檢索 的nr_sects欄位,該欄位struct hd_struct始終位於 512 字節扇區中,與設備的扇區/塊大小無關。例如,您可以查看如何drivers/block/nbd.c使用字節大小除以 512的set_capacity()函式(設置相同的欄位)(使用):nr_sects``&gt;&gt; 9

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

引用自:https://unix.stackexchange.com/questions/512945