web-dev-qa-db-ja.com

/ proc / partitionsと/ sys / dev / block / <block> / sizeの値はどの単位ですか?

Androidデバイスからのサンプルemmcブロック情報があります

/proc/partitionsから

major minor  #blocks  name
 179    1    5120    mmcblk0p1

私の小さな知性を使用して、パーティション1には5120ブロックがあると書かれているので、/proc/partitionsはブロックを使用すると想定しています。

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

10240

/ sys /…/ sizeのパーティション値は/ proc/partitionsの値の2倍のようです。したがって、なぜそれらは異なるので、両方のユニットは何ですか?

2
Bret Joseph

_/proc/partitions_は、1024バイトのブロックでサイズを示します。

_/sys/dev/block/*/*/size_は、512バイトのセクターでサイズを示します。

デバイスの論理/物理ブロック/セクターサイズに関係なく、両方。


1つ目は、proc(5)のマンページを参照してください。

_/proc/partitions_

各パーティションのメジャー番号とマイナー番号、および1024バイトブロックの数とパーティション名が含まれます。

2つ目は、確かに文書化する必要がありますどこかですが、_block/partition-generic.c_のLinuxソースコードを直接確認することもできます。

_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()を使用しており、_/proc/partitions_の場合は2で除算されます(_>> 1_を使用)。

part_nr_sects_read()は、_nr_sects_の_struct hd_struct_フィールドを取得します。これは、デバイスのセクター/ブロックサイズに関係なく、常に512バイトのセクターにあります。たとえば、_drivers/block/nbd.c_がset_capacity()関数(同じ_nr_sects_フィールドを設定する)をバイトサイズを512で割った値(_>> 9_を使用)でどのように使用するかを確認できます。 :

_static void nbd_size_update(struct nbd_device *nbd)
{
        ...
        set_capacity(nbd->disk, config->bytesize >> 9);
_
4
mosvy