Decifrando a saída do kpartx

1

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.

    
por Mårten Olsson 21.09.2017 / 11:51

1 resposta

1

Não tenho certeza de quão relevante isso é para o serverfault, mas vou desmontá-lo de qualquer maneira.

Ignora o getblock passado em read_dos_pt. Parte interessante está na linha 97. sp[i].size = sector_size_mul * le32_to_cpu(p.nr_sects); sector_size_mul é o número de setores de 512 bytes em um setor nativo para esse disco (por exemplo, 4k discos teriam sector_size_mul de 8). Provavelmente, isso será 1, especialmente se for um arquivo que você está pesquisando.

p.nr_sects está sendo preenchido diretamente a partir da tabela de partições no disco dos usando o memcpy. O wiki do osdev tem uma boa descrição do formato de partição tabular , assim você pode ver que o campo da estrutura nr_sects é um uint32_t começando pelo byte 12 da entrada da partição (cf. dos.h offset de partition.nr_sects).

Assim, o que o kpartx está colocando nesse campo é "o número de setores de 512 bytes na partição, independentemente do tamanho do setor nativo".

Voltando à sua saída do fdisk, é muito claro em blocos de 1k.

Divida seu tamanho de byte por 1024 e você obterá o número 336585816 que está vendo no fdisk, mas divida por 512 e verá o que o kpartx mostra para você.

    
por 21.09.2017 / 12:21