
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, fdisk
ele 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.