Você pode criar uma imagem compactada:
gzip < /dev/hdd > hdd.img.gz
Para restaurar:
gunzip < hdd.img.gz > /dev/hdd
Se nunca foi usado, recém-saído da fábrica, o espaço livre não deve ser randomizado e a imagem compactada resultante deve ser bem pequena.
Se o espaço livre for zero, você também poderá fazer uma imagem esparsa (em um sistema de arquivos que suporte arquivos esparsos):
dd bs=4K conv=sparse if=/dev/hdd of=hdd.sparse.img
Para restaurar: (não deve usar esparsos na restauração)
dd bs=1M if=hdd.sparse.img of=/dev/hdd
Para verificar quanto espaço de armazenamento esse arquivo realmente usa:
du -h hdd.sparse.img
A vantagem da imagem esparsa é que ela é descompactada e aparece com o tamanho original (embora não esteja realmente usando espaço para zeros), portanto, você poderia montá-la somente leitura ou tentar inicializá-la em uma máquina virtual. Se a VM for sua meta, você também pode estar interessado em qemu-img
.
Fazê-lo no local seria interessante. Isso envolveria o armazenamento em cache de muitos dos dados na RAM, e então criaria um sistema de arquivos (no offset de 1MiB) não maior do que o que já foi armazenado em cache, preenchendo-o com o acima e expandindo o sistema de arquivos. Depois disso, você pode criar uma partição que começa em 1 MiB e qualquer tamanho que tenha terminado para atuar como sua partição de recuperação. Esta é a solução envolvida e perigosa se o processo for interrompido.
Você pode fazer isso cegamente assim:
gzip --verbose < /dev/hdd > /dev/hdd
mas isso torna as suposições como, compactadas sempre menores que os dados não compactados, e não escreverão o cabeçalho gzip antes de ler os dados e tais coisas. Pode funcionar (exemplo abaixo), mas não há garantias.
# md5sum /dev/loop0
dd409e37f092ce049c396b99b32366fb /dev/loop0
# xz --verbose < /dev/loop0 > /dev/loop0
100 % 1,027.4 KiB / 8,192.0 KiB = 0.125
# unxz --verbose < /dev/loop0 | md5sum
--- % 1,027.4 KiB / 8,192.0 KiB = 0.125
unxz: (stdin): Compressed data is corrupt
--- % 1,027.4 KiB / 8,192.0 KiB = 0.125
dd409e37f092ce049c396b99b32366fb -
E então você ainda tem que descobrir o que fazer com isso. Neste exemplo, você teria que mover 1028 KiB em outro lugar (mudar por 1 MiB, criar uma partição desse tamanho e, em seguida, você terá sua partição de recuperação).
Também pode considerar fazer isso de trás para frente (para que a imagem termine no final do disco).