Warten Sie, bis der Befehl dd vollständig auf die Festplatte geschrieben hat

13

Ich benutze den Befehl dd, um einen bootfähigen USB aus einer ISO-Datei zu erstellen:

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

Nach dem Drücken der Eingabetaste wird es kurz beendet und gibt mir:

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

Es ist also so, als würde man im Hintergrund laufen, weil ich sehen kann, dass das Flash-Laufwerk funktioniert. Irgendwann hört der Kopiervorgang auf und ich kann das Laufwerk erfolgreich entfernen, aber die Frage ist, warum der Befehl dd nicht auf den Abschluss des Kopiervorgangs wartet. Warum läuft es im Hintergrund. Und wie kann ich es warten lassen?

Kir Ivlev
quelle
4
Hast du es versucht sync?
Choroba
1
@choroba Ist es sinnvoll, die Synchronisierung auszuführen, wenn das System bereits Daten auf das Flash-Laufwerk schreibt?
Kir Ivlev
Ich bin mir nicht sicher, ob ich syncwarte.
Choroba
2
ddhat auch einige Synchronisierungsoptionen, zum Beispiel conv=fsync. Das heißt, ich musste es nie mit /dev/sd*Laufwerken selbst verwenden. Wenn Sie buchstäblich /dev/sdxmeine Vermutung verwendet hätten, hätten Sie eine nutzlose 959MB-Datei in /dev(Ramdisk) jetzt ...
Frostschutz
1
@ Frostschutz Ich verwendete / sdc für mein Flash-Laufwerk
Kir Ivlev

Antworten:

21

Trotz der weitverbreiteten Meinung ddist es ein ganz gewöhnlicher Befehl, der nicht niedriger ist als catoder cp. Ihr Befehl liest aus dem Festplatten-Cache und schreibt wie jeder andere Befehl in die Festplattenpuffer.

Um sicherzustellen, dass die Daten vollständig auf den physischen Datenträger geschrieben sind, müssen Sie anrufen sync. Der Befehl synclöscht alle Ausgabepuffer auf die Festplatte (n). Wenn der syncBefehl zurückgegeben wird, wurden die Daten vollständig geschrieben.

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

Die meiste Zeit müssen Sie nicht anrufen sync, da das Abmelden eines Dateisystems denselben Job ausführt. Wenn der umountBefehl zurückgegeben wird oder wenn Sie nach dem Klicken auf „Eject“ eine Bestätigungsmeldung erhalten, wurden die Puffer auf die Festplatte geschrieben. In diesem Fall schreiben Sie direkt auf die Festplatte, ohne ein bereitgestelltes Dateisystem zu durchlaufen. Daher müssen Sie den Puffer explizit leeren.

Beachten Sie, dass Sie anstelle von verwenden ddkönnten tee. Dies hat zwei Vorteile: Es besteht ein geringeres Risiko, die Quelle und das Ziel aufgrund eines Tippfehlers zu invertieren, und es ist wahrscheinlich etwas schneller .

<~/Desktop/ubuntu.iso sudo tee /dev/sdx >/dev/null; sync
Gilles 'SO - hör auf böse zu sein'
quelle
1
Wie wäre es mit den Schaltflächen / Symbolen "Auswerfen" oder "Sicher entfernen"? Würden sie nicht auch die Synchronisierung aufrufen, bevor sie die Benachrichtigung "Entfernen OK" geben?
User68186
1
Sie möchten wahrscheinlich verwenden sudo tee /dev/sdx >/dev/null, da sonst der Kopiervorgang immer noch sehr langsam ist, da Daten auf die Konsolenausgabe geschrieben werden.
Lekensteyn
1
@ user68186 Sie rufen den syncBefehl nicht auf, erledigen jedoch den gleichen Job unter der Haube.
Gilles 'SO- hör auf böse zu sein'
5
Diese Antwort ist falsch. Ohne wartet conv=fdatasyncder ddBefehl nicht, bis die Daten wie vom OP angefordert auf die Festplatte geschrieben wurden. Darüber hinaus syncplant der Befehl eine Synchronisierungsoperation, die jedoch sofort zurückgegeben wird. Die Rückkehr wird erst abgewartet, nachdem die Daten auf die Festplatte geschrieben wurden.
VY32
1
@ vy32 du hast recht und wartest ddnicht darauf, dass der Cache ohne conv=fdatasyncetc. geleert wird, aber unter nicht altem Linux bist du falsch, wenn du syncnicht wartest. Sie können sehen, wie Coreutils sync(8)den sync(2)Syscall machen . Auf sync(2)der Manpage steht : "Vor Version 1.3.20 hat Linux nicht auf den Abschluss von I / O gewartet, bevor es zurückkehrte." So sync(8)wird nicht zurückgegeben, bis der Datenträger die Schreibvorgänge bestätigt (oder ein Fehler ausgelöst wird).
Anon
13

Versuche dies:

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

Das conv=fdatasyncweist Sie ddan, die speziellen Optionen zu verwenden, um sicherzustellen, dass die Daten auf das physische Gerät geschrieben werden.

vy32
quelle