Limpar espaço não utilizado com zeros (ext3, ext4)

73

Como limpar o espaço não utilizado com zeros? (ext3, ext4)

Estou procurando por algo mais inteligente do que

cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero

O FSArchiver está procurando "espaço usado" e ignora o site não utilizado, mas oposto.

Objetivo: eu gostaria de compactar imagens de partição, portanto, é altamente recomendável preencher o espaço não utilizado com zeros.

Btw. Para btrfs: limpe o espaço não utilizado com zeros (btrfs)

Grzegorz Wierzowiecki
fonte
4
Verifique isso: superuser.com/questions/19326/…
Mat
11
Dois tipos diferentes de resposta são possíveis. O que você está tentando alcançar? Ou 1) segurança, proibindo a alguém para ler esses dados, ou 2) otimização de compressão de toda a partição ou [desempenho SSD] ( en.wikipedia.org/wiki/Trim_(computing) ?
Totor

Respostas:

77

Tal utilidade é zerofree.

De sua descrição:

O Zerofree localiza os blocos não alocados e não zerados em um sistema de arquivos ext2 ou ext3 e os preenche com zeros. Isso é útil se o dispositivo no qual esse sistema de arquivos reside for uma imagem de disco. Nesse caso, dependendo do tipo de imagem de disco, um utilitário secundário poderá reduzir o tamanho da imagem de disco após a execução do zerofree. O Zerofree requer que o sistema de arquivos seja desmontado ou montado como somente leitura.

A maneira usual de obter o mesmo resultado (zerar os blocos não utilizados) é executar "dd". Crie um arquivo cheio de zeros que ocupa todo o espaço livre na unidade e exclua esse arquivo. Isso tem muitas desvantagens, que o zerofree alivia:

  • está lento
  • faz com que a imagem do disco (temporariamente) cresça na sua extensão máxima
  • (temporariamente) usa todo o espaço livre no disco, portanto outras ações de gravação simultâneas podem falhar.

O Zerofree foi escrito para ser executado em sistemas GNU / Linux instalados como sistemas operacionais convidados em uma máquina virtual. Se esse não for o seu caso, você quase certamente não precisará deste pacote.

ATUALIZAÇÃO # 1

A descrição do pacote .deb contém o parágrafo a seguir agora, o que implica que isso também funcionará bem com o ext4.

Descrição: zero blocos livres dos sistemas de arquivos ext2, ext3 e ext4 O Zerofree encontra os blocos não alocados com conteúdo de valor diferente de zero em um sistema de arquivos ext2, ext3 ou ext4 e os preenche com zeros ...

Outros usos

Outro aplicativo desse utilitário é compactar imagens de disco que são um backup de um disco real. Um exemplo típico disso é o despejo do cartão SD em um BeagleBone ou Raspberry Pi. Depois de zerados os espaços vazios, as imagens de backup podem ser compactadas com mais eficiência.

enzotib
fonte
11
É a página oficial da ferramenta intgat.tigress.co.uk/rmy/uml/index.html ? Você acha que é seguro usá-lo com o ext4?
Grzegorz Wierzowiecki 29/07/2012
2
@GrzegorzWierzowiecki: sim, essa é a página, mas para debian e amigos, ela já está nos repositórios. Eu usei em uma partição ext4 em um disco virtual para reduzir sucessivamente a imagem do arquivo de disco e não tive nenhum problema.
enzotib 29/07
11
Isso não é equivalente ao ddmétodo bruto da pergunta original, pois não funciona em sistemas de arquivos montados.
jlh
A página zerofree fala sobre um patch que permite "o sistema de arquivos é montado com a opção zerofree", para que sempre zere continuamente os arquivos excluídos. isso requer recompilar o kernel então? existe uma maneira mais fácil de realizar a mesma coisa?
endolith 14/10
2
Tenha cuidado - eu perdi o sistema de arquivos ext4 usando o zerofreeAstralinux (baseado no Debian) ...
Hubbitus
33

Resumo dos métodos (mencionados nesta pergunta e em outros lugares) para limpar o espaço não utilizado em ext2 / ext3 / ext4:

Zerando o espaço não utilizado

O sistema de arquivos não está montado

  • Se o "disco" em que o seu sistema de arquivos está instalado é pouco provisionado (por exemplo, um SSD moderno que suporta TRIM, um arquivo VM cujo formato suporta escassez etc.) e o kernel diz que o dispositivo de bloco o entende, você pode usá-lo e2fsck -E discard src_fspara descartar o espaço não utilizado (requer e2fsprogs 1.42.2 ou superior).
  • Usando zerofree (por exemplo zerofree src_fs) para escrever explicitamente zeros sobre blocos não utilizados.
  • Usar e2image -rap src_fs dest_fspara copiar apenas blocos em uso (o novo sistema de arquivos deve estar em um "disco" zerado, requer o e2fsprogs 1.42.9 ou superior).

O sistema de arquivos está montado

  • Se o "disco" em que o seu sistema de arquivos está está com thin provisioning (por exemplo, um SSD moderno com suporte ao TRIM, um arquivo VM cujo formato suporta escassez etc.), seu kernel diz que o dispositivo de bloco o entende e, finalmente, o driver ext do sistema de arquivos o suporta, você pode usar fstrim /mnt/fs/para solicitar ao sistema de arquivos que descarte o espaço não utilizado.
  • Usando cat /dev/zero > /mnt/fs/zeros; sync; rm /mnt/fs/zeros( sfillde exclusão segura usa esta técnica). Este método é ineficiente, não recomendado por Ted Ts'o (autor do ext4), pode não zerar certas coisas e pode atrasar fscks futuros .

Desmontar o sistema de arquivos fornecerá melhores resultados do que montá-lo. O descarte tende a ser o método mais rápido quando muito espaço usado anteriormente precisa ser zerado, mas o uso zerofreeapós o processo de descarte às vezes pode zerar um pouco mais (dependendo de como o descarte é implementado no "disco").

Diminuindo o arquivo de imagem

A imagem está em um formato VM dedicado

Você precisará usar uma ferramenta de imagem de disco apropriada (como qemu-img convert src_image dst_image) para permitir que o espaço zerado seja recuperado e para permitir que o arquivo que representa a imagem fique menor.

A imagem é um arquivo bruto

Uma das seguintes técnicas pode ser usada para tornar o arquivo escasso (as execuções com zero param de ocupar espaço):

  • cp --sparse=always src_image dst_image.
  • fallocate -d src_image (requer util-linux v2.25 ou superior).

Atualmente, pode ser mais fácil usar uma ferramenta como o virt-sparsify para executar essas etapas e mais de uma vez.

 Fontes

Anon
fonte
15

sfillda exclusão segura pode fazer isso e vários outros trabalhos relacionados.

por exemplo

sfill -l -l -z /mnt/X

ATUALIZAÇÃO # 1

Existe uma árvore de código-fonte que parece ser usada pelo projeto ArchLinux no github que contém o código-fonte para o sfillqual é uma ferramenta incluída no pacote Secure-Delete.

Também sfillestá aqui uma cópia da página de manual:

cas
fonte
esse URL está obsoleto. não faço ideia de onde está sua página inicial (ou mesmo se ainda a possui), mas está empacotada para debian e ubuntu. provavelmente outras distros também. se você precisar de código fonte, isso pode ser encontrado nos arquivos debian, se você não puder encontrá-lo em nenhum outro lugar.
29512
O URL obsoleto da página de manual foi corrigido agora. Parece que "Digipedia" não é mais uma coisa.
Mwfearnley
8

Se você tiver o e2fsprogs 1.42.9, poderá e2imagecriar a imagem da partição sem o espaço livre em primeiro lugar, para poder pular a etapa de zerar.

psusi
fonte
Eu não podia (facilmente) encontrar qualquer informação on-line sobre esses parâmetros, mas eles são, de facto dada nas notas 1.42.9 liberação: e2fsprogs.sf.net/e2fsprogs-release.html#1.42.9
mwfearnley
11
Essa é uma ferramenta valiosa! No entanto, sua resposta seria melhor se também explicasse como usá-lo. É e2image -ar /dev/foo1 | gzip > fs.img.gz, ou alguma variação disso. Inclua -fpara usá-lo em um fs montado.
marcelm
0

Você pode usar sfill. É uma solução melhor para volumes finos.

user64219
fonte
Se você quiser comentar a resposta cas, aguarde até ter reputação suficiente para fazê-lo.
Anthon
11
Eu acho que a resposta está se referindo a manpages.ubuntu.com/manpages/lucid/man1/sfill.1.html ... que é pelo menos uma tentativa de resposta. ("online", neste caso, significa "com o sistema de arquivos montado", não "na web").
Derobert #
0

se você não quiser recorrer a ferramentas adicionais, esse método deve ser mais rápido que cat /dev/zero > /mnt/fs/zeros:

dd if=/dev/zero of="/mnt/fs/filler" bs=10485760
dd if=/dev/zero of="/mnt/fs/filler1" bs=1
rm /mnt/fs/filler
rm /mnt/fs/filler1
eadmaster
fonte
Por que isso seria mais rápido que cat? (Não, o argumento tamanho do bloco ddnão ajuda)
marcelm
2
Sim, mas isso não torna ddmais rápido. De fato, provavelmente torna catmais rápido. O tamanho do bloco é importante apenas para minimizar a sobrecarga das chamadas do sistema e otimizar o uso do cache da CPU. Com a sobrecarga do syscall, você entra na área de retornos decrescentes. O cache começa a doer acima, digamos, de 1MiB. E ao operar em discos reais, você está vinculado à E / S de qualquer maneira e o ponto é discutível. Tente compará-lo você mesmo.
Marcelm #