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