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

10

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

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

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

Grzegorz Wierzowiecki
fonte
2
Você tentou a sfillsugestão ? Parece que não requer extX.
Kevin
1. Eu sei que você pode preencher arquivos existentes com zeros com shred, mas isso provavelmente não é, certo? 2.Como você está fazendo essas imagens? Talvez você possa fazer o truncamento lá?
Zlatko
@ Kevin: é por isso que eu postei a resposta sfill na pergunta original. Eu mesmo raramente uso sistemas de arquivos ext2,3,4, então acho que os utilitários que funcionam apenas no ext * são irritantemente inúteis.
cas
Eu preciso de algo "inteligente". Algo que só preenche o espaço vazio com zeros sem tocar em outros lugares - quero dizer, sem afetar as estruturas de dados internas, como as Árvores B (se você está curioso, escrevi na pergunta "compressão", mas também preciso para outros fins, como fs duplicação, análise e pesquisa de imagens fs)
Grzegorz Wierzowiecki
apenas use truncatee / oufallocate
mikeserv 14/12/14

Respostas:

4

Aqui está um repost modificado e muito expandido da minha resposta à sua pergunta anterior:

sfilldo secure-deletepacote pode fazer o que você quiser.

Diferente do zerofree (que funciona apenas com os 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 está empacotada para o debian e o 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.

NOTA: sfill funciona apenas em um sistema de arquivos montado. Se você estiver preenchendo com zero os arquivos de imagem do sistema host em vez de dentro de uma VM, precisará montar a imagem fs no host. O método exato varia dependendo do tipo de arquivo de imagem (por exemplo, qcow2 ou bruto).

A montagem de imagens "brutas" é fácil e direta. Basta usar kpartxno arquivo de imagem para criar um dispositivo de loopback e / dev / mapper / entradas para cada partição, em seguida, podem ser montados individualmente.

aqui está um script parcial modificado a partir de um fragmento do script que eu uso para montar imagens de disco rígido de freedos inicializáveis ​​em rede (usadas para atualizações da bios em máquinas nas quais o flashrom não funciona):

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 podem ser montadas. verdadeiro no meu caso de uso (uma imagem hd freedos com uma partição). não é verdade se uma das partições for, digamos, trocar espaço. Detectando essas partições e usando dd para zero, a partição swap é deixada como um exercício para o leitor :)

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

Se suas imagens são qcow, você pode usar a qemu-nbdferramenta do qemu-utilspacote, que apresentará o arquivo de imagem e suas partições como dispositivos de bloco de rede - por exemplo, / dev / nbd0 / dev / ndb0p1 - que pode ser usado de maneira semelhante à / dispositivos dev / mapper acima.

É possivelmente mais fácil e menos complicado (mas demorado) para qemu-imgconverter de qcow em raw, use o método para raw acima e, em seguida, converta a imagem bruta modificada novamente em qcow2 compactado2. Provavelmente, isso resultará em imagens um pouco menores do que no uso do qemu-nbd, pois você comprimirá a nova imagem qcow2 enquanto ela está sendo criada.

cas
fonte
11
O que quero dizer é que ele é não considerada "inteligente" forma de preencher o espaço não utilizado com zeros. É a maneira mais óbvia e típica de fazer isso. Eu não estou perguntando sobre coisas assim.
Grzegorz Wierzowiecki 5/08
11
Por favor, descreva um algoritmo "inteligente" que não é específico para uma família de sistemas de arquivos específica (como zerofill é para ext2 / 3/4). Você queria um programa que pudesse fazer o trabalho. Você não disse que tinha que ser mágico também.
5283
11
e, realmente, se o sistema de arquivos não estiver em uso (porque, por exemplo, ele está montado no host para zerofilling), o que importa o quão inteligente é o algoritmo? Percorrer os metadados fs procurando setores vazios não será mais rápido ou melhor do que apenas escrever um preenchimento enorme de NULs ... o sistema de arquivos em si já é inteligente o suficiente para descobrir onde está o espaço vazio.
5282
2
Por um lado, para as suas necessidades é suficiente - portanto, minha pergunta já contém um trecho de código com esta solução -, então sua resposta não está fornecendo nada de novo. Por outro lado, minhas necessidades exigem o que especifico, porque quero limpar o espaço não utilizado com zeros sem modificar estruturas internas (por exemplo, reequilibrar "Dancing B-Trees" ou outro tipo de estrutura de dados (por exemplo, para análises e desduplicação) fins)
Grzegorz Wierzowiecki
2
@cas - Acho que você está perdendo o fato de que o preenchimento zero é uma etapa essencial antes da compactação de discos rígidos virtuais em VMs. Se você tiver um disco de expansão de 500 GB, com 10 GB de arquivos e 10 GB de espaço "vazio" (ou seja, arquivos excluídos), a execução da abordagem ingênua "arquivo zero gigante" levará muito mais tempo e exigirá que o VHD incha até os 500 GB completos. Aposto que o OP está assumindo que o utilitário também deve ser específico do FS.
Fake Name
3

A maneira correta e "inteligente" de limpar o espaço livre está usando:

fstrim /mountpoint

Use isso em um sistema de arquivos montado.

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

No entanto, a solução funciona bem se o seu disco é uma provisão fina em um sistema de arquivos esparso e você deseja recuperar o espaço não utilizado.

DustWolf
fonte