Pourquoi dd n'attend-il pas parfois que les données soient écrites?

20

Parfois, lorsque j'écris des images sur un lecteur flash, cela se produit:

$ sudo dd if=install57.fs of=/dev/sdc
573440+0 records in
573440+0 records out
293601280 bytes (294 MB) copied, 0.549231 s, 535 MB/s

Fondamentalement, Linux met tout en cache, n'écrit rien et se ddferme. Après avoir tapé sync, il commence à écrire les données (la LED du lecteur flash commence à clignoter).

Pourquoi cela arrive-t-il?

jgillich
la source
3
Êtes-vous sûr que /dev/sdcvotre système est un périphérique réel et que vous n'écrivez pas dans un fichier /dev/sdc? Faites un ls --color /dev- /dev/sdcdevrait être jaune s'il s'agit d'un appareil.
LawrenceC

Réponses:

21

Utilisez-le à la place:

sudo dd if=install57.fs of=/dev/sdc conv=fsync

Cela appelle le fsync()après chaque write()appel système. Cela oblige à ddne rien mettre en cache. Voir cette partie de la page de manuel de fsync ( man 2 fsync):

fsync() transfers ("flushes") all modified in-core data of (i.e., modified buffer cache 
pages for) the file referred to by the file descriptor fd to the disk device (or other 
permanent storage device) where that file resides. The call blocks until the device reports 
that the transfer has completed. It also flushes metadata information associated with the 
file (see stat(2)).

Il s'agit du comportement par défaut des noyaux. Les noyaux Linux gèrent les caches d'écriture et de lecture comme ceci: Lorsque l' write()appel système est émis, les données sont rapidement écrites dans le cache et un état d'écriture terminée est envoyé au processus. Lorsque le tampon est nécessaire ou lorsqu'il y a du temps libre sur le bus, les données sont écrites du cache sur le disque dur.

le chaos
la source
1
J'aime que votre réponse et la mienne couvrent des approches presque entièrement différentes. Nice, +1.
ChrisInEdmonton
1
@ChrisInEdmonton dito +1
chaos
toutes les réponses sont bonnes dans cette question.
Francisco Tapia
@chaos Juste pour clarifier: c'est le comportement par défaut des noyaux. -Voulez-vous dire que conv=fsyncc'est la valeur par défaut lors de l'écriture pour bloquer les appareils de telle sorte qu'il ddne cache rien? Vous cherchez une bonne réponse à cela: unix.stackexchange.com/questions/312687/…
Jonathan Komar
10

Cela se produit car Linux et la plupart des autres systèmes d'exploitation mettent en cache les lectures et les écritures. Dans la plupart des cas, cela rend votre système d'exploitation plus réactif.

Si vous voulez vous assurer que les données mises en cache ont été écrites, vous devez utiliser sync, comme vous le savez. Linux expose également un nombre important de paramètres que vous pouvez également régler. Cet article donne un bon aperçu de certains paramètres. Vous pouvez définir vm.dirty_background_bytes sur 0, par exemple, pour vous assurer que le noyau démarre immédiatement les threads du nettoyeur.

ChrisInEdmonton
la source
7

sync (8) - Page de manuel Linux :

Le noyau conserve les données en mémoire pour éviter d'effectuer des lectures et des écritures sur disque (relativement lentes). Cela améliore les performances, mais si l'ordinateur tombe en panne, des données peuvent être perdues ou le système de fichiers corrompu en conséquence. la synchronisation garantit que tout ce qui est en mémoire est écrit sur le disque.

Remarque: unmount(ou éjecter) appelle automatiquement syncce qui "cache" cela dans l'utilisation normale du système de fichiers.

Steven
la source