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

66

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

Estou procurando algo mais inteligente que

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

Como o FSArchiver está procurando por "espaço usado" e ignora sites não utilizados, mas opostos.

Propósito: Eu gostaria de compactar imagens de partição, então é altamente recomendável preencher espaços não utilizados com zeros.

Entre. Para btrfs: Limpar o espaço não utilizado com zeros (btrfs)

    
por Grzegorz Wierzowiecki 29.07.2012 / 12:02

6 respostas

68

Esse utilitário é zerofree .

Da sua descrição:

Zerofree finds the unallocated, non-zeroed blocks in an ext2 or ext3 file-system and fills them with zeroes. This is useful if the device on which this file-system resides is a disk image. In this case, depending on the type of disk image, a secondary utility may be able to reduce the size of the disk image after zerofree has been run. Zerofree requires the file-system to be unmounted or mounted read-only.

The usual way to achieve the same result (zeroing the unused blocks) is to run "dd" do create a file full of zeroes that takes up the entire free space on the drive, and then delete this file. This has many disadvantages, which zerofree alleviates:

  • it is slow
  • it makes the disk image (temporarily) grow to its maximal extent
  • it (temporarily) uses all free space on the disk, so other concurrent write actions may fail.

Zerofree has been written to be run from GNU/Linux systems installed as guest OSes inside a virtual machine. If this is not your case, you almost certainly don't need this package.

UPDATE # 1

A descrição do pacote .deb contém o seguinte parágrafo agora, o que implicaria que isto funcionaria bem com o ext4 também.

Description: zero free blocks from ext2, ext3 and ext4 file-systems Zerofree finds the unallocated blocks with non-zero value content in an ext2, ext3 or ext4 file-system and fills them with zeroes...

    
por 29.07.2012 / 13:45
26

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

Zerando espaço não utilizado

O sistema de arquivos não está montado

  • Se o "disco" no qual seu sistema de arquivos está instalado é thin provisioned (por exemplo, um SSD moderno que suporta TRIM, um arquivo VM cujo formato suporta dispersão etc.) e seu kernel diz que o dispositivo de bloco o entende, você pode usar e2fsck -E discard src_fs para descarte o espaço não utilizado (requer o e2fsprogs 1.42.2 ou superior).
  • Usando zerofree para escrever explicitamente zeros em blocos não utilizados.
  • Usando e2image -rap src_fs dest_fs para copiar apenas blocos em uso (o novo sistema de arquivos deve estar em um "disco" que não tenha sido zerado, requer o e2fsprogs 1.42.9 ou superior).

O sistema de arquivos está montado

  • Se o "disco" em que seu sistema de arquivos está instalado for thin provisioned (por exemplo, um SSD moderno que suporta TRIM, um arquivo VM cujo formato suporta dispersão etc.), seu kernel diz que o dispositivo de bloco o entende e finalmente o driver do sistema de arquivos ext o suporta você pode usar fstrim /mnt/fs/ para pedir ao sistema de arquivos que descarte o espaço não utilizado.
  • Usar cat /dev/zero > /mnt/fs/zeros; sync; rm /mnt/fs/zeros ( sfill de secure-delete usa essa técnica). Este método é ineficiente, não recomendado por Ted Ts'o (autor do ext4), pode não zerar certas coisas e pode retardar futuros fscks.

Ter o sistema de arquivos desmontado dará melhores resultados do que tê-lo montado. Descartar tende a ser o método mais rápido quando um monte de espaço usado anteriormente precisa ser zerado, mas usar o zerofree após o processo de descarte pode às vezes zerar um pouco mais (dependendo de como o descarte é implementado no "disco").

Tornando o arquivo de imagem menor

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 permitir que o arquivo que representa a imagem fique menor.

A imagem é um arquivo não processado

Uma das técnicas a seguir pode ser usada para tornar o arquivo esparso (portanto, as execuções de zero param de ocupar espaço):

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

Atualmente, é mais fácil usar uma ferramenta como virt-sparsify para executar essas etapas e muito mais em um vai.

Fontes

por 27.12.2015 / 18:53
14

sfill de secure-delete pode fazer isso e vários outros trabalhos relacionados.

por exemplo,

sfill -l -l -z /mnt/X

UPDATE # 1

Existe uma árvore fonte que parece ser usada pelo projeto ArchLinux no github que contém a fonte para sfill , que é uma ferramenta incluída no pacote Secure-Delete.

Além disso, uma cópia da página de manual do sfill está aqui:

por 29.07.2012 / 13:45
6

Se você tem e2fsprogs 1.42.9, então você pode usar e2image para criar a imagem da partição sem o espaço livre, então você pode pular a etapa de zerar.

    
por 02.04.2014 / 17:27
0

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

    
por 02.04.2014 / 16:39
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
    
por 01.08.2018 / 17:31