Назад | Перейти на главную страницу

Расшифровка вывода 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);
        }

Мне кажется, что эта структура, называемая срезом (-ами), имеет элемент (или что-то в этом роде) с именем 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, я растерялся и запутался.

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

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

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

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

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

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

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