Mengapa dd terlalu lama?

17

Saya perlu menyalin satu disk ke disk lain. Saya mencoba dengan perintah di bawah ini dan dibutuhkan hampir satu hari untuk menyalin 1 TB disk dalam federo.

dd if=/dev/sda of=/dev/sdb 

Saya telah mencoba hal yang sama pada sistem Unix (HP-UX) dengan perintah di bawah ini dan selesai dalam beberapa jam

dd if=/dev/sda of=/dev/rdsk

Apa alternatif yang bisa saya gunakan untuk menyalin dari disk ke disk lebih cepat?

KKD
sumber
2
cp /dev/sda /dev/sdbatau ( pv /dev/sda > /dev/sdb untuk mendapatkan bilah kemajuan) akan jauh lebih cepat. Mengapa Anda gunakan di ddsini? ddhanya akan berguna dengan hal-hal seperti conv=sync,noerroruntuk menangani disk dengan kesalahan, tetapi bahkan kemudian itu akan lebih masuk akal untuk menggunakan hal-hal seperti ddrescuebukan (lihat juga pv's -Epilihan).
Stéphane Chazelas
1
@ StéphaneChazelas catmungkin bahkan lebih cepat tetapi perbedaannya tidak terlalu dramatis (mungkin lebih besar untuk perangkat-ke-perangkat daripada file-ke-file seperti dalam percobaan saya).
Gilles 'SANGAT berhenti menjadi jahat'
8
"Saya telah mencoba hal yang sama pada sistem Unix" - Jadi pada jenis sistem apa Anda mencoba yang pertama, jika bukan Unix? Juga, perangkat keras apa, dll, yaddayadda.
marcelm
Selamat datang di ddperangkap # 1
Dmitry Grigoryev
Digunakan yang pertama di HP-UX (Blade Integritas) dan mesin Solaris yang digunakan sebelumnya juga.
KKD

Jawaban:

28

ddmemiliki banyak opsi (aneh), lihat dd (1) .

Anda harus secara eksplisit menyatakan ukuran buffer, jadi cobalah

dd if=/dev/sda of=/dev/sdb bs=16M

IIRC, ukuran buffer default hanya 512 byte. Perintah di atas menetapkannya menjadi 16 megabyte. Anda dapat mencoba sesuatu yang lebih kecil (misalnya bs=1M) tetapi Anda harus menggunakan lebih dari standar (terutama pada perangkat keras disk baru-baru ini dengan sektor 4Kbytes, yaitu Format Lanjutan ). Saya secara naif merekomendasikan kekuatan dua yang setidaknya satu megabyte.

Dengan ukuran buffer default 512 byte, saya kira (tapi saya bisa sangat salah) bahwa perangkat keras membutuhkan kernel untuk mentransfer 4K untuk setiap blok 512 byte.

Mengenai rdsk, halaman manual sd (4) mengatakan:

Pada saat ini, hanya perangkat blok yang disediakan. Perangkat mentah belum diimplementasikan.

Peningkatan ukuran buffer dd akan memberi Anda lebih banyak kinerja untuk operasi baca dan tulis. Sekarang semua disk memiliki buffer baca / tulis perangkat keras. Tetapi jika Anda akan meningkatkan ukuran buffer dd lebih dari buffer perangkat keras kinerjanya akan menurun karena dd akan membaca dari disk pertama ke buffer ketika disk kedua akan menulis semua dari buffer perangkat kerasnya sendiri. Anda perlu mengatur bsopsi perintah dd setiap kali nilai yang berbeda untuk perangkat yang berbeda.

Basile Starynkevitch
sumber
Apakah rdsk tersedia di sistem Linux? Saya telah menggunakan sistem Unix.
KKD
1
Cache halaman mungkin akan menangani blok 4Kb apa pun yang Anda lakukan, tetapi Anda dapat mengontrol berapa banyak syscalls yang digunakan untuk membaca 4Kb itu. Saya yakin ada beberapa ukuran baca di atas yang biaya menulisnya lebih mahal daripada syscalls yang disimpan, tetapi tidak tahu di mana sweet spot itu.
berguna
Ukuran blok beberapa MB lebih baik daripada 512B default, tetapi ketika saya membuat benchmark ini, saya menemukan hal yang catsama baiknya (untuk transfer filesystem-ke-filesystem, block-to- files langsung dapat memiliki karakteristik kinerja yang berbeda). Namun perbedaannya tidak dramatis.
Gilles 'SANGAT berhenti menjadi jahat'
1
Menariknya, di macOS (bersertifikasi SUS, btw) lebih cepat digunakan/dev/rdiskX sebagai target saat melakukan dd.
adib
1
jika Anda bertanya-tanya apa yang terjadi (seperti yang saya lakukan) tambahkan juga status=progressyang akan mencetak seluruh kemajuan operasi.
Aleksander Lech
17

Bertahun-tahun yang lalu di Unix-land ddadalah cara yang diperlukan untuk menyalin perangkat blok. Itu telah dibawa maju sebagai ilmu pemujaan meskipun (pada sistem berbasis Linux, setidaknya) cathampir selalu lebih cepat daripada dd.

Namun, bahkan kembali dalam sejarah ukuran blok yang layak membantu mengurangi jumlah panggilan sistem (lambat), mengingat bahwa setiap panggilan sistem memicu operasi I / O. Ukuran blok default adalah 512 byte (satu sektor disk). Mengumpulkan beberapa blok disk bersama menjadi satu pembacaan adalah - dan - juga dapat diterima. Contoh ini menggunakan ukuran blok 32MB:

dd bs=$((512*2048*32)) if=/dev/source of=/dev/target

Pada sistem berbasis Linux saat ini, disk dapat disalin secara efisien dengan simpel cat

cat /dev/source >/dev/target

(Seperti yang tercantum dalam komentar pada pertanyaan Anda pv dapat diganticat dan akan memberi Anda indikasi kemajuan dan throughput.)

roaima
sumber
3
Secara khusus, alasan dd harus digunakan adalah bug di GNU cp dan bug di kernel linux di awal 90-an. Alasan untuk menggunakan dd pada sistem unix historis sangat berbeda, dan ingin menyalin seluruh perangkat blok adalah hal yang tidak biasa ingin dilakukan.
Random832
1
@ Random832 ingin menyalin seluruh disk akan menjadi tidak biasa, tapi saya ingat perlu menyalin partisi di sekitar (yang besar - 150 atau bahkan 200MB)
roaima
3
(Spesifikasi bug: kernel melaporkan ukuran penggunaan disk salah [memimpin cp untuk menyimpulkan bahwa setiap file sumber adalah file jarang], dan cp tidak nol blok ketika menyalin dari file jarang ke tujuan perangkat. blok di sumber Anda akan memiliki sampah apa pun yang kebetulan sudah ada di disk)
Random832
Saya suka jawaban semacam ini. Terimakasih atas infonya. Ini adalah pembaruan Anda.
catbadger
7

Secara umum, dddapat dihindari demi beberapa alternatif. Ada beberapa alasan bagus untuk menggunakan GNUddrescue . Di Ubuntu, Anda dapat menginstalnya dengan:

sudo apt-get install gddrescue

dan sederhana ddrescue digunakan. Perhatikan bahwa berbeda dari nama paket, executable tidak memiliki inisial g.

Menggunakannya sesederhana:

ddrescue inputFile outputFile logFile

File log (dinamai apa pun yang Anda pilih) memungkinkan Anda menjeda / berhenti dan memulai ulang, tanpa mengulangi pekerjaan sebelumnya, yang berguna ketika melakukan klon besar atau pemulihan disk. Secara default, ini menampilkan progres, kecepatan penyalinan saat ini, kecepatan penyalinan rata-rata dan jumlah blok buruk yang ditemukan.

Menggunakan default yang masuk akal untuk ukuran blok, sehingga kecepatan salin selalu secepat perangkat dapat menangani, setidaknya dalam pengalaman saya (saya sudah mengkloning ratusan drive dengan itu, semua ukuran dan jenis).

Seringkali, drive yang mulai gagal memiliki masalah kecepatan seperti tambalan kelambatan sesekali, kecepatan rata-rata rendah, jeda panjang tiba-tiba (bad sector) atau reset penuh (kesalahan permukaan parah). ddrescuedapat membantu Anda mengidentifikasi semua hal di atas dan memulai kembali klon Anda (asalkan Anda menentukan file log) bahkan jika drive Anda mengatur ulang sendiri.

cowok teknis
sumber
6

Pertanyaan yang sangat bagus Antarmuka baku diimplementasikan pada beberapa sistem unix (tru64, hpux, solaris) tetapi tidak di linux. Antarmuka baku membuat transfer lebih cepat karena unix I / O dilewati. Antarmuka blok ( /dev/dskatau /dev/disk) lebih lambat karena menggunakan sistem I / O unix. Untuk mempercepat dd(gnu dd bisa) gunakan bs=30Matau bs=20Mtergantung pada hw Anda. Jawaban singkatnya adalah: TIDAK, itu tidak diterapkan, setidaknya sejauh yang saya tahu. Saya menggunakan linux sejak dulu versi kernel 2.2 dan belum pernah melihat rdskdigunakan pada unix.

elbarna
sumber
5
Mengapa Anda menyarankan ukuran blok yang bukan kekuatan dua?
Basile Starynkevitch
2
@Basile beberapa ukuran blok disk sudah cukup, jadi 20MiB akan baik-baik saja.
roaima