Por que a opção sync é usada com o comando `dd`?


13

Seguindo as instruções nesta página, a página mostrou um ddcomando e uma syncopção no final. O comando é o seguinte:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M sync

Sei o que é dde como funciona, mas nunca ouvi falar ou usei a syncopção e a entrada da página de manual é como:

sync   pad every input block with NULs to  ibs-size;  when  used  with
       block or unblock, pad with spaces rather than NULs

O que é NULe por que é preenchido ibs-sizee por que se preocupar em preencher os blocos de dados e usar a syncopção com o ddcomando? Por que não mantê-lo simples e fácil?

Quando tento executar synccom o comando como está no local e nos valores apropriados, recebo o seguinte erro:

dd: unrecognized operand ‘sync’
Try 'dd --help' for more information. 

Respostas:


21

Você está interpretando mal o comando. Está:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M 
sync

syncé um comando separado, aqui. Veja man 1 sync:

NAME
       sync - flush file system buffers

SYNOPSIS
       sync [OPTION]

DESCRIPTION
       Force changed blocks to disk, update the super block.

Meio óbvio por que é usado quando você pensa em cache.

Quanto à ddopção que você lê, é um valor para a convopção :

Each CONV symbol may be:
   ascii  from EBCDIC to ASCII
   ...
   sync   pad every input block with NULs  to  ibs-size;  when  used  with
          block or unblock, pad with spaces rather than NULs

Se fosse usado (o que não é), seria usado assim:

dd ... conv=sync

3
Boa resposta, muito detalhada. É bom que você descreva o dd ... conv=syncargumento.
Byte Commander

Não deixe que eles te provocem! ;-) Boa resposta: você viu o problema que eu nem vi. > :-) +1
Fabby

1
Também a partir da descrição da conv=syncopção, parece bastante claro por que ela não é usada para isso. Na melhor das hipóteses, não faria nada; na pior, corromperia a imagem durante a cópia.
kasperd

5
Realmente as instruções devem ligar para a opção dd oflag=fsync(que libera o dd saída tem escrito) em vez de um synccomando (que libera tudo no sistema.
psusi

Esta resposta é enganosa. Com dd, syncé um argumento para ambos conve as opções iflagou oflag.
Dan Loewenherz 7/08

3

Por padrão, o dd lerá os dados um bloco por vez, possivelmente lendo um bloco mais curto que o usuário especificado, no final do arquivo ou devido ao comportamento do dispositivo de origem; isso é chamado de registro parcial . Ele gravará um bloco do mesmo tamanho que a quantidade que leu.

Dd repetirá isso até que a contagem especificada seja alcançada, ou ele veja eof na entrada ou erro na entrada ou saída. Quando termina, o dd informa o número de registros completos e parciais que leu e gravou.

Esse comportamento é bom para copiar um arquivo comum em um sistema de arquivos ou em uma conexão de rede TCP, pois é considerado um fluxo de bytes. Mas outros objetos do sistema de arquivos, como DVDs brutos e fita magnética, exigem tamanhos de gravação que estão dentro de determinados intervalos e são um múltiplo redondo de alguma quantidade (como 512 ou 2048 bytes). Por exemplo, se você possui uma imagem de disco com 255 faixas de 63 setores de 512 bytes e deseja gravar em uma fita que requer um tamanho de bloco de 1024 bytes, é necessário fazer algo como

dd if=disk.img of=/dev/rmt0 bs=1k conv=sync

para garantir que o dd não tente gravar um bloco de 512 bytes no final. O bloco mais curto no final será preenchido com zeros ou espaços em branco. Preencher com zeros é uma escolha comum e segura. A opção do dd para preencher com espaços em branco é útil em uma situação diferente - a conversão de um arquivo que possui linhas de comprimento variável em um com linhas de comprimento fixo.


0

Eu descobri que o sistema linux, não o dd, armazena em cache os buffers. Portanto, quando o comando dd for concluído, eu executo sync como

sudo dd if=my.downloaded.iso of=/dev/sd(?) bs=1M && sync

Não usei nenhuma opção dd interna para causar descarga de buffer. Normalmente, quando estou criando uma versão USB de uma distribuição, sou o único no computador, por isso não tenho dúvidas quanto ao meu comando postado causar danos. Como executo a sincronização como &&, a sincronização é feita com direitos sudo e tenho certeza de que o USB que eu criei está completo.


0

Você pode usar a syncopção de saída, incluída no ddcomando, pelo oflagsímbolo:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M oflag=sync
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.