aguarde o comando dd gravar totalmente no disco

13

Estou usando o comando dd para criar um usb inicializável a partir do arquivo iso:

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx bs=1M

Depois de pressionar enter, ele momentaneamente sai e me dá:

915+0 records in 915+0 records out 959447040 bytes (959 MB) copied,
0.539375 s, 1.8 GB/s

Então é como rodar em segundo plano, porque posso ver que a unidade flash está funcionando. Eventualmente, ele interromperá a cópia e eu posso remover a unidade com êxito, mas a questão é por que o comando dd não aguarda a conclusão da cópia. Por que ele é executado em segundo plano? E como posso esperar?

Kir Ivlev
fonte
4
Você já tentou sync?
choroba
1
@choroba Faz sentido executar 'sync' se o sistema já estiver gravando dados na unidade flash?
91113 Kir Ivlev
Não tenho certeza, byt syncpode esperar.
choroba
2
ddtambém possui algumas opções de sincronização, por exemplo conv=fsync. Dito isto, nunca precisei usá-lo com /dev/sd*unidades. Se você usou literalmente /dev/sdxo meu palpite teria sido você tinha um arquivo inútil 959MB no /dev(ramdisk) agora ...
frostschutz
1
@frostschutz eu usei / SDC para o meu flash drive
Kir Ivlev

Respostas:

21

Apesar da crença popular, ddé um comando perfeitamente comum, não é mais de baixo nível do que catou cp. Seu comando lê do cache do disco e grava nos buffers de disco como qualquer outro comando.

Para garantir que os dados sejam totalmente gravados na mídia física, é necessário ligar sync. O comando synclibera todos os buffers de saída no (s) disco (s). Quando o synccomando retorna, os dados foram totalmente gravados.

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx bs=1M; sync

Na maioria das vezes, você não precisa ligar sync, porque desmontar um sistema de arquivos faz o mesmo trabalho. Quando o umountcomando retorna, ou quando você recebe uma mensagem de confirmação após clicar em “Ejetar”, os buffers foram gravados no disco. Aqui, você está gravando diretamente no disco sem passar por um sistema de arquivos montado, portanto, é necessário liberar explicitamente o buffer.

Observe que, em vez de dd, você pode usar tee. Isso tem duas vantagens: há menos risco de inverter a origem e o destino devido a um erro de digitação e provavelmente é um pouco mais rápido .

<~/Desktop/ubuntu.iso sudo tee /dev/sdx >/dev/null; sync
Gilles 'SO- parar de ser mau'
fonte
1
Que tal os botões / ícones "Ejetar" ou "Remover com segurança". Eles também não chamariam a sincronização antes de enviar a notificação "OK para remover"?
User68186
1
Você provavelmente deseja usar sudo tee /dev/sdx >/dev/null, caso contrário, o processo de cópia ainda seria muito lento devido à gravação de dados na saída do console.
Lekensteyn
1
@ user68186 Eles não chamam o synccomando, mas fazem o mesmo trabalho sob o capô.
Gilles 'SO- stop be evil'
5
Esta resposta está errada. Sem conv=fdatasync, o ddcomando não espera para concluir até que os dados sejam gravados no disco, conforme solicitado pelo OP. Além disso, o synccomando agenda uma operação de sincronização, mas retorna imediatamente; ele não espera para retornar até que os dados sejam gravados no disco.
vy32
1
@ vy32 você está certo dd, não esperará que o cache seja liberado sem conv=fdatasyncetc., mas no Linux não antigo você está incorreto em syncnão esperar. Você pode ver os coreutils sync(8)fazendo o sync(2)syscall . A sync(2)página de manual diz "Antes da versão 1.3.20, o Linux não esperava a conclusão da E / S antes de retornar". portanto sync(8), não retornará até que o disco reconheça as gravações (ou um erro seja acionado).
Anon
13

Tente o seguinte:

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx conv=fdatasync bs=1m

O conv=fdatasyncdiz ddpara usar as opções especiais para garantir que os dados sejam gravados no dispositivo físico.

vy32
fonte