Mengapa opsi sinkronisasi digunakan dengan perintah `dd`?


13

Mengikuti instruksi pada halaman ini , halaman menunjukkan ddperintah dan syncopsi di akhir. Perintahnya adalah sebagai berikut:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M sync

Saya tahu apa itu dddan bagaimana cara kerjanya tetapi saya belum pernah mendengar atau menggunakan syncopsi dengannya dan entri halaman manualnya seperti:

sync   pad every input block with NULs to  ibs-size;  when  used  with
       block or unblock, pad with spaces rather than NULs

Apa NULdan mengapa itu padded ke ibs-size, dan mengapa repot-repot mengisi blok data dan menggunakan syncopsi dengan ddperintah? Mengapa tidak menjaganya agar tetap sederhana dan mudah?

Ketika saya mencoba menjalankan syncdengan perintah karena dengan lokasi dan nilai yang sesuai saya mendapatkan kesalahan berikut:

dd: unrecognized operand ‘sync’
Try 'dd --help' for more information. 

Jawaban:


21

Anda salah membaca perintah. Nya:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M 
sync

syncadalah perintah terpisah, di sini. Lihat man 1 sync:

NAME
       sync - flush file system buffers

SYNOPSIS
       sync [OPTION]

DESCRIPTION
       Force changed blocks to disk, update the super block.

Cukup jelas mengapa ini digunakan setelah Anda berpikir tentang caching.

Adapun ddpilihan Anda baca, itu adalah nilai untuk para convoption :

Each CONV symbol may be:
   ascii  from EBCDIC to ASCII
   ...
   sync   pad every input block with NULs  to  ibs-size;  when  used  with
          block or unblock, pad with spaces rather than NULs

Jika digunakan (yang bukan), itu akan digunakan sebagai berikut:

dd ... conv=sync

3
Jawaban bagus, sangat detail. Senang bahwa Anda bahkan menggambarkan dd ... conv=syncargumen.
Byte Commander

Jangan biarkan mereka mengejekmu! ;-) Jawaban yang bagus: Anda melihat masalah yang bahkan tidak saya lihat. > :-) +1
Fabby

1
Juga dari uraian conv=syncopsi, tampaknya cukup jelas mengapa tidak digunakan untuk ini. Paling-paling itu tidak akan melakukan apa-apa, paling buruk itu akan merusak gambar selama penyalinan.
kasperd

5
Benar-benar instruksi harus memanggil untuk opsi dd oflag=fsync(yang flushes output dd telah menulis) daripada syncperintah (yang flushes semuanya pada sistem.
psusi

Jawaban ini menyesatkan. Dengan dd, syncadalah argumen untuk keduanya convdan opsi iflagatau oflag.
Dan Loewenherz

3

Secara default, dd akan membaca dalam data satu blok pada suatu waktu, mungkin membaca dalam blok yang lebih pendek dari yang ditentukan pengguna, baik di akhir file atau karena perilaku perangkat sumber; ini disebut catatan parsial . Ini kemudian akan menulis blok yang ukurannya sama dengan jumlah yang dibaca.

Dd akan mengulangi ini sampai jumlah yang ditentukan tercapai, atau ia melihat bukti pada input, atau kesalahan pada input atau output. Ketika selesai, dd melaporkan jumlah catatan penuh dan sebagian yang dibaca dan ditulisnya.

Perilaku ini baik untuk menyalin file biasa dalam sistem file atau melalui koneksi jaringan TCP, karena itu dianggap sebagai aliran byte. Tetapi objek sistem file lain, seperti DVD mentah dan pita magnetik, memerlukan ukuran tulis yang berada dalam rentang tertentu dan merupakan kelipatan bulat dari sejumlah jumlah (seperti 512 atau 2048 byte). Misalnya, jika Anda memiliki gambar disk yang 255 lagu dari 63 sektor byte-byte, dan ingin menulis ke kaset yang membutuhkan ukuran blok 1024 byte, Anda harus melakukan sesuatu seperti

dd if=disk.img of=/dev/rmt0 bs=1k conv=sync

untuk memastikan bahwa dd tidak mencoba untuk menulis blok 512-byte di akhir. Blok yang lebih pendek di ujungnya akan diisi dengan nol atau kosong. Padding dengan nol adalah pilihan umum yang aman. Opsi untuk dd to pad dengan blank berguna dalam situasi yang berbeda - mengonversi file yang memiliki garis panjang variabel ke file dengan garis panjang tetap.


0

Saya telah menemukan bahwa sistem linux, bukan dd, cache buffer. Karena itu, ketika perintah dd telah selesai, saya menjalankan sinkronisasi sebagai

sudo dd if=my.downloaded.iso of=/dev/sd(?) bs=1M && sync

Saya belum menggunakan opsi dd internal apa pun untuk menyebabkan buffer flushing. Namun biasanya, ketika saya membuat versi USB dari distribusi, saya adalah satu-satunya di komputer, jadi saya tidak punya keraguan tentang perintah yang saya posting yang membahayakan. Karena saya menjalankan sinkronisasi sebagai &&, sinkronisasi dilakukan dengan hak sudo dan saya yakin bahwa USB yang saya buat sudah lengkap.


0

Anda dapat menggunakan syncopsi untuk keluaran, yang termasuk dalam ddperintah, dengan oflagsimbol:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M oflag=sync
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.