Divida uma imagem do dd em vários arquivos

4

Estou fazendo algumas recuperações de dados de um disco rígido. O disco tem cerca de 300GB de dados, mas falta outro disco rígido com 300GB de espaço livre.

Eu tenho três HDs, com 150, 40 e 120 GB gratuitos.

Para a criação do primeiro bloco, eu estava pensando em fazer o seguinte:

sudo dd if=/dev/sdf1 bs=4096 count=150G | gzip > img1.gz

O que devo executar nas outras máquinas para "continuar de onde parei"?

    
por lfaraone 20.11.2009 / 22:46

5 respostas

4

Você provavelmente quer considerar usar tar , como diz o KPWINC, mas para responder sua pergunta diretamente, você quer usar a opção "skip" de dd .

Se o seu primeiro comando, como dito, é:

sudo dd if=/dev/sdf1 bs=4096 count=150GB | gzip > img1.gz

Então seu segundo seria:

sudo dd if=/dev/sdf1 bs=4096 skip=150GB count=40GB | gzip > img2.gz

e terceiro:

sudo dd if=/dev/sdf1 bs=4096 skip=190GB count=120GB | gzip > img3.gz

Dito isso, não tenho certeza se o sufixo "GB" faz o que você pretende. Eu acho que apenas faz matemática bruta no número de raiz que segue, não descobrir como obter tantos gigabytes do tamanho do bloco que você deu. Eu faria algo assim:

dd if=/dev/sdf1 bs='expr 10 * 1024 * 1024' count='expr 15 * 1024 * 1024 * 1024'

apenas para ter certeza da matemática.

Ah, e certifique-se de que seu dispositivo não esteja mudando abaixo de você enquanto você o copia. Isso seria ruim.

    
por 21.11.2009 / 01:22
3

Uma solução simples pode ser simplesmente usar "/ usr / bin / split". Apenas quebra arquivos em pedaços. Você pode usar "-" como o nome do arquivo de entrada para ler a entrada padrão. O interessante da divisão é que ela é simples, não afeta o toolchain de maneira alguma e você pode "unir" os arquivos usando apenas "cat" para agrupá-los novamente (ou enviá-los para outro aplicativo).

    
por 22.11.2009 / 19:30
1

Algumas coisas aqui. Primeiro, o comando que você listou provavelmente não funcionará como você está esperando. Parece que você está tentando acertar 150 GB, mas precisa levar em conta tanto o tamanho do bloco quanto a contagem (a contagem é o número de blocos do tamanho do bloco). Portanto, se você quiser 150 GB, poderá fazer bs=1GB count=150 . Você poderia então continuar de onde parou adicionando um skip=150 para pular 150 blocos (cada um com 1 GB) na segunda corrida. Além disso, para que o gzip envie sua saída para o padrão, você precisa passar a opção -c .

No entanto, antes de fazer isso, algumas outras perguntas. Você está usando o dd aqui porque o sistema de arquivos está corrompido / danificado / etc e você precisa de uma cópia exata da imagem de disco bit-a-bit dele? Ou você está apenas tentando tirar os dados? Uma ferramenta com reconhecimento de sistema de arquivos pode ser mais eficaz. Particularmente se o sistema de arquivos de origem não estiver cheio. As opções incluem tar ou talvez você queira procurar algo como Clonezilla , Partclone , Partimage , ou para uma opção mais específica do Windows para acessar diretamente um sistema de arquivos do Windows, Linux-NTFS (note que as ferramentas mencionadas anteriormente também podem lidar com sistemas de arquivos do Windows em vários níveis).

Se você estiver configurado para operar na partição com um programa que não seja compatível com sistema de arquivos, então, usar sua linha dd (conforme a modificação acima para estar correta) provavelmente funcionará. É difícil dizer quão bem ele será compactado, mas deve ser menor que o sistema de arquivos original. Se você tiver acesso de leitura / gravação ao sistema de arquivos original, valeria a pena preencher o espaço livre com um arquivo gravado de / dev / zero para zerar o espaço não utilizado antes de salvá-lo com dd. Isso aumentará a capacidade do gzip de compactar o espaço livre na imagem do disco.

Para operar no segundo fragmento, basta adicionar um skip=XXX bit à sua segunda invocação dd, em que 'XXX' é igual ao valor count= que você forneceu na primeira vez. Se você quisesse fazer 150 GB em seu primeiro e 40 em seu segundo, você poderia fazer:

sudo dd if=/dev/sdf1 bs=1GB count=150 | gzip -c > img1.gz

seguido por:

sudo dd if=/dev/sdf1 bs=1GB skip=150 count=40 | gzip -c > img2.gz

    
por 24.11.2009 / 17:43
0

tar

O tar pode resolver o seu problema. Ele tem a capacidade de dividir arquivos em vários volumes.

Confira este link:

link

Da página:

The two extra command line options you need to use over and above the standard syntax are -M (--multi-volume) which tells Tar you want to split the file over multiple media disks. You then need to tell Tar how big that media is, so that it can create files of the correct size. To do this you use the --tape-length option, where the value you pass is number x 1024 bytes.

The example below shows the syntax used. Lets say the largefile.tgz is 150 Meg and we need to fit the file on two 100 Meg Zip drives.

tar -c -M --tape-length=102400 --file=disk1.tar largefile.tgz

The value 102400 is 1024 x 100, which will create a 100 Meg file called disk1.tar and then Tar will prompt for volume 2 like below :-

Prepare volume #2 for disk1.tar and hit return:

In the time of tape drives you would have taken the first tape out of the machine and inserted a new tape, and pressed return to continue. As we want Tar to create the remaining 50 Meg in a separate file, we issue the following command :-

n disk2.tar

This instructs Tar to continue writing the remaining 50 Meg of largefile.tgz to a file named disk2.tar. You will then be prompted with the line below, and you can now hit return to continue.

Prepare volume #2 for disk2.tar and hit return:

You would repeat this process until your large file has been completely processed, increasing the disk number in the filename each time you are prompted.

    
por 20.11.2009 / 22:50
0

Chegou atrasado para a festa, mas eu tive que fazer um script para fazer backup de um sistema de arquivos desconhecido em um stick FAT32.

Este script simples funciona para mim:

# Sets pipefail so failed dd makes the whole pipe command fail
set -o pipefail
dd_result=0
split=0
filenameSplit=
while [ $dd_result == 0 ]
do
    cmd="dd if=/dev/sdX bs=2G count=1 skip=$split | pigz --fast > \"2G.$filenameSplit.myharddisk.gz\""
    echo $cmd
    eval $cmd
    dd_result=$?
    split=$((split + 1))
    filenameSplit=$split
done

EDIT: Ter feito upload de um script de restauração de backup básico que usa compactação dd, pigz ou gzip e divide os arquivos em partes que podem ser definidas na linha de comando. Script encontrado aqui: github.com/deajan/linuxscripts

    
por 23.03.2016 / 14:52