Eu tenho um ambiente virtualizado de densidade muito alta com contêineres, então estou tentando tornar cada contêiner muito pequeno. "Muito pequeno" significa 87 MB no Ubuntu base 14.04 (Trusty Tahr) sem quebrar a compatibilidade do gerenciador de pacotes.
Então, eu uso o LVM como armazenamento de apoio para meus contêineres e recentemente encontrei números muito estranhos. Aqui estão eles.
Vamos criar um volume lógico de 100 MiB (sim, potência de 2).
sudo lvcreate -L100M -n test1 /dev/purgatory
Gostaria de verificar o tamanho, então emito sudo lvs --units k
test1 purgatory -wi-a---- 102400.00k
Doce, isso é realmente 100 MiB.
Agora vamos criar um sistema de arquivos ext4 . E, claro, lembramos do -m 0
parâmetro, que evita o desperdício de espaço.
sudo mkfs.ext4 -m 0 /dev/purgatory/test1
mke2fs 1.42.9 (4-Feb-2014)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
Doce e limpo. Observe o tamanho do bloco - nosso volume lógico é pequeno, então o mkfs.ext4 decidiu criar um bloco do tamanho de 1 KiB, não o habitual de 4 KiB.
Agora vamos montá-lo.
sudo mount /dev/purgatory/test1 /mnt/test1
E vamos chamar df
sem parâmetros (gostaríamos de ver 1 bloco KiB)
/dev/mapper/purgatory-test1 95054 1550 91456 2% /mnt/test1
Espere, oh shi ~
Temos 95054 blocos no total. Mas o próprio dispositivo possui 102400 blocos de 1 KiB. Temos apenas 92,8% de nosso armazenamento. Onde estão meus blocos, cara?
Vamos dar uma olhada em um dispositivo de bloco real. A possui um disco virtual de 16 GiB, 16777216 blocos de 1 K, mas apenas 15396784 estão na saída df. 91,7%, o que é isso?
Agora segue a investigação (spoiler: sem resultados)
O sistema de arquivos pode começar não no início do dispositivo. Isso é estranho, mas possível. Felizmente, o ext4 tem bytes mágicos, vamos verificar a presença deles.
sudo hexdump -C / dev / purgatory / test1 | grep "53 ef"
Isso mostra o superbloco:
00000430 a9 10 e7 54 01 00 ff ff 53 ef 01 00 01 00 00 00 |...T....S.......|
Hex 430 = 1072 de dezembro, então em algum lugar após o primeiro kilobyte. Parece razoável, o ext4 ignora os primeiros 1024 bytes por esquisitices como o VBR, etc.
- Este é o diário!
Não não é. O diário ocupa espaço em Disponível se saída df.
- Ah, nós temos o dump2fs e pudemos verificar os tamanhos lá!
... muitos cumprimentos ...
sudo dumpe2fs /dev/purgatory/test1 | grep "Free blocks"
Ai.
Free blocks: 93504
Free blocks: 3510-8192
Free blocks: 8451-16384
Free blocks: 16385-24576
Free blocks: 24835-32768
Free blocks: 32769-40960
Free blocks: 41219-49152
Free blocks: 53249-57344
Free blocks: 57603-65536
Free blocks: 65537-73728
Free blocks: 73987-81920
Free blocks: 81921-90112
Free blocks: 90113-98304
Free blocks: 98305-102399
E nós temos outro número. 93504 blocos livres.
A questão é: o que está acontecendo?
- Dispositivo de bloco: 102400k (diz o lvs)
- Tamanho do sistema de arquivos: 95054k (diz df)
- Blocos gratuitos: 93504k (diz dumpe2fs)
- Tamanho disponível: 91456k (df diz)
ext2
aparência razoáveis aqui, com certeza
ext2
para partições pequenas.