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
para partições pequenas.ext2
aparência razoáveis aqui, com certezaRespostas:
Tente o seguinte:
mkfs.ext4 -N 104 -m0 -O ^has_journal,^resize_inode /dev/purgatory/test1
Eu acho que isso permite que você entenda "o que está acontecendo".
-N 104
(defina o número de iNodes que seu sistema de arquivos deve ter)-m 0
(sem blocos reservados)-O ^has_journal,^resize_inode
(desative os recursoshas_journal
eresize_inode
resize_inode
"custos" de espaço livre (a maioria dos 1550 1K-Blocks / 2% que você vê no seudf
- 12K são usados para a pasta "perdidos + achados")has_journal
"custos" de espaço útil (4096 blocos de 1K no seu caso)Saímos
102348
de102400
outros 52 blocos inutilizáveis (se tivermos excluído a pasta "perdido + encontrado"). Portanto, mergulhamos emdumpe2fs
:e conte os blocos usados (para superbloco de backup, descritores de grupo, bitmap de bloco, bitmap de Inode e tabela Inode) ou we
grep
e count:o que nos dá a contagem de linhas que possuem um único bloco (no nosso exemplo) e
o que nos dá a contagem de linhas que têm dois blocos (no nosso exemplo).
Portanto, temos (em nosso exemplo)
13
linhas com um bloco cada e19
linhas com dois blocos cada.o que nos dá
51
blocos que são usados pelo próprio ext4. Finalmente, resta apenas um quarteirão. O bloco 0, que são os1024
bytes ignorados no início para coisas como o setor de inicialização.fonte
df
no fs com diário: 95054k -df
no fs sem jorunal 99150k - e não misture espaço "utilizável" e "livre".mkfs.xfs -l size=512 -d agcount=1
criará um sistema de arquivos com o tamanho mínimo absoluto de log (também conhecido como diário), mas o desempenho da gravação pode sofrer. Eu não acho que o código XFS suporte a operar sem um log. Possivelmente somente leitura, para suportar casos em que um dispositivo de log externo está quebrado. (também,agcount=1
é provavelmente uma outra idéia terrível para o desempenho de gravação, esp paralelo e cabeçalhos de grupo de alocação são provavelmente pequenos, também...)mkfs.xfs -d agcount=1
em uma partição de 100MiB, um FS de 95980kiB foi usado, com 5196k usados e 90784k disponíveis. A conta padrão é 4 e o tamanho padrão do log é 1605 blocos (também o mínimo). Portanto, o XFS usa um log tão pequeno quanto deseja permitir que você especifique, para FSes pequenos.A resposta curta:
Nem todo o espaço no dispositivo de bloco se torna espaço disponível para seus dados: parte do espaço bruto é necessária para o sistema interno de arquivos, a contabilidade dos bastidores.
Essa contabilidade inclui o super bloco, os descritores do grupo de blocos, os bitmaps de bloco e inode e a tabela de inode. Além disso, cópias do super bloco para fins de backup / recuperação são criadas em vários locais. Uma longa leitura sobre os aspectos internos do sistema de arquivos EXT4 pode ser encontrada em ext4.wiki.kernel.org .
Como o EXT4 é um sistema de arquivos com diário, também ocupa algum espaço.
Além disso, algum espaço é reservado para futuras expansões do sistema de arquivos.
A resposta longa:
Recriei seu cenário em um dos meus sistemas de teste:
Antes mesmo de montar o sistema de arquivos, a
dumpe2fs
mostra:e após a montagem:
Então, o que
df
nos mostra? Dos 102400 blocos da capacidade do dispositivo de armazenamento bruto, 99150 blocos de 1K são visíveis para o sistema de arquivos, o que significa que 3250 blocos de 1 kilobyte de espaço de armazenamento bruto tornaram-se inutilizáveis para o armazenamento de dados real.Para onde foram esses blocos? Rolar para baixo na
dumpe2fs
saída mostra exatamente onde:1 block
(bloco 0) Os primeiros 1024 bytes são ignorados para permitir a instalação de setores de inicialização x86 e outras curiosidades.1 block
é ocupado pelo super bloco Primário.1 block
contém os descritores do grupo.256 blocks
são reservados para a tabela de descritores de grupo para permitir redimensionamento futuro do sistema de arquivos.16 blocks
são atribuídos ao bitmap do bloco.16 blocks
são designados para o bitmap do inode.246 blocks
são designados para a tabela de inodes.Isso já responde por 537 dos 3250 blocos ausentes. Um sistema de arquivos ext4 é dividido em uma série de grupos de blocos e a rolagem para baixo mostra ainda uma alocação semelhante da capacidade de armazenamento bruto aos internos do sistema de arquivos nos outros grupos de blocos:
Agora, de volta à
df
saída:A razão pela qual nesse sistema de arquivos novo já 7% da capacidade é marcada como em uso é:
99150 (o tamanho do sistema de arquivos) menos 5120 (a contagem de blocos reservada) menos 5646 (blocos usados, 4096 dos quais são do diário (novamente parte da saída do dumpe2fs`))
= 88384
A contagem de blocos livres no dumpe2fs é o tamanho disponível do sistema de arquivos menos o uso real (e não leva em consideração os blocos reservados), portanto 99150 - 5646 = 93504.
fonte
Não é uma resposta para a pergunta, mas fiquei curioso, então imagino que outras pessoas o farão. Como eu já tinha um liveCD inicializado e tinha um disco rígido com o qual eu poderia mexer sem me preocupar com erros de digitação que danificassem qualquer coisa, fui em frente e testei.
Fiz partições com todos os FSes para os quais o Ubuntu 14.10 envia um mkfs, em partições 100MiB. (exceto o minix, que suporta apenas 64MiB, e o bfs, que é uma coisa de SCO da qual nunca ouvi falar.)
Primeiro, examinei o
df -k
espaço disponível (com as configurações padrão do mkfs) e depoisdd
editei/dev/zero
um arquivo em cada FS para garantir que eles pudessem ser preenchidos até o fim. (ou seja, verifique se a reivindicaçãoavailable space
estava realmente disponível.)for i in /media/ubuntu/small-*;do sudo dd if=/dev/zero of="$i/fill" bs=16k;done
Por que o btrfs tem tanto espaço inutilizável? Talvez para metadados? bem não:
Ambos os sistemas de arquivos baseados em árvore não podem compactar um arquivo vazio em nenhum lugar, mas todos os outros podem.
Ou apenas veja o tamanho de um arquivo que você pode criar:
(Chamei minha partição ext4 de "small-ext" porque não estava planejando enlouquecer e criar todos os sistemas de arquivos. Então ext = ext4 aqui. NÃO o original pré-ext2 ext.)
E
df -k
saída após removê-los novamente:(O jfs voltou a 1% usado depois que eu removi o "toque" também. Houve um atraso ou demorou outra gravação para obter o tamanho disponível para atualização.)
Enfim, acho que é isso por curiosidade.
fonte