Расшифровка вывода kpartx

Надеюсь, я разместил это в нужном месте, если я не сделал этого Тогда, пожалуйста, посоветуйте мне, куда переместить сообщение.

Я сам пытался расшифровать вывод kpartx, но теперь я как бы застрял и нуждаюсь в помощи. Мне не хватает знаний во многих областях, и я пытаюсь улучшить, отсюда и расшифровка. Я опубликую свою проблему и свои выводы на данный момент, и я надеюсь, что кто-то здесь сможет уделить мне немного времени, помогая мне в устранении неполадок / расшифровке.

Проблема

[root@hostname ~]# kpartx -l /dev/mapper/mpathcg 
mpathcg1 : 0 673171632 /dev/mapper/mpathcg 63

Вот этот номер - моя проблема : 673171632. Насколько я знаю, а также согласно этому ответу https://serverfault.com/a/469734 . Это число должно представлять количество блоков этого конкретного устройства.

[root@hostname ~]# fdisk -l /dev/mapper/mpathcg

Disk /dev/mapper/mpathcg: 344.7 GB, 344671125504 bytes
255 heads, 63 sectors/track, 41903 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 32768 bytes / 32768 bytes
Disk identifier: 0xa5c9e23d

          Device Boot      Start         End      Blocks   Id  System
/dev/mapper/mpathcgp1               1       41903   336585816   8e  Linux LVM
Partition 1 does not start on physical sector boundary.

Но глядя на вывод fdisk, которому я доверяю по своему опыту, количество блоков для этого устройства составляет 336585816. На мой взгляд, здесь есть несоответствие. Поскольку я доверяю fdisk по опыту, мне было любопытно, как kpartx находит количество блоков, а затем, возможно, посмотреть на fdisk и посмотреть, чем они отличаются друг от друга. Итак, вот где началась «расшифровка».

Фактический вопрос

Я на самом деле здесь для руководства, но в попытке следовать этим правилам форума и помочь всем, кто задается вопросом о том же:

Каким образом kpartx определяет его вывод, в частности количество блоков?

Мои результаты на данный момент

Мой вывод номер один: я ужасно читаю код C ...

kpartx / kpartx.c:

            printf("%s%s%d : 0 %" PRIu64 " %s %" PRIu64"\n",
                   mapname, delim, j+1,
                   slices[j].size, device,
                   slices[j].start);
        }

Мне кажется, что эта структура называется slice ( s) имеет элемент (или как бы там ни было) с именем size. Это размер раздела в блоках. Это то, что выводится на стандартный вывод. Однако я не понимаю, как он заполняется реальными числами.

kpartx / kpartx.h

struct slice {
    uint64_t start;
    uint64_t size;
    int container;
    int major;
    int minor;
};

Так выглядит структура. Кажется, что это соответствует тому, что выводит kpartx.

kpartx / kpart.c:

typedef int (ptreader)(int fd, struct slice all, struct slice *sp, int ns);
...
...
...
extern ptreader read_dos_pt;

Они также кажутся интересными, я основываю это на имени read_dos_pt, поскольку раздел, о котором идет речь, является разделом dos, а этот ptreader, похоже, использует структура среза. Может быть, чтобы заполнить его?

kpartx / dos.c:

read_dos_pt(int fd, struct slice all, struct slice *sp, int ns) {
    struct partition p;
    unsigned long offset = all.start;
    int i, n=4;
    unsigned char *bp;
    uint64_t  sector_size_mul = get_sector_size(fd)/512;

    bp = (unsigned char *)getblock(fd, offset);

Здесь я заметил функцию getblock, которая мне кажется очевидной для того, что я ищу. Но, глядя на функцию getblock в kpartx / kpartx.c, я теряюсь и сбиваюсь с толку.

Любая помощь, которую я могу получить, будет оценена. Спасибо за ваше время.

1
задан 21 September 2017 в 12:51
1 ответ

Не уверен, насколько это актуально для serverfault, но я все равно разберу его.

Пропустить getblock в read_dos_pt. Интересная часть находится в строке 97. sp [i] .size = sector_size_mul * le32_to_cpu (p.nr_sects); sector_size_mul - количество 512-байтовых секторов в одном собственном секторе для этого диска (например, Диски 4k будут иметь сектор_размер_муль равным 8). Скорее всего, это будет 1, особенно если это исследуемый файл.

p.nr_sects заполняется непосредственно из таблицы разделов dos на диске с помощью memcpy. Вики osdev имеет красивое табличное описание формата раздела dos , так что вы можете видеть, что поле структуры nr_sects - это uint32_t, начинающийся с байта 12 записи раздела (см. Смещение dos.h раздела partition.nr_sects).

Таким образом, kpartx помещает в это поле «количество 512-байтовых секторов в разделе, независимо от размера собственного сектора».

Возвращаясь к выходным данным fdisk, он довольно ясно состоит из блоков размером 1 КБ.

Разделите размер байта на 1024, и вы получите число 336585816, которое видите в fdisk, но разделите на 512, и вы получите то, что показывает kpartx.

1
ответ дан 3 December 2019 в 23:25

Теги

Похожие вопросы