Por que o fdisk às vezes adiciona meio kibibyte?

Por que o fdisk às vezes adiciona meio kibibyte?

Estou tentando particionar uma imagem de disquete de 1440 KiB usando fdisk(util-linux, v2.31.1).

No entanto, a ferramenta aparentemente adiciona um setor de 512 bytes, não importa quais unidades eu use, e não sei dizerpor que.


Isto é o que eu fiz:

Created a new DOS disklabel [...]

Command (m for help): n
[...]
First sector (1-2879, default 1): 2048
Last sector, +sectors or +size{K,M,G,T,P} (63-2879, default 2879): +1K

Created a new partition 1 of type 'Linux' and of size 1.5 KiB.

Uau!1,5 KiB!?

Tentei usar a contagem de setores, obtendo o mesmo resultado:

Last sector, +sectors [...]: +2

Created a new partition 1 of type 'Linux' and of size 1.5 KiB.

Agora, se eu usar um arquivo grande o suficiente, fdiskele se comporta de maneira diferente com a primeira notação:

First sector (2048-131071, default 2048): 2048
Last sector, [...]: +1K

Created a new partition 1 of type 'Linux' and of size 1 KiB.

Não é assim com o segundo:

Last sector, +sectors [...]: +2

Created a new partition 1 of type 'Linux' and of size 1.5 KiB.

Este é o comportamento esperado? Acho que sim, mas por quê?

Responder1

No entanto, a ferramenta aparentemente adiciona um setor de 512 bytes, não importa quais unidades eu use,
...
Agora, se eu usar um arquivo grande o suficiente, o fdisk se comporta de maneira diferente com a primeira notação:
...
Esse é o comportamento esperado?

Aparentemente sim, e parece ser um bug do tipo "mais um".
Quando você especifica "+N" ou "+" (em vez de um número absoluto de setor) para o last sector, o utilitário parece utilizar essa quantidade como o número de setores (ou o tamanho da) nova partição e adiciona esse número a o número do setor inicial.

Em outras palavras, o cálculo adequado deve ser

<last sector> = <start sector> + <sector count> - 1  

Mas aparentemente a concessionária negligencia subtrair um setor deste total para ajustar ocontarpara umdeslocamento.

Quando o tamanho da nova partição é pequeno (ou seja, apenas dois setores), então esse bug "mais um" é bastante óbvio.
O código-fonte real precisa ser inspecionado para determinar por que há uma correlação/dependência no tamanho disponível do dispositivo.

A solução alternativa para esse aparente bug é especificar explicitamente o último setor usando um número de setor.
Por exemplo, se o setor inicial for 2048 e o tamanho da partição for de 1K bytes, especifique o último setor como 2049.


Como esse setor “extra” está no final da nova partição, esse problema não estaria relacionado ao alinhamento da partição.
O alinhamento da partição (e cilindro/trilha/setores de proteção) seria aplicado para modificar o início de uma nova partição.
Ou seja, os setores seriam reservados “na frente” da nova partição, e não fariam parte de nenhuma partição.
Esses setores não seriam alocados, seriam essencialmente desperdiçados e não poderiam ser usados ​​(por nenhum sistema de arquivos).
O alinhamento não afeta o tamanho da nova partição.
O problema que você descreve está relacionado ao tamanho da partição e não ao seu alinhamento.


Estou tentando particionar uma imagem de disquete de 1440 KiB

Os disquetes não devem ser particionados. Existe apenas um setor de inicialização.
O MBR e a tabela de partições são para discos rígidos (e SSDs).


TERMO ADITIVO

Aparentemente há algum código emutil-linux-2.31.1/libfdisk/src/dos.cque tenta ajustar o final da partição para que opróximoa partição será alinhada!

static int add_partition(struct fdisk_context *cxt, size_t n,
             struct fdisk_partition *pa)
{
    ...

    if (isrel && stop - start < (cxt->grain / fdisk_get_sector_size(cxt))) {
        /* Don't try to be smart on very small partitions and don't align so small sizes */
        isrel = 0;
        if (stop > start)
            stop -= 1;
        DBG(LABEL, ul_debug("DOS: don't align end of tiny partition [start=%ju, stop=%ju, grain=%lu]",
            (uintmax_t)start,  (uintmax_t)stop, cxt->grain));
    }

    if (stop < limit && isrel && alignment_required(cxt)) {
        /* the last sector has not been exactly requested (but
         * defined by +size{K,M,G} convention), so be smart and
         * align the end of the partition. The next partition
         * will start at phy.block boundary.
         */
        stop = fdisk_align_lba_in_range(cxt, stop, start, limit);
        if (stop > start)
            stop -= 1;
        if (stop > limit)
            stop = limit;
        DBG(LABEL, ul_debug("DOS: aligned stop: %ju", (uintmax_t) stop));
    }

Alguma saída de depuração (ou seja, uma versão do utilitário com depuração habilitada) ajudaria a esclarecer o que está acontecendo.

informação relacionada