Espero ter postado isso no lugar certo, se ainda não o fiz, por favor me avise sobre onde mover o post.
Eu tentei decifrar a saída do kpartx sozinho, mas agora estou meio preso e precisando de orientação. Tenho falta de conhecimento em muitas áreas e estou tentando melhorar, daí a decifração. Vou postar meu problema e minhas descobertas até agora e espero que alguém aqui possa poupar parte de seu tempo em me guiar na minha solução de problemas / decifração.
O problema
[root@hostname ~]# kpartx -l /dev/mapper/mpathcg
mpathcg1 : 0 673171632 /dev/mapper/mpathcg 63
Esse número aqui é o meu problema: 673171632. Tanto quanto eu sei, e também de acordo com esta resposta link . Esse número deve representar o número de blocos desse dispositivo em particular.
[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.
Mas olhando para a saída do fdisk, que eu confio por experiência, o número de blocos para este dispositivo é 336585816. Para mim, temos uma inconsistência aqui. Como confio em fdisk por experiência, fiquei curioso sobre como o kpartx encontra o número de blocos e, em seguida, talvez veja o fdisk e veja como eles diferem uns dos outros. Então aqui é onde a "decifração" começou.
A pergunta atual
Na verdade, estou aqui para orientação, mas na tentativa de seguir as diretrizes deste fórum e ajudar qualquer outra pessoa a se perguntar a mesma coisa:
How does kpartx determine it's output, in particular the number of
blocks?
Minhas descobertas até agora
Minha descoberta número um: sou péssimo ao ler o código C ...
kpartx / kpartx.c:
printf("%s%s%d : 0 %" PRIu64 " %s %" PRIu64"\n",
mapname, delim, j+1,
slices[j].size, device,
slices[j].start);
}
Para mim, parece que essa estrutura chamada slice (s) tem um elemento (ou seja qual for o termo), chamado size. Esse é o tamanho de uma partição em blocos. Qual é o resultado da saída para stdout. No entanto, não entendo como é preenchido com números reais.
kpartx / kpartx.h
struct slice {
uint64_t start;
uint64_t size;
int container;
int major;
int minor;
};
Isto é o que a estrutura parece. Que parece corresponder ao que o kpartx produz.
kpartx / kpart.c:
typedef int (ptreader)(int fd, struct slice all, struct slice *sp, int ns);
...
...
...
extern ptreader read_dos_pt;
Estes também parecem interesantes, baseando-me no nome read_dos_pt, uma vez que a partição em questions é uma partição e aquele ptreader parece usar o slice struct. Talvez para povoar isso?
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);
Aqui eu noto a função getblock, que para mim parece óbvia para o que estou procurando. Mas olhando para a função getblock em kpartx / kpartx.c eu me perco e confuso.
Qualquer ajuda que eu puder receber será apreciada. Obrigado pelo seu tempo.