Estou tentando criar um sistema de arquivos criptografado, conforme o necessário, no Linux. Eu estou familiarizado com LUKS e cryptsetup.
Eu posso criar um arquivo vazio:
fallocate -l 512M /root/image
Eu posso criar um contêiner LUKS nele:
cryptsetup -y luksFormat /root/image
E então "abra":
cryptsetup luksOpen /root/image luksvolume
Neste ponto, eu posso apenas criar um sistema de arquivos nele:
mkfs.ext4 -j /dev/mapper/luksvolume
Tudo isso é bom e elegante. No entanto, ele não aborda a parte "crescer sob demanda" da pergunta.
A idéia é que a cópia de um arquivo de 2 GB no sistema de arquivos criptografados "expanda" a imagem para que seja grande o suficiente para conter o arquivo.
É mesmo possível fazer?
mount
encryption
disk-volume
luks
Merc
fonte
fonte
Respostas:
Sim! Parece que é possível. Vamos verificar como isso pode ser alcançado. Observe que isso não cria um verdadeiro sistema de arquivos de crescimento sob demanda, pois quando o sistema de arquivos atingir o tamanho máximo do arquivo esparso, ele reportará erros de 'falta de espaço' se mais dados ainda precisarem ser gravados.
Inicialmente, eu estava investigando o Thin Provisioning , uma tecnologia conhecida para economizar espaço de armazenamento em cenários de virtualização. Infelizmente, em casos de uso comuns do Linux, parece estar disponível apenas no LVM . Como isso parece um pouco fora do escopo da sua pergunta, procurei outra coisa.
O segundo conceito que investiguei é o Sparse File . Isso é exatamente adequado à sua pergunta e ... minha dúvida inicial foi: " OK. Posso criar um arquivo esparso. Mas o que acontece quando eu o inicializo como um contêiner LUKS? Essa inicialização alocará todo o espaço disponível? Se não, o que acontecerá quando inicializar o sistema de arquivos em um contêiner?
mkfs.ext4
Alocarei todo o espaço disponível? ". Como não tinha resposta, decidi tentar. Então, vamos ver o que aconteceu.Vamos começar pelo meu sistema atual, onde tenho apenas 3,3 G de espaço livre no
/repository
sistema de arquivos:Vamos criar um arquivo esparso 10G dentro desse sistema de arquivos, com:
e vamos verificar se ... é realmente um arquivo esparso:
ESTÁ BEM. Portanto, temos um arquivo 10G , em um sistema de arquivos que anteriormente possuía 3.3G de espaço livre. Quanto espaço livre ainda tenho?
Ainda 3.3G. Agradável. O arquivo esparso é realmente ... o arquivo esparso ;-) Vamos avançar, criando um contêiner LUKS dentro de um arquivo 10G e ... vamos ver se ficamos sem espaço:
Então agora eu tenho um
secrets
contêiner aberto definido em cima do meu arquivo esparso 10G armazenado em um sistema de arquivos com apenas 3.3G de espaço livre.Quanto espaço livre ainda tenho?
Maravilhoso! Ainda 3.3GB. Nosso contêiner criptografado praticamente não requer espaço!
Vamos verificar se está tudo bem ou se há algo estranho com nossa configuração:
Tudo parece bom, então vamos começar a usar esse contêiner para armazenar algo. Vamos começar criando um sistema de arquivos EXT4 dentro dele:
Parece que funcionou, pois não havia nenhuma pista de "fora do espaço". Vamos checar:
Uhm .... então algo aconteceu. Perdemos algo como 100M de espaço, mas ... é um comportamento esperado: a criação do sistema de arquivos EXT4 DO exige a gravação de muitos metadados. Portanto, é normal que algum espaço tenha sido usado pelo processo de criação.
É um sistema de arquivos EXT4 "funcional"?
Sim! Parece ok.
Portanto, agora temos um sistema de arquivos EXT4 gravado em um contêiner LUKS aberto, definido no topo de um arquivo esparso 10G armazenado em um sistema de arquivos 3.3G.
Vamos ver se tudo funciona corretamente, alocando espaço "sob demanda".
Vamos começar escrevendo 500M de dados fictícios no FS criptografado
Fomos bem-sucedidos na criação do arquivo?
Parece que sim.
O que aconteceu com o nosso sistema de arquivos real?
Uau! "Perdemos" pouco mais de 500 milhões. Isso é bom, BTW, pois o espaço físico é realmente alocado sob demanda!
Vamos armazenar outro arquivo de 2 GB:
O que aconteceu?
Muito legal. O que acontece se excluirmos um arquivo?
Como esperado, com arquivos esparsos, o comportamento é exatamente como o thin provisioning: uma vez alocado, o espaço de armazenamento não pode ser reivindicado novamente quando o arquivo é excluído. Mas isso, em geral, está OK. Não é?
Portanto, neste ponto, a resposta à sua pergunta deve estar completa. Direita?
Adição:
Vamos ver o que acontece quando o armazenamento sublinhado fica cheio:
O que? parece que foi bem sucedido! Como isso foi possível? Vamos checar!
Uhm ... Parece ok. Temos certeza?
ficamos sem espaço! Sem nenhum erro!
Mesmo que seja bom investigar o que realmente aconteceu ... vou deixar isso por sua curiosidade e / ou capacidade de solucionar problemas de outros membros do ServerFault ;-)
Diverta-se!
BTW: Eu testei todos os itens acima, aqui:
fonte
rsync
possui uma--sparse
opção que deve criar arquivos esparsos no disco de destino.