O `dd` nunca termina no OS X

0

Trabalhando no Linux e no OS X (10.10.5), estou usando a ferramenta de linha de comando dd para copiar o conteúdo de uma unidade flash USB de e para um arquivo compactado. Para criar o arquivo, eu uso o seguinte em uma unidade desmontada (no Linux o formato é algo como /dev/sdb; no OS X é algo como /dev/disk2):

sudo dd if=/dev/disk1 bs=1m | gzip -c > disk.image.gz

que copia o conteúdo da unidade inteira, compacta e grava em disk.image.gz. Para descompactar a imagem em uma nova unidade, eu uso:

cat disk.image.gz | gunzip -c | sudo dd of=/dev/disk1 bs=1m

que pega a imagem de disco compactada, descompacta e grava na unidade. (Você pode verificar o progresso de qualquer comando executando o seguinte em uma janela separada no Linux:

sudo killall -USR1 dd

ou no OS X:

sudo killall -INFO dd

que, em ambos os casos, sinaliza ddpara a saída de duas linhas na quantidade de dados transferidos.)

Ambos os processos funcionam bem no Linux. No entanto, embora a leitura e a compactação funcionem bem no OS X, a descompactação e gravação nunca terminam. ddmantém a gravação de dados e mais dados, mesmo que o arquivo de origem (descompactado) tenha terminado e a unidade de disco esteja cheia. Se eu esperar até que mais dados sejam gravados do que deveriam caber na unidade flash e, em seguida, ^Cencerrar o comando, a unidade resultante parecerá montar e operar perfeitamente. Mas, me preocupa que o comportamento não seja o que eu espero.

Alguma idéia de por que dda gravação nunca termina, mesmo que não esteja mais recebendo dados?

(BTW: se você estiver usando isso como instruções para gravar seus próprios discos, TENHA CERTEZA você tem os identificadores de dispositivo correto (por exemplo, o /dev/sdbou /dev/disk2mencionado acima). ddFaz exatamente o que você diga a ele para fazer, por isso, se você pegar o identificador errado e peça para ele sobrescrever sua unidade de inicialização; isso será feito com prazer. Procure em outro lugar como determinar o dispositivo certo.)

Daniel Griscom
fonte
1
Tem certeza de que os identificadores de unidade estão corretos? No OS X, eles são /dev/disk1, /dev/disk2etc.
Allan
Sim; meus exemplos usavam os identificadores do Linux, mas no OS XI usava /dev/disk2(checando três vezes para não danificar minha unidade de inicialização). Vou esclarecer na pergunta.
Daniel Griscom
@DanielGriscom Você pode querer usá-lo em cpvez de ddnão ter necessidades especiais e apenas desejar copiar o conteúdo de um dispositivo de bloco.
Max Ried
@DanielGriscom Ou catse você quiser colocá-lo em algum lugar.
Max Ried
@DanielGriscom Além disso: você deve usar dispositivos rdisk para essas ações: superuser.com/questions/631592/…
Max Ried

Respostas:

1

Isso pode realmente não responder à pergunta, mas pode fornecer uma solução.

Em vez de usar o ddque parece se comportar de maneira estranha para você, use catou cp. Pelo menos no OS X, eles funcionam muito bem em dispositivos de bloco. Assim:

sudo dd if=/dev/disk1 bs=1m | gzip -c > disk.image.gz

torna-se

sudo cat /dev/disk1 | gzip -c > disk.image.gz


Se você quiser o inverso, apenas redirecione gunzipa saída:

cat disk.image.gz | gunzip -c | sudo dd of=/dev/disk1 bs=1m

torna-se

gunzip -c disk.image.gz | sudo tee /dev/disk1 > /dev/null

Se você deseja apenas copiar um dispositivo de bloco

sudo dd if=/dev/disk1 of=disk.image bs=1m

torna-se

sudo cp /dev/disk1 disk.image

Se você deseja apenas copiar uma imagem para um dispositivo de bloco (por exemplo, Raspbian para cartão SD)

sudo dd if=disk.image of=/dev/disk1 bs=1m

torna-se

sudo cp disk.image /dev/disk1

Isso também evita problemas com tamanhos de bloco.

Max Ried
fonte
Eu apenas tentei o acima gunzip -c disk.image.gz | sudo tee /dev/disk1 > /dev/nullduas vezes. Ele falhou uma vez (continuando muito mais tempo do que o esperado; não pude medir os dados transferidos porque não estava usando dd) e foi bem-sucedido uma vez. Parece que algo mais está acontecendo.
Daniel Griscom
@DanielGriscom Existe um projeto de código aberto chamado progressanteriormente cvque exibe o progresso de muitos utilitários. Você pode tentar isso.
Max Ried