Limpar espaço não utilizado com zeros (btrfs)

9

Como limpar o espaço não utilizado com zeros? (Eu estou pedindo uma ferramenta para o sistema de arquivos btrfs )

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 ext3, ext4: Apague o espaço não utilizado com zeros (ext3, ext4) . Aqui eu peço por btrfs

Esclarecimento de "algoritmo mais inteligente": Como eu vejo que "algoritmo mais inteligente" leva a confusão, aqui eu finalmente decidi adicionar uma linha sobre isso. Caro leitor, pense no sistema de arquivos como estrutura de dados. Para fins de simplificação, vamos imaginar o mapa de exploração de árvore vermelho-preto com auto balanceamento, que é usado como matriz de valor de associação->, em que os valores são números inteiros. O objetivo é limpar todos os valores negativos com zeros. O algoritmo "não inteligente" irá iterar sobre ele e adicionar os pares chave: valor ao novo mapa (com eventual alteração negativa para zero). O algoritmo inteligente detecta apenas locais onde os valores negativos são armazenados e os desmarca no local .

    
por Grzegorz Wierzowiecki 04.08.2012 / 01:39

2 respostas

3

Aqui está uma repostagem modificada e muito expandida da minha resposta à sua pergunta anterior:

sfill do pacote secure-delete pode fazer o que você quiser.

Ao contrário do zerofree (que funciona apenas com sistemas de arquivos ext2, ext3 e ext4), o sfill funcionará com qualquer sistema de arquivos.

por exemplo,

sfill -l -l -z /mnt/X

A página inicial sfill / secure-delete agora parece ter desaparecido, mas é empacotada para o debian e o ubuntu. provavelmente outras distros também. se você precisar de código fonte, que pode ser encontrado nos arquivos debian se você não puder encontrá-lo em nenhum outro lugar.

NOTA: sfill só funciona em um sistema de arquivos montado. Se você preencher com zeros os arquivos de imagem do sistema host e não de dentro de uma VM, será necessário montar a imagem fs no host. O método exato varia dependendo do tipo de arquivo de imagem (por exemplo, qcow2 ou raw).

A montagem de imagens "brutas" é fácil e direta. Basta usar kpartx no arquivo de imagem para criar um dispositivo de loopback e as entradas / dev / mapper / para cada partição podem ser montadas individualmente.

aqui está um script parcial modificado de um fragmento do script que eu uso para montar imagens do disco rígido do freedos inicializáveis pela rede (usado para atualizações do BIOS em máquinas onde o flashrom não funcionará):

image="myrawimagefile.img"

# use kpartx to build /dev/mapper device nodes
KP=$(kpartx -a -v "$image")

# now mount each partition under ./hd/
for p in $(echo "$KP" | awk '/^add map/ {print $3}') ; do
  dm="/dev/mapper/$p"
  fp=$(echo "$p" | sed -r -e 's/^loop[0-9]+//')
  mkdir -p "./hd/$fp"
  mount "$dm" "./hd/$fp"
  sfill -l -l -v "./hd/$fp"
  umount "$dm"
done

# now remove the loopback device and /dev/mapper entries
kpartx -d "$image"

NOTA: assume que todas as partições da imagem são montáveis. true em meu caso de uso (uma imagem hd do freedos com uma partição). Não é verdade se uma das partições é, digamos, swap de espaço. Detectar tais partições e usar dd para zerar a partição swap é deixado como um exercício para o leitor:)

Esse método, ou uma variante dele, também deve funcionar para os volumes LVM.

Se suas imagens forem qcow, você poderá usar a ferramenta qemu-nbd do pacote qemu-utils , que apresentará o arquivo de imagem e suas partições como dispositivos de bloco de rede. / dev / nbd0 / dev / ndb0p1 - que pode ser usado de forma semelhante aos dispositivos / dev / mapper acima.

É possivelmente mais fácil e menos trabalhoso (mas consome mais tempo) usar qemu-img para converter de qcow em raw, usar o método raw acima e depois converter a imagem bruta modificada de volta em qcow2 compactado. Isso provavelmente resultará em imagens ligeiramente menores do que usando o qemu-nbd, já que você estará compactando a nova imagem qcow2 quando estiver sendo criada.

    
por 04.08.2012 / 05:34
1

A maneira correta e "inteligente" de limpar o espaço livre é usar:

fstrim /mountpoint

Use isso em um sistema de arquivos montado.

É importante notar que não há vantagem de segurança nisso. Se você deseja limpar o disco para segurança, faça backup dos arquivos, zere o disco inteiro com um comando como "shred" e restaure seus arquivos.

No entanto, a solução funciona bem se o seu disco for uma thin provision em um sistema de arquivos esparso e você desejar recuperar o espaço não utilizado.

    
por 29.11.2018 / 22:48