¿Por qué fdisk agrega a veces medio kibibyte?

¿Por qué fdisk agrega a veces medio kibibyte?

Estoy intentando particionar una imagen de disquete de 1440 KiB usando fdisk(util-linux, v2.31.1).

Sin embargo, la herramienta aparentemente está agregando un sector de 512 bytes, sin importar qué unidades use, y no puedo decirlo.por qué.


Esto es lo que hice:

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.

¡Vaya!1,5 KiB!?

Intenté usar el recuento de sectores y obtuve el mismo resultado:

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

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

Ahora, si uso un archivo lo suficientemente grande, fdiskse comporta de manera diferente con la primera notación:

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

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

No así con el segundo:

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

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

Es este el comportamiento esperado? Supongo que sí, pero ¿por qué?

Respuesta1

Sin embargo, la herramienta aparentemente agrega un sector de 512 bytes, sin importar qué unidades use,
...
Ahora, si uso un archivo lo suficientemente grande, fdisk se comporta de manera diferente con la primera notación:
...
¿Es este el comportamiento esperado?

Aparentemente sí, y parece ser un error del tipo "más uno".
Cuando especifica "+N" o "+" (en lugar de un número de sector absoluto) para last sector, la utilidad parece utilizar esta cantidad como el número de sectores en (o el tamaño de) la nueva partición, y agrega este número a el número del sector inicial.

En otras palabras, el cálculo adecuado debe ser

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

Pero aparentemente la empresa de servicios públicos no resta un sector de este total para ajustar elcontara undesplazamiento.

Cuando el tamaño de la nueva partición es pequeño (es decir, sólo dos sectores), entonces este error "más uno" es bastante obvio.
Es necesario inspeccionar el código fuente real para determinar por qué existe una correlación/dependencia en el tamaño disponible del dispositivo.

La solución a este aparente error es especificar explícitamente el último sector utilizando un número de sector.
Por ejemplo, si el sector inicial es 2048 y el tamaño de la partición debe ser de 1 KB, especifique el último sector como 2049.


Dado que este sector "adicional" está al final de la nueva partición, este problema no estaría relacionado con la alineación de la partición.
La alineación de la partición (y el cilindro/pista/sectores de protección) se aplicaría para modificar el inicio de una nueva partición.
Es decir, los sectores se reservarían "delante de" la nueva partición y no formarían parte de ninguna partición.
Esos sectores no estarían asignados, esencialmente se desperdiciarían y no podrían usarse (por ningún sistema de archivos).
La alineación no afecta el tamaño de la nueva partición.
El problema que usted describe se relaciona con el tamaño de la partición y no con su alineación.


Estoy intentando particionar una imagen de disquete de 1440 KiB

Se supone que los disquetes no deben estar particionados. Sólo hay un sector de arranque.
El MBR y la tabla de particiones son para discos duros (y SSD).


APÉNDICE

Aparentemente hay algún código enutil-linux-2.31.1/libfdisk/src/dos.cque intenta ajustar el final de la partición para que elpróximo¡La partición estará alineada!

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));
    }

Algunos resultados de depuración (es decir, una versión de la utilidad con la depuración habilitada) ayudarían a aclarar lo que está sucediendo.

información relacionada