Como escrever uma imagem de disco de volta para sua própria fonte?

1

Estou tentando criar uma imagem de /dev/sda e gravar a saída em um novo arquivo .iso no mesmo dispositivo. Como posso excluir o novo arquivo de imagem? de modo a evitar que a saída se torne sua própria entrada e vice-versa? Como você pode ver, acaba criando algo como um loop de feedback infinito (como um ouroboros), até que não haja mais espaço livre.

root@linux:~# df /dev/sda1
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sda1      303569136   4313624 283812008   2% /
root@linux:~# dd if=/dev/sda of=/root/image.iso
306419534336 bytes (306 GB, 285 GiB) copied, 10098.4 s, 30.3 MB/s
dd: writing to '/root/image.iso': No space left on device
598483361+0 records in
598483360+0 records out
306423480320 bytes (306 GB, 285 GiB) copied, 10099.5 s, 30.3 MB/s
root@linux:~# df /dev/sda1
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sda1      303569136 303552756         0 100% /
root@linux:~# ls -sh /root/
total 286G
286G image.iso
    
por tjt263 21.02.2017 / 21:59

2 respostas

2

Você não pode chegar lá a partir daqui.

Em vez disso, você não pode fazer o que está tentando fazer. Lembre-se que dd apenas lê e escreve blocos ... quando você aponta para / dev / sda, ele continua, como você percebeu.

Você pode fazê-lo se tiver certeza de que seu disco está totalmente sem fragmentação, de modo que os dados fiquem todos voltados para trás e apenas dd tantos blocos (para obter seus dados, mas pare antes de chegar onde você está escrevendo ). Verifique o tamanho do bloco (bs) e conte para dd.

O que pode funcionar para você é se você criar um arquivo vazio de tamanho suficiente, gravar um sistema de arquivos nele, montá-lo e depois usar o rsync para copiar seus dados para o novo sistema de arquivos. Então, apenas desmonte seu arquivo esparso e você terá uma "imagem" de um sistema de arquivos com todos os seus dados.

    
por 21.02.2017 / 22:11
2

Você está pedindo para o dd ler os blocos do dispositivo, não o conteúdo do arquivo. Se você quiser ler os dados do sistema de arquivos, você pode usar um dos utilitários de despejo; para ext, ele é dump ; outros, como o XFS, têm um prefixo xfs_ .

Essencialmente, o que você poderia fazer é usar LVM ou ZFS e tirar um instantâneo, isso não consumiria os dados da mesma maneira que você não vai duplicar, mas só copiará quando os dados subjacentes forem alterados (cópia -on-write).

O que o dd vai fazer é iniciar um bloco 0, continuar pelo dispositivo inteiro até chegar ao cilindro final, e não há como armazenar os dados brutos em menos espaço do que ele veio. Se o disco for preenchido primeiro com zeros:

dd if=/dev/zero of=/root/space_hog

Você pode então remover este arquivo e imediatamente fazer o dd através de uma ferramenta de compressão:

dd if=/dev/sda | gzip > /root/image.iso.gz

Demorará um pouco mais, pois a compactação de dados aleatórios (a troca neste dispositivo?) é um trabalho complicado.

    
por 21.02.2017 / 22:09