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

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

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

Эта проблема

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

Этот номер прямо здесь - моя проблема: 673171632. Насколько я знаю, а также согласно этому ответу /questions/38886/kpartx-podrobnaya-informatsiya-chto-eto-znachit/38892#38892. Этот номер должен представлять количество блоков данного конкретного устройства.

[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 определяет вывод, в частности количество блоков?

Мои выводы пока

Моя первая находка: я ужасно читаю код С...

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 ответ

Решение

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

Пропустить getblock в read_dos_pt. Интересная часть на линии 97. sp[i].size = sector_size_mul * le32_to_cpu(p.nr_sects);sector_size_mul это число 512-байтовых секторов в одном собственном секторе для этого диска (например, 4k-диски будут иметь 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.

Другие вопросы по тегам