Pourquoi l'option de synchronisation est-elle utilisée avec la commande `dd`?


13

En suivant les instructions sur cette page, la page montrait une ddcommande et une syncoption à la fin. La commande est la suivante:

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

Je sais ce que c'est ddet comment ça marche mais je n'ai jamais entendu parler de l' syncoption ni utilisé avec elle et son entrée de page de manuel est comme:

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

Qu'est-ce que c'est NULet pourquoi est-il complété ibs-size, et pourquoi s'embêter à remplir les blocs de données et utiliser l' syncoption avec la ddcommande? Pourquoi ne pas rester simple et facile?

Lorsque j'essaie d'exécuter syncla commande telle qu'elle est avec l'emplacement et les valeurs appropriés, j'obtiens l'erreur suivante:

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

Réponses:


21

Vous lisez mal la commande. Ses:

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

syncest une commande distincte, ici. Voir man 1 sync:

NAME
       sync - flush file system buffers

SYNOPSIS
       sync [OPTION]

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

Un peu évident pourquoi il est utilisé une fois que vous pensez à la mise en cache.

Quant à l' ddoption que vous lisez, c'est une valeur pour l' convoption :

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

S'il était utilisé (ce qui n'est pas le cas), il serait utilisé ainsi:

dd ... conv=sync

3
Bonne réponse, très détaillée. Ravi que vous décriviez même l' dd ... conv=syncargument.
Byte Commander

Ne les laissez pas vous narguer! ;-) Bonne réponse: vous avez repéré le problème que je n'ai même pas vu. > :-) +1
Fabby

1
D'après la description de l' conv=syncoption, il semble assez clair pourquoi elle n'est pas utilisée pour cela. Au mieux, cela ne ferait rien, au pire, cela corromprait l'image lors de la copie.
kasperd

5
Vraiment, les instructions devraient appeler l'option dd oflag=fsync(qui vide la sortie écrite par dd) au lieu d'une synccommande (qui vide tout sur le système.
psusi

Cette réponse est trompeuse. Avec dd, syncest un argument à la fois convet aux options iflagou oflag.
Dan Loewenherz

3

Par défaut, dd lira les données un bloc à la fois, éventuellement dans un bloc plus court que celui spécifié par l'utilisateur, soit à la fin du fichier, soit en raison du comportement du périphérique source; c'est ce qu'on appelle un enregistrement partiel . Il écrira ensuite un bloc de la même taille que le montant lu.

Dd le répétera jusqu'à ce que le nombre spécifié soit atteint, ou qu'il voit eof en entrée, ou une erreur en entrée ou en sortie. Une fois terminé, dd indique le nombre d'enregistrements complets et partiels qu'il a lus et écrits.

Ce comportement convient parfaitement pour copier un fichier ordinaire dans un système de fichiers ou sur une connexion réseau TCP, car cela est considéré comme un flux d'octets. Mais d'autres objets du système de fichiers, tels que les DVD bruts et les bandes magnétiques, nécessitent des tailles d'écriture qui se situent dans certaines plages et sont un multiple arrondi d'une certaine quantité (comme 512 ou 2048 octets). Par exemple, si vous avez une image disque de 255 pistes de 63 secteurs de 512 octets et que vous souhaitez écrire sur une bande qui nécessite une taille de bloc de 1024 octets, vous devez faire quelque chose comme

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

pour vous assurer que dd n'essaie pas d'écrire un bloc de 512 octets à la fin. Le bloc le plus court à la fin sera rembourré avec des zéros ou des blancs. Le rembourrage avec des zéros est un choix sûr et commun. L'option pour dd de remplir avec des blancs est utile dans une situation différente - convertir un fichier qui a des lignes de longueur variable en un fichier avec des lignes de longueur fixe.


0

J'ai trouvé que le système Linux, pas dd, met en cache les tampons. Par conséquent, lorsque la commande dd est terminée, j'exécute la synchronisation en tant que

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

Je n'ai utilisé aucune option dd interne pour provoquer le vidage du tampon. Cependant, lorsque je crée une version USB d'une distribution, je suis le seul sur l'ordinateur, donc je n'ai aucun scrupule à ce que ma commande publiée fasse du mal. Puisque j'exécute la synchronisation en tant que &&, la synchronisation se fait avec les droits sudo et je suis sûr que l'USB que je crée est terminé.


0

Vous pouvez utiliser l' syncoption de sortie, qui est incluse dans la commande dd, par oflagsymbole:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M oflag=sync
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.