tunggu perintah dd untuk sepenuhnya menulis ke disk

13

Saya menggunakan perintah dd untuk membuat usb bootable dari file iso:

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

Setelah menekan enter, keluar sebentar dan beri saya:

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

Jadi itu seperti berjalan di latar belakang karena saya dapat melihat bahwa flash drive berfungsi. Akhirnya itu akan berhenti menyalin dan saya dapat menghapus drive dengan sukses tetapi pertanyaannya adalah mengapa tidak dd perintah menunggu untuk menyalin selesai. Mengapa ini berjalan di latar belakang. Dan bagaimana saya bisa membuatnya menunggu?

Kir Ivlev
sumber
4
Sudahkah Anda mencoba sync?
choroba
1
@choroba Apakah masuk akal untuk menjalankan 'sinkronisasi' jika sistem sudah menulis data ke flash drive?
Kir Ivlev
Saya tidak yakin, syncmungkin menunggu.
choroba
2
ddjuga memiliki beberapa opsi sinkronisasi, misalnya conv=fsync. Yang mengatakan, saya tidak pernah harus menggunakannya dengan /dev/sd*drive sendiri. Jika Anda benar-benar menggunakan /dev/sdxtebakan saya, berarti Anda memiliki file 959MB yang tidak berguna di /dev(ramdisk) sekarang ...
frostschutz
1
@ frostschutz Saya menggunakan / sdc untuk flash drive saya
Kir Ivlev

Jawaban:

21

Meskipun kepercayaan populer, ddadalah perintah yang sangat biasa, itu tidak lebih rendah daripada catatau cp. Perintah Anda membaca dari cache disk dan menulis ke buffer disk seperti perintah lainnya.

Untuk memastikan bahwa data sepenuhnya ditulis ke media fisik, Anda perlu menelepon sync. Perintah syncmem-flush semua buffer output ke disk. Ketika syncperintah kembali, data telah sepenuhnya ditulis.

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

Sebagian besar waktu, Anda tidak perlu menelepon sync, karena melepas sistem file melakukan pekerjaan yang sama. Ketika umountperintah kembali, atau ketika Anda mendapatkan pesan konfirmasi setelah mengklik "Keluarkan", buffer telah ditulis ke disk. Di sini, Anda langsung menulis ke disk tanpa melalui sistem file yang terpasang, jadi Anda perlu secara otomatis menyiram buffer.

Perhatikan bahwa alih-alih dd, Anda bisa menggunakan tee. Ini memiliki dua keuntungan: ada sedikit risiko pembalikan sumber dan tujuan karena kesalahan ketik, dan mungkin sedikit lebih cepat .

<~/Desktop/ubuntu.iso sudo tee /dev/sdx >/dev/null; sync
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Bagaimana dengan tombol / ikon "Eject" atau "Safely Remove". Bukankah mereka juga akan memanggil sinkronisasi sebelum memberikan notifikasi "OK untuk menghapus"?
user68186
1
Anda mungkin ingin menggunakan sudo tee /dev/sdx >/dev/null, jika tidak, proses penyalinan akan tetap sangat lambat karena data ditulis ke keluaran konsol.
Lekensteyn
1
@ user68186 Mereka tidak memanggil syncperintah, tetapi mereka melakukan pekerjaan yang sama di bawah tenda.
Gilles 'SANGAT berhenti menjadi jahat'
5
Jawaban ini salah. Tanpa conv=fdatasync, ddperintah tidak menunggu untuk menyelesaikan sampai data ditulis ke disk, seperti yang diminta OP. Lebih jauh, syncperintah menjadwalkan operasi sinkronisasi, tetapi segera kembali; tidak menunggu untuk kembali sampai setelah data ditulis ke disk.
vy32
1
@ vy32 Anda benar ddtidak akan menunggu cache disiram tanpa conv=fdatasyncdll. tetapi di Linux non-kuno Anda salah tentang synctidak menunggu. Anda dapat melihat coreutils sync(8)membuat sync(2)syscall . Halaman sync(2)manual mengatakan "Sebelum versi 1.3.20 Linux tidak menunggu I / O selesai sebelum kembali." jadi sync(8)tidak akan kembali sampai disk mengakui penulisan (atau kesalahan dipicu).
Anon
13

Coba ini:

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

The conv=fdatasyncmemberitahu dduntuk menggunakan opsi khusus untuk memastikan bahwa data yang bisa ditulis ke perangkat fisik.

ay32
sumber