Mengapa kadang-kadang tidak menunggu sampai data ditulis?

20

Terkadang, ketika saya menulis gambar ke flash drive, ini terjadi:

$ 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

Pada dasarnya, Linux menyimpan semuanya, tidak menulis apa pun, dan ddkeluar. Setelah saya mengetik sync, ia mulai menulis data (LED flash drive mulai berkedip).

Mengapa ini terjadi?

jgillich
sumber
3
Apakah Anda yakin /dev/sdcperangkat yang sebenarnya di sistem Anda dan Anda tidak menulis ke file /dev/sdc? Lakukan ls --color /dev- /dev/sdcharus berwarna kuning jika itu perangkat.
LawrenceC

Jawaban:

21

Gunakan ini sebagai gantinya:

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

Ini panggilan fsync()setelah setiap write()panggilan sistem. Ini memaksa dduntuk tidak melakukan cache apa pun. Lihat bagian ini dari halaman manual 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)).

Ini adalah perilaku default kernel. Kernel Linux mengelola cache tulis dan baca seperti ini: Ketika write()syscall dikeluarkan, data dengan cepat ditulis ke cache dan status selesai menulis dikirim ke proses. Ketika buffer diperlukan atau ketika ada waktu luang di bus, data ditulis dari cache ke hard disk.

kekacauan
sumber
1
Saya suka bahwa jawaban Anda dan pendekatan saya hampir semuanya berbeda pendekatan. Bagus, +1.
ChrisInEdmonton
1
@ChrisInEdmonton dito +1
kekacauan
semua jawaban baik untuk pertanyaan ini.
Francisco Tapia
@chaos Hanya untuk memperjelas: Ini adalah perilaku default kernel. -Apakah maksud Anda conv=fsyncadalah default saat menulis untuk memblokir perangkat sedemikian rupa sehingga ddtidak ada cache apa pun? Mencari jawaban yang bagus untuk ini: unix.stackexchange.com/questions/312687/…
Jonathan Komar
10

Ini terjadi karena Linux, dan sebagian besar sistem operasi lain, cache membaca dan menulis. Dalam kebanyakan kasus, ini membuat sistem operasi Anda lebih responsif.

Jika Anda ingin memastikan data yang di-cache telah ditulis, Anda ingin menggunakannya sync, seperti yang Anda tahu. Linux memperlihatkan sejumlah besar pengaturan yang dapat Anda atur juga. Artikel ini memberikan ikhtisar yang bagus tentang beberapa pengaturan. Anda dapat mengatur vm.dirty_background_bytes ke 0, misalnya, untuk memastikan kernel langsung mematikan thread flusher.

ChrisInEdmonton
sumber
7

sinkronisasi (8) - Halaman manual Linux :

Kernel menyimpan data dalam memori untuk menghindari melakukan (relatif lambat) disk membaca dan menulis. Ini meningkatkan kinerja, tetapi jika komputer macet, data mungkin hilang atau sistem file rusak sebagai hasilnya. sinkronisasi memastikan bahwa semua yang ada di memori ditulis ke disk.

Catatan: unmount(atau mengeluarkan) secara otomatis memanggil syncyang "menyembunyikan" ini dalam penggunaan sistem file normal.

Steven
sumber