Надеюсь, я разместил это в нужном месте, если я не сделал этого Тогда, пожалуйста, посоветуйте мне, куда переместить сообщение.
Я сам пытался расшифровать вывод 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, я теряюсь и сбиваюсь с толку.
Любая помощь, которую я могу получить, будет оценена. Спасибо за ваше время.
Не уверен, насколько это актуально для 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.