Dd bazen veri yazılana kadar beklemiyor mu?


20

Bazen, görüntüleri bir flash sürücüye yazdığımda, bu olur:

$ 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

Temel olarak, Linux her şeyi önbelleğe alır, hiçbir şey yazmaz ve ddçıkar. Ben syncyazdıktan sonra, verileri yazmaya başlar (flash sürücü LED'i yanıp sönmeye başlar).

Bu neden oluyor?


3
/dev/sdcSisteminizde gerçek bir cihaz olduğundan ve bir dosyaya yazmadığınızdan emin misiniz /dev/sdc? Yap ls --color /dev- /dev/sdcBir cihaz ise sarı olmalı.
LawrenceC

Yanıtlar:


21

Bunun yerine bunu kullanın:

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

Bu fsync()her write()sistem çağrısından sonra çağırır. Bu ddhiçbir şeyi önbelleğe almamak için zorlar . Fsync ( man 2 fsync) sayfasının bu bölümüne bakınız :

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)).

Bu, çekirdeklerin varsayılan davranışıdır. Linux çekirdeği böyle yazma ve önbellekleri yönetir: Sistem write()çağrısı yapıldığında, veriler hızlı bir şekilde önbelleğe yazılır ve işleme tamamlanma durumu gönderilir. Arabellek gerektiğinde veya veriyolu üzerinde boş zaman olduğunda, veriler önbellekten sabit diske yazılır.


1
Cevabın ve benimkilerin neredeyse tamamen farklı yaklaşımları kapsaması hoşuma gidiyor. Güzel, +1.
ChrisInEdmonton

1
@ ChrisInEdmonton dito +1
kaos

Bu sorunun tüm cevapları iyidir.
Francisco Tapia,

@chaos Sadece netleştirmek için: Bu, çekirdeklerin varsayılan davranışıdır. -Bir şeyi önbelleğe almayan conv=fsyncaygıtları engellemek için yazarken bunun varsayılan olduğunu mu kastediyorsunuz dd? Buna iyi bir cevap mı arıyorsunuz: unix.stackexchange.com/questions/312687/…
Jonathan Komar

10

Bunun nedeni Linux ve diğer birçok işletim sisteminin önbelleği hem okur hem de yazmasıdır. Çoğu durumda, bu işletim sisteminizi daha duyarlı hale getirir.

Önbelleğe alınmış verilerin yazıldığından emin olmak istiyorsanız sync, bildiğiniz gibi kullanmak istiyorsunuz. Linux, ayarlayabileceğiniz önemli sayıda ayar gösterir. Bu makale bazı ayarlara genel bir bakış sunar. Vn.dirty_background_bytes değerini 0 olarak ayarlayabilirsiniz, örneğin çekirdeğin hemen sifondaki dişlilerin başlamasını sağlamak için.


7

sync (8) - Linux kılavuz sayfası :

Çekirdek, (nispeten yavaş) disk okumaları ve yazmalarını önlemek için verileri bellekte tutar. Bu, performansı artırır, ancak bilgisayar çökerse, veri kaybolabilir veya bunun sonucunda dosya sistemi bozulabilir. senk, bellekteki her şeyin diske yazılmasını sağlar.

Not: unmount(veya çıkar) syncnormal dosya sistemi kullanımında bunu "gizleyen" otomatik olarak çağırır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.