attendre que la commande dd écrive entièrement sur le disque

13

J'utilise la commande dd pour créer une clé USB amorçable à partir d'un fichier iso:

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

Après avoir appuyé sur Entrée, il quitte momentanément et me donne:

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

C'est donc comme courir en arrière-plan parce que je peux voir que le lecteur flash fonctionne. Finalement, il cessera de copier et je peux retirer le lecteur avec succès, mais la question est de savoir pourquoi la commande dd n'attend pas la fin de la copie. Pourquoi fonctionne-t-il en arrière-plan. Et comment puis-je faire attendre?

Kir Ivlev
la source
4
As-tu essayé sync?
choroba
1
@choroba Est-il judicieux d'exécuter la «synchronisation» si le système écrit déjà des données sur le lecteur flash?
Kir Ivlev
Je ne suis pas sûr, byt syncpourrait attendre.
choroba
2
dda également quelques options de synchronisation, par exemple conv=fsync. Cela dit, je n'ai jamais eu à l'utiliser /dev/sd*moi-même avec des lecteurs. Si vous avez littéralement utilisé /dev/sdxma supposition, vous auriez eu un fichier inutile de 959 Mo dans /dev(ramdisk) maintenant ...
frostschutz
1
@frostschutz J'ai utilisé / sdc pour mon lecteur flash
Kir Ivlev

Réponses:

21

Malgré la croyance populaire, ddc'est une commande parfaitement ordinaire, ce n'est pas plus bas que catou cp. Votre commande lit à partir du cache de disque et écrit dans les tampons de disque comme toute autre commande.

Afin de vous assurer que les données sont entièrement écrites sur le support physique, vous devez appeler sync. La commande syncvide tous les tampons de sortie sur le ou les disques. Lorsque la synccommande revient, les données ont été entièrement écrites.

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

La plupart du temps, vous n'avez pas besoin d'appeler sync, car le démontage d'un système de fichiers fait le même travail. Lorsque la umountcommande revient ou lorsque vous recevez un message de confirmation après avoir cliqué sur «Éjecter», les tampons ont été écrits sur le disque. Ici, vous écrivez directement sur le disque sans passer par un système de fichiers monté, vous devez donc vider explicitement le tampon.

Notez qu'au lieu de dd, vous pouvez utiliser tee. Cela a deux avantages: il y a moins de risque d'inverser la source et la destination en raison d'une faute de frappe, et c'est probablement un peu plus rapide .

<~/Desktop/ubuntu.iso sudo tee /dev/sdx >/dev/null; sync
Gilles 'SO- arrête d'être méchant'
la source
1
Que diriez-vous des boutons / icônes "Éjecter" ou "Retirer en toute sécurité". N'appelleraient-ils pas également la synchronisation avant de donner la notification "OK pour supprimer"?
user68186
1
Vous voudrez probablement l'utiliser sudo tee /dev/sdx >/dev/null, sinon le processus de copie serait encore très lent en raison de l'écriture de données sur la sortie de la console.
Lekensteyn
1
@ user68186 Ils n'appellent pas la synccommande, mais ils font le même travail sous le capot.
Gilles 'SO- arrête d'être méchant'
5
Cette réponse est fausse. Sans conv=fdatasync, la ddcommande n'attend pas pour terminer jusqu'à ce que les données soient écrites sur le disque, comme l'OP l'a demandé. De plus, la synccommande planifie une opération de synchronisation, mais elle revient immédiatement; il n'attend pas pour revenir avant que les données soient écrites sur le disque.
vy32
1
@ vy32 vous avez raison ddn'attendra pas que le cache soit vidé sans conv=fdatasyncetc. mais sur un Linux non ancien vous avez tort de syncne pas attendre. Vous pouvez voir coreutils sync(8)faire le sync(2)syscall . La sync(2)page de manuel indique "Avant la version 1.3.20, Linux n'attendait pas la fin des E / S avant de revenir." il sync(8)ne reviendra donc pas tant que le disque n'aura pas reconnu les écritures (ou qu'une erreur ne se produira).
Anon
13

Essaye ça:

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

Le conv=fdatasyncindique ddd'utiliser les options spéciales pour s'assurer que les données sont écrites sur le périphérique physique.

vy32
la source