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?
command-line
bash
Kir Ivlev
fonte
fonte
sync
?sync
pode esperar.dd
também possui algumas opções de sincronização, por exemploconv=fsync
. Dito isto, nunca precisei usá-lo com/dev/sd*
unidades. Se você usou literalmente/dev/sdx
o meu palpite teria sido você tinha um arquivo inútil 959MB no/dev
(ramdisk) agora ...Respostas:
Apesar da crença popular,
dd
é um comando perfeitamente comum, não é mais de baixo nível do quecat
oucp
. 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 comandosync
libera todos os buffers de saída no (s) disco (s). Quando osync
comando retorna, os dados foram totalmente gravados.Na maioria das vezes, você não precisa ligar
sync
, porque desmontar um sistema de arquivos faz o mesmo trabalho. Quando oumount
comando 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 usartee
. 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 .fonte
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.sync
comando, mas fazem o mesmo trabalho sob o capô.conv=fdatasync
, odd
comando não espera para concluir até que os dados sejam gravados no disco, conforme solicitado pelo OP. Além disso, osync
comando agenda uma operação de sincronização, mas retorna imediatamente; ele não espera para retornar até que os dados sejam gravados no disco.dd
, não esperará que o cache seja liberado semconv=fdatasync
etc., mas no Linux não antigo você está incorreto emsync
não esperar. Você pode ver os coreutilssync(8)
fazendo osync(2)
syscall . Async(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". portantosync(8)
, não retornará até que o disco reconheça as gravações (ou um erro seja acionado).Tente o seguinte:
O
conv=fdatasync
dizdd
para usar as opções especiais para garantir que os dados sejam gravados no dispositivo físico.fonte