Filesystems
/proc/partitions 和 /sys/dev/block/<block>/size 中的值是什麼單位?
我有一個來自 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) >> 1, disk_name(sgp, part->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>> 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);