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

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

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é exatamente do mesmo tamanho que uma das partições em disk.image. Gostaria de copiar os dados dele para o disk.imagearquivo no local correto.

Eu tenho um script que calcula o deslocamento adequado e tenta fazer isso com dd. Presumi que isso funcionaria porque funciona com um dispositivo de bloco, mas 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 evitar ddtruncar o arquivo?

fs.imageestá compactado como fs.image.bz2e o comando que estou executando é assim:

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

onde $OFFSETestá meu deslocamento computado.

Pensei em outras maneiras de fazer isso, mas esta parece ser a mais simples (se funcionou). Uma opção seria copiar os 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 copiaria muitos dados que realmente não preciso. Estou aberto a outras opções.

Responder1

GNU dd(pelo menos versão 8.23) tem o seguintesinalizador de conversão

não truncado não trunque o arquivo de saída

que faz exatamente o que você deseja; 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

informação relacionada