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 dd
keluar. Setelah saya mengetik sync
, ia mulai menulis data (LED flash drive mulai berkedip).
Mengapa ini terjadi?
linux
command-line
dd
jgillich
sumber
sumber
/dev/sdc
perangkat yang sebenarnya di sistem Anda dan Anda tidak menulis ke file/dev/sdc
? Lakukanls --color /dev
-/dev/sdc
harus berwarna kuning jika itu perangkat.Jawaban:
Gunakan ini sebagai gantinya:
Ini panggilan
fsync()
setelah setiapwrite()
panggilan sistem. Ini memaksadd
untuk tidak melakukan cache apa pun. Lihat bagian ini dari halaman manual fsync (man 2 fsync
):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.sumber
conv=fsync
adalah default saat menulis untuk memblokir perangkat sedemikian rupa sehinggadd
tidak ada cache apa pun? Mencari jawaban yang bagus untuk ini: unix.stackexchange.com/questions/312687/…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.sumber
Catatan:
unmount
(atau mengeluarkan) secara otomatis memanggilsync
yang "menyembunyikan" ini dalam penggunaan sistem file normal.sumber