Quanto a sobrecarga de armazenamento vem junto com cryptsetup e ext4?

3

Eu quero criptografar o conteúdo de um diretório em um container com um sistema de arquivos ext4 usando o cryptsetup. O tamanho do container deve ser tão pequeno quanto possível e tão grande quanto necessário, porque eu só quero escrever uma vez e depois fazer o backup.

Primeira tentativa: definir o tamanho do contêiner para o tamanho do conteúdo.

dirsize=$(du -s -B512 "$dir" | cut -f 1)
dd if=/dev/zero of=$container count=$dirsize
losetup /dev/loop0 $container
fdisk /dev/loop0 # 1 Partition with max possible size
cryptsetup luksFormat --key-file $keyFile /dev/loop0
cryptsetup luksOpen --key-file $keyFile /dev/loop0 container
mkfs.ext4 -j /dev/mapper/container
mkdir /mnt/container
mount /dev/mapper/container /mnt/container
rsync -r "$dir" /mnt/container

O Rsync retorna que não há espaço suficiente para os dados. Parece razoável, pois tem que haver alguma sobrecarga para a criptografia e o sistema de arquivos.

Eu tentei com um deslocamento relativo:

dirsize=$(($dirsize + ($dirsize + 8)/9))

Isso corrige o problema para dirs com > 100 MB, mas não para dirs com < 50 MB.

Como posso determinar a respectiva quantidade de bytes que o contêiner tem que ser maior que o diretório?

    
por fret 14.04.2014 / 12:54

3 respostas

2

Por padrão, o LUKS usa 2 MiB para seu cabeçalho, principalmente devido a razões de alinhamento de dados. Você pode verificar isso com cryptsetup luksDump ( Payload offset: em setores). Se você não se importa com o alinhamento, pode usar a opção --align-payload=1 .

Quanto a ext4 , é complicado. Sua sobrecarga depende do tamanho do sistema de arquivos, tamanho do inode, tamanho do diário e tal. Se você não precisa de um diário, talvez prefira ext2 . Pode ser que outros sistemas de arquivos tenham menos sobrecarga do que ext* , pode valer a pena experimentar. Além disso, alguns dos mkfs flags (como -T largefile ou similar) podem ajudar, dependendo do tipo de arquivo que você está colocando nessa coisa. Por exemplo. você não precisa criar o sistema de arquivos com um milhão de inodes se for colocar apenas uma dúzia de arquivos nele.

Se você quiser que o contêiner tenha tamanho mínimo, comece com um contêiner maior e use resize2fs -M para reduzi-lo ao tamanho mínimo. Você pode então truncate do contêiner usando esse tamanho mais o Payload offset: de LUKS.

Isso deve ser bem pequeno, se você precisar dele ainda menor, considere usar tar.xz em vez de um sistema de arquivos. Embora tar não seja tão bom para centenas de GB de dados (precisa extrair tudo para acessar um único arquivo), ele deve estar bem para os tamanhos que você mencionou e deve ser menor que a maioria dos sistemas de arquivos ...

    
por 14.04.2014 / 13:39
0

"O LUKS tem uma sobrecarga de 1032 setores (um setor sendo 512 bytes) na qual ele armazena o cabeçalho LUKS. Após o cabeçalho, os dados criptografados ocupam tanto espaço quanto sua contraparte descriptografada, linearmente"

Veja: link

    
por 14.04.2014 / 13:26
0

É difícil prever o tamanho exato de um sistema de arquivos, porque um sistema de arquivos contém mais do que os próprios arquivos. Veja Por que existem tantas maneiras diferentes medir o uso do disco? para algumas sutilezas sobre o uso do disco. Em particular:

  • Cada arquivo termina com um bloco incompleto. Executar du leva isso em conta, mas você precisa omitir o argumento -B , e isso se aplica somente se o sistema de arquivos em que você o executa tiver o mesmo tamanho de bloco daquele em que copiará os arquivos.
  • O sistema de arquivos também precisa conter inodes e outras estruturas de dados (superblock, journal,…).

Se você acompanhar o número de arquivos e criar muitos inodes, e somar os tamanhos dos blocos e os tamanhos dos inodes, você terá uma boa idéia do tamanho do sistema de arquivos. Mas se você quer que seja realmente apertado, espere um pouco de tentativa e erro.

A maneira mais fácil de encontrar o tamanho mínimo da imagem ext2 seria criar uma imagem ext4 grande o suficiente, então use resize2fs para reduzi-la.

Se você estiver fazendo um sistema de arquivos somente para leitura para ser lido no Linux, squashfs seria uma escolha melhor que ext4.

O próprio Dm-crypt também tem uma sobrecarga. que é explicado no FAQ . Por padrão, cryptsetup reserva 2 MB no início do volume para os metadados (FAQ 2.18); a sobrecarga é independente do tamanho do volume. As FAQ 6.12 e 6.13 explicam como reduzir a sobrecarga. Escolha um tamanho de chave de 128 bits (você precisa disso e não precisa mais de segurança), o que requer 512kB de slots principais, além do cabeçalho de tamanho fixo (544B). Escolha o menor alinhamento possível ou próximo a ele; Eu acho que com um sistema de arquivos com tamanho de bloco de 4kB, haverá uma pequena penalidade de desempenho se você usar um alinhamento menor que 4kB e 4kB é insignificante nessa escala, então eu recomendo um alinhamento de 4kB, para uma sobrecarga total de 516kB . As opções ao criar o volume são

cryptsetup luksFormat -s 128 --align-payload=8 --key-file $keyFile /dev/loop0
    
por 15.04.2014 / 02:50