Warum wird die Synchronisierungsoption mit dem Befehl `dd` verwendet?


13

Nach den Anweisungen auf dieser Seite wurden auf der Seite am Ende ein ddBefehl und eine syncOption angezeigt. Der Befehl lautet wie folgt:

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

Ich weiß, was ist ddund wie es funktioniert, aber ich habe noch nie davon gehört oder die syncOption damit verwendet, und der manuelle Seiteneintrag lautet wie folgt:

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

Was ist NULund warum wird es aufgefüllt ibs-size, und warum sollten Sie die Datenblöcke auffüllen und die syncOption mit dem ddBefehl verwenden? Warum nicht einfach und unkompliziert?

Wenn ich versuche, syncden Befehl so auszuführen, wie er mit dem entsprechenden Speicherort und den entsprechenden Werten ist, wird folgende Fehlermeldung angezeigt:

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

Antworten:


21

Sie haben den Befehl falsch verstanden. Es ist:

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

syncist hier ein separater Befehl. Siehe man 1 sync:

NAME
       sync - flush file system buffers

SYNOPSIS
       sync [OPTION]

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

Ein bisschen offensichtlich, warum es verwendet wird, wenn Sie an Caching denken.

Die von ddIhnen gelesene Option ist ein Wert für die 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

Wenn es verwendet würde (was es nicht ist), würde es folgendermaßen verwendet:

dd ... conv=sync

3
Gute Antwort, sehr detailliert. Schön, dass Sie das dd ... conv=syncArgument überhaupt beschreiben .
Byte Commander

Lass dich nicht verspotten! ;-) Gute Antwort: Du hast das Problem entdeckt, das ich nicht einmal gesehen habe. > :-) +1
Fabby

1
Auch aus der Beschreibung der conv=syncOption geht klar hervor, warum sie dafür nicht verwendet wird. Im besten Fall würde es nichts tun, im schlimmsten Fall würde es das Bild während des Kopierens beschädigen.
Kasperd

5
Eigentlich sollten die Anweisungen die Option dd oflag=fsync(die die von dd geschriebene Ausgabe löscht) anstelle eines syncBefehls (der alles auf dem System
löscht) aufrufen

Diese Antwort ist irreführend. Mit dd syncist ein Argument für beide convund die Optionen iflagoder oflag.
Dan Loewenherz

3

Standardmäßig liest dd Daten blockweise ein und liest möglicherweise einen kürzeren Block als den vom Benutzer angegebenen ein, entweder am Ende der Datei oder aufgrund des Verhaltens des Quellgeräts. Dies wird als Teildatensatz bezeichnet . Es wird dann ein Block geschrieben, der dieselbe Größe hat wie die Menge, die er gelesen hat.

Dd wiederholt dies, bis die angegebene Anzahl erreicht ist oder eof bei der Eingabe oder ein Fehler bei der Eingabe oder Ausgabe angezeigt wird. Wenn es fertig ist, gibt dd die Anzahl der vollständigen und teilweisen Datensätze an, die es gelesen und geschrieben hat.

Dieses Verhalten eignet sich gut zum Kopieren einer normalen Datei innerhalb eines Dateisystems oder über eine TCP-Netzwerkverbindung, da dies als Bytestrom betrachtet wird. Andere Dateisystemobjekte wie Raw-DVDs und Magnetbänder erfordern jedoch Schreibgrößen, die innerhalb bestimmter Bereiche liegen und ein rundes Vielfaches einer bestimmten Menge sind (z. B. 512 oder 2048 Byte). Wenn Sie beispielsweise ein Disk-Image mit 255 Spuren von 63 512-Byte-Sektoren haben und auf ein Band schreiben möchten, für das eine Blockgröße von 1024 Byte erforderlich ist, müssen Sie Folgendes tun

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

um sicherzustellen, dass dd nicht versucht, am Ende einen 512-Byte-Block zu schreiben. Der kürzere Block am Ende wird mit Nullen oder Leerzeichen aufgefüllt. Das Auffüllen mit Nullen ist eine sichere und häufige Wahl. Die Option, dass dd mit Leerzeichen aufgefüllt wird, ist in einer anderen Situation nützlich: Konvertieren einer Datei mit Zeilen variabler Länge in eine Datei mit Zeilen fester Länge.


0

Ich habe festgestellt, dass das Linux-System, nicht dd, die Puffer zwischenspeichert. Wenn der Befehl dd abgeschlossen ist, führe ich daher die Synchronisierung als aus

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

Ich habe keine interne dd-Option verwendet, um eine Pufferlöschung zu verursachen. Wenn ich jedoch eine USB-Version einer Distribution erstelle, bin ich normalerweise die einzige auf dem Computer, sodass ich keine Bedenken habe, dass mein veröffentlichter Befehl Schaden anrichtet. Da ich die Synchronisierung als && ausführe, erfolgt die Synchronisierung mit Sudo-Rechten und ich bin sicher, dass der von mir erstellte USB vollständig ist.


0

Sie können die syncOption für die Ausgabe, die im ddBefehl enthalten ist, nach oflagSymbol verwenden:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M oflag=sync
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.