Estou usando o debootstrap para criar um rootfs para um dispositivo que desejo gravar em um arquivo de imagem. Para calcular o tamanho necessário dos meus rootfs, eu faço o seguinte:
local SIZE_NEEDED=$(du -sb $CHROOT_DIR|awk '{print $1}')
SIZE_NEEDED=$(($SIZE_NEEDED / 1048576 + 50)) # in MB + 50 MB space
dd if=/dev/zero of=$ROOTFS_IMAGE bs=1M count=$SIZE_NEEDED
Como você pode ver, estou deixando 50 MB de preenchimento além do que o dd
calcula que preciso.
Eu então crio o dispositivo de loopback, cria uma tabela de partição e um sistema de arquivos:
LO_DEVICE=$(losetup --show -f $ROOTFS_IMAGE)
parted $LO_DEVICE mktable msdos mkpart primary ext4 0% 100%
partprobe $LO_DEVICE
local LO_ROOTFS_PARTITION="${LO_DEVICE}p1"
mkfs.ext4 -O ^64bit $LO_ROOTFS_PARTITION
Parece que parted
tenta fazer algum alinhamento de setor (?), já que a partição não ocupa todo o disco virtual, mas perto o suficiente.
Eu, então, montei a nova partição e comecei a escrever arquivos. Mas então eu fiquei sem espaço em disco perto do fim!
mount $LO_ROOTFS_PARTITION $LO_MOUNT_POINT
cp -rp $CHROOT_DIR/* $LO_MOUNT_POINT
.....
cp: cannot create directory '/root/buildimage/rootfs_mount/var': No space left on device
Eu suspeito que isso é algum problema de conversão de tamanho de bloco ou talvez diferença entre MiB e MB? Porque até um certo tamanho de imagem, parece que tenho espaço suficiente com os 50MB de preenchimento. (Eu quero algum espaço livre na imagem por padrão, mas não muito). O tamanho da imagem não está desativado por um fator-de-dois, então há alguma fluência ou sobrecarga que é ampliada o tamanho da imagem fica maior e não tenho certeza de onde ela está vindo.
Para o contexto, aqui está o último que eu fiz e que não se encaixa:
# du -sb build/rootfs
489889774 build/rootfs
Ok, 489MB / 1024 ** 2 + 50MB = tamanho de imagem de 517MB. Então dd
se parecia com:
# dd if=/dev/zero of=build/rootfs.img size=1M count=517
517+0 records in
517+0 records out
542113792 bytes (542 MB, 517 MiB) copied, 2.02757 s, 267 MB/s
Confirmado em disco, parece um pouco maior:
# du -sb build/rootfs.img
542113792 build/rootfs.img
A partição é semelhante a:
# parted /dev/loop0 print
Model: Loopback device (loopback)
Disk /dev/loop0: 542MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 542MB 541MB primary ext4
e sistema de arquivos montado:
# df -h /dev/loop0p1
Filesystem Size Used Avail Use% Mounted on
/dev/loop0p1 492M 482M 0 100% /root/buildimage/build/rootfs_mount
Então, talvez haja sobrecarga no sistema de arquivos ext4, possivelmente para superblocos / journal / etc? Como posso explicar isso no meu cálculo de tamanho?
EDITAR:
Olhando para a sobrecarga do ext4, como esta pergunta do ServerFault .
Veja também as opções do mkfs.ext4 como -m
(reservado) e vários registros de diário e opções de inode. Em geral, se eu sei que há uma sobrecarga de 5% vindo do sistema de arquivos, posso fatorar isso facilmente.
EDIT # 2:
Pensando que du
pode estar subnotificando os requisitos reais de tamanho do disco (por exemplo, um arquivo de 10 bytes ainda ocupa um bloco de 4k, certo?) Tentei algumas outras opções:
# du -sb build/rootfs # This is what I was using
489889774 build/rootfs
# du -sm build/rootfs # bigger
527 build/rootfs
# du -sk build/rootfs # bigger-est
539088 build/rootfs
Além disso, a página manp para -b
observa que é um alias para --apparent-size
, que pode ser menor que "uso real do disco". Então, isso pode ser (mais) de onde minha matemática estava errada.