Como recuperar todo / quase todo o espaço livre de um pacote esparso no OS X

30

Existe a possibilidade de "desfragmentar" uma imagem de pacote esparsa e recuperar (a maioria) do espaço livre?

Aqui está o plano de fundo: estou usando pacotes esparsos e, de vez em quando, quero recuperar espaço deles para executar:

hdiutil compact image.sparsebundle

No entanto, conforme explicado na página de manual, ele apenas recupera arquivos de banda completamente não utilizados; portanto, no meu caso, diz:

Reclaimed 0 bytes out of 90.4 GB possible.

Obviamente, existe a possibilidade de copiar o conteúdo desta imagem para um novo pacote esparso que é usado no lugar, mas isso é complicado e requer espaço livre suficiente para esta operação.

Enquanto isso, descobri que a saída do comando compact é um pouco enganadora (atualmente estou executando o OS X 10.5.7), pois às vezes lista um tamanho possível maior do que o tamanho atualmente ocupado pelo pacote de imagens no disco rígido dirigir. Eu não olhei mais de perto, mas a saída parece ser o tamanho máximo ou "tamanho máximo" - "tamanho usado".

user4854
fonte
11
Eu tive um problema com isso, mas depois percebi que era porque meu fs esparsa era o EXFAT. Depois de ler a página de manual , percebi que o verbo compacto funciona apenas em "imagens de disco contendo um sistema de arquivos HFS".
jsejcksn
@jsejcksn Esse é um bom ponto a ser lembrado. A página do manual agora diz que APFS e HFS + são suportados.
GDP2 26/03
Pergunta relevante sobre AskDifferent: apple.stackexchange.com/questions/54607/…
GDP2

Respostas:

20

Interessante!

Pelo que ouvi, o pacote esparso divide os dados em faixas de 8Mb. Alterar o tamanho da banda pode ajudar, se você tiver sorte. Quero dizer, você nunca terá 100% de espaço recuperado, mas talvez seja melhor do que o que recebe agora. (Dependendo dos dados da imagem, etc.)

Fiz um teste simples e sujo com dois pacotes esparsos de 500Mb, um com tamanho de banda de 8Mb (padrão) e outro com 1Mb (o menor tamanho permitido do que eu sei). Copiei mais de 400mb de arquivos mp3 e, em seguida, removi todos os outros arquivos e depois hdiutil compactos executei.

Size after compact
8Mb bands: 271Mb
1Mb bands: 215Mb

O comando para converter seu pacote esparso é

hdiutil convert src.sparsebundle -format UDSB -tgtimagekey sparse-band-size=2048 -o dst.sparsebundle

O tamanho da banda está na unidade de 512 bytes. Portanto, o exemplo acima define o tamanho da banda para 512 * 2048 = 1Mb. Apenas tome cuidado se estiver lidando com imagens do TimeMachine ou imagens da pasta inicial do usuário, etc. Você está se desviando do caminho da Apple :) Mantenha um backup sem falhas!

Quanto à desfragmentação: tenho uma sensação engraçada de que é tão rápido (ou mais rápido!) Usar o hdiutil para converter o arquivo esparso em um novo arquivo esparso com o mesmo formato. Eu acho que ele tenta ser inteligente. Mas eu não sei.

(Observe que a desfragmentação de um pacote esparso apenas desfragmenta os dados do disco, não as bandas esparsas do pacote, a menos que seja um desfragmentador com reconhecimento de pacote esparso. hdiutil convertFaz uma 'desfragmentação' da banda, acredito.)

0scar
fonte
Seus argumentos de linha de comando estão na ordem errada: -odevem estar diretamente antes dst.sparsebundle, não src.sparsebundle( -odenota 'saída').
Nick Forge
Além disso, observe que esse método não preserva a criptografia. Provavelmente existe um sinalizador para habilitá-lo, mas neste momento achei mais fácil criar um novo pacote no Disk Utility e copiar meus arquivos nele.
precisa
2
Para criptografia, basta adicionar a -encryptionopção ao comando
Fideli
Muito obrigado. Diminuindo esparso-banda de tamanho é muito útil para Dropbox hospedado esparsos-bundles
Max Ried
Ok, isso não faz sentido ... quando eu converter para desfragmentar a imagem, o pacote esparso resultante é 16% maior que o original.
Michael
7

Eu acho que os 90,4 GB possíveis estão completamente errados. Quando eu corri:

hdiutil compact *.sparsebundle

... liberou 16 GB de espaço, o que é aproximadamente o que eu esperava. Curiosamente, ele disse aproximadamente "800 GB possíveis", o que é muito mais do que a capacidade do meu HD. Então, suponho que a segunda figura seja apenas um número teórico (defeituoso).

até
fonte
2

@Oscar nos apontou na direção certa. Mas você não precisa converter para 1 MB e compactar, esperando recuperar espaço.

Em vez disso, basta copiar seu pacote esparso para outro novo pacote esparso. Isso, por sua vez, desfragmenta a imagem para você. E, ao mesmo tempo, você pode alterar o sistema de arquivos, o tamanho e até as bandas.

Aqui está um exemplo que fiz recentemente, convertendo minha imagem de "código" de 20 GB que sincronizo entre dispositivos.

$ hdiutil create -size 20g -type SPARSEBUNDLE \
-imagekey sparse-band-size=2048 -fs HFSX \
-volname code -attach ~/sync/images/code.sparsebundle

Veja todas as opções com hdiutil create -help.

Este comando gera:

/dev/disk3              GUID_partition_scheme
/dev/disk3s1            EFI
/dev/disk3s2            Apple_HFS                       /Volumes/code
created: /Users/eric/sync/images/code.sparsebundle

Você pode ver a -attachopção montada abaixo /Volumes/code.

Nota: Uso HSFXpara HFS + com distinção entre maiúsculas e minúsculas, porque também sincronizo minhas imagens com o Linux e as monto. É provável que você queira usá-lo HFS+, pois o macOS normalmente não diferencia maiúsculas de minúsculas.

Agora tudo o que preciso fazer é copiar tudo para o meu novo pacote esparso:

$ cp -r /Volumes/IMG_CODE/ /Volumes/code/

E agora para comparar:

# old sparsebundle
$ du -h ~/sync/images/IMG_CODE.sparsebundle/
15.0G   /Users/eric/sync/images/IMG_CODE.sparsebundle/bands
15.0G   /Users/eric/sync/images/IMG_CODE.sparsebundle/

# new sparsebundle
$ du -h ~/sync/images/code.sparsebundle/
3.0G    /Users/eric/sync/images/code.sparsebundle/bands
3.0G    /Users/eric/sync/images/code.sparsebundle/

Yay. Meu pacote esparso de 15 GB agora está com 3 GB, desfragmentado e as bandas alteradas!

Eric Duncan
fonte
Este método foi reconhecido na pergunta original ... Eu não vou downvote a resposta, porque ele é bem escrito e "informativa", mas .. vamos lá ..
adfaklsdjf
0

Não conheço uma maneira gratuita de fazer isso, mas acredito que o Prosoft Drive Genius fará o que você precisa aqui:

http://www.prosofteng.com/products/drive_genius.php

Você monta o pacote esparso, desfragmenta-o usando o Drive Genius e, em seguida, o

hdiutil compact

comando deve funcionar.

mais palmer
fonte
0

Recuperado 0 bytes de 90,4 GB possível.

Aposto que a unidade que contém o pacote esparso tem cerca de 90 GB de espaço livre? Como pacotes esparsos geralmente podem crescer até o disco ficar cheio, esse espaço é simplesmente relatado como espaço livre disponível ... Você verá as mesmas figuras no Utilitário de Disco. Muito enganador mesmo.

A seguir, algumas dicas:

hdiutil imageinfo image.sparsebundle
Arjan
fonte
0

Eu tinha um pacote esparso problemático que alegava ter 950 GiB ocupado em 1024 GiB (meu SSD tem apenas 320 GiB de tamanho, o que não poderia acontecer). hdi compactnão ajudou.

Eu executei "Primeiros socorros" do Utilitário de Disco nos pacotes E na partição, e esse medidor de espaço livre ajudou a mostrar 20 GiB reais como deveria, e depois hdi compactexecutei sem problemas.

toriningen
fonte