Copiar dados do arquivo para um local específico de outro arquivo com dd trunca o arquivo de saída

1

Eu tenho um arquivo de loopback que contém um único sistema de arquivos, vamos chamá-lo de fs.image . Eu tenho outro arquivo de loopback muito maior que contém várias partições e vários sistemas de arquivos, vamos chamá-lo de disk.image .

fs.image tem exatamente o mesmo tamanho de uma das partições em disk.image . Gostaria de copiar os dados do arquivo disk.image para o local correto.

Eu tenho um script que calcula o deslocamento correto e tenta fazer isso com dd . Presumi que isso funcionaria porque funciona com um dispositivo de bloco, mas esse não é o caso. disk.image é truncado na posição imediatamente após os dados que acabaram de ser gravados nele.

Existe alguma maneira de impedir que dd trunque o arquivo?

fs.image é compactado como fs.image.bz2 , e o comando que estou executando é assim:

bzcat fs.image.bz2 | dd of=disk.image bs=4M seek=$OFFSET

em que $OFFSET é meu deslocamento computado.

Pensei em outras maneiras de realizar isso, mas isso parece ser o mais simples (se funcionou). Uma vez a opção seria copiar dados até o ponto de inserção em outro arquivo, anexar o sistema de arquivos e, finalmente, anexar o restante do arquivo original. No entanto, isso seria lento porque eu estaria copiando muitos dados que realmente não preciso. Estou aberto a outras opções.

    
por Steve 17.04.2015 / 20:42

1 resposta

1

O dd do GNU (pelo menos a versão 8.23) tem o seguinte sinalizador de conversão

notrunc do not truncate the output file

que faz exatamente o que você quer; aqui está um pequeno exemplo:

$ cat foo
foobar
$ echo -n XX | dd of=foo bs=1c seek=1 conv=notrunc
2+0 records in
2+0 records out
2 bytes (2 B) copied, 0.000283698 s, 7.0 kB/s
$ cat foo
fXXbar
    
por 17.04.2015 / 21:16