Apakah ada metode untuk mendapatkan persentase pada DD di linux?

41

Jadi, inilah yang terjadi.

Saya memulai cadangan drive di server saya melalui Linux live USB. Saya mulai menyalin drive pertama dengan ddperintah vanilla; baru sudo dd if=/dev/sda of=/dev/sdc1kemudian saya ingat bahwa ini hanya membiarkan konsol kosong sampai selesai.

Saya perlu menjalankan cadangan yang berbeda ke drive yang sama, jadi saya mulai yang juga dengan sudo dd if=/dev/sdb of=/dev/sdc3 status=progressdan kemudian saya mendapat garis teks yang menunjukkan tingkat transfer saat ini serta kemajuan dalam byte.

Saya berharap untuk metode yang menunjukkan persentase cadangan alih-alih melakukan perhitungan berapa byte yang dicadangkan dari 1.8TB. Apakah ada cara yang lebih mudah untuk melakukan ini daripada status = kemajuan?

Cepat
sumber

Jawaban:

68

Lihat jawaban dari pertanyaan ini [ 1 ]

pv

Misalnya Anda dapat menggunakan pv sebelum memulai

sudo apt-get install pv    # if you do not have it
pv < /dev/sda > /dev/sc3   # it is reported to be faster
pv /dev/sda > /dev/sc3     # it seems to have the same speed of the previous one
#or 
sudo dd if=/dev/sda | pv -s 1844G | dd of=/dev/sdc3  # Maybe slower 

Output [ 2 ] :

440MB 0:00:38 [11.6MB/s] [======>                             ] 21% ETA 0:02:19

Catatan:
Khusus untuk file besar Anda mungkin ingin melihat man dddan mengatur opsi yang diperlukan untuk mempercepat semua pada perangkat keras Anda, misalnya bs=100Muntuk mengatur buffer, oflag=syncuntuk menghitung byte efektif yang ditulis, mungkin direct...
Pilihannya -shanya memerlukan parameter integer jadi 1.8T-->1844G.
Seperti yang Anda bisa perhatikan dari baris pertama Anda tidak perlu ddsama sekali.


kill -USR1 pid

Jika Anda sudah diluncurkan pada ddperintah, setelah Anda telah diindividuasikan nya PID ( Ctrl- Z+ bgdan Anda membacanya, atau pgrep ^dd...) Anda dapat mengirimkan sinyal USR1(atau SIGUSR1, atau SIGINFOlihat di bawah) dan membaca output.
Jika PID dari program ini adalah 1234 dengan

kill -USR1 1234

dd akan menjawab pada terminal STDERR dengan sesuatu yang mirip

4+1 records in
4+0 records out
41943040 bytes (42 MB) copied, 2.90588 s, 14.4 MB/s

Peringatan: Di bawah OpenBSD Anda mungkin harus memeriksa terlebih dahulu perilaku kill[ 3 ] : gunakan saja
kill -SIGINFO 1234.
Itu ada sigaction bernama SIGINFO. Yang SIGUSR1satu, dalam hal ini, harus menghentikan program ( dd) ...
Di bawah penggunaan Ubuntu -SIGUSR1( 10).

Cepat
sumber
9
Anda hampir pasti akan menemukan bahwa menggunakan 'bs' pada perintah dd sangat mempercepatnya. Seperti dd if = / dev / blah dari = / tmp / blah bs = 100M untuk mentransfer 100M blok sekaligus
Sirex
1
@Sirex Tentu saja Anda harus mengatur bs untuk mengoptimalkan kecepatan transfer dalam kaitannya dengan perangkat keras Anda ... Dalam jawabannya hanya mengulangi baris perintah OP. :-)
Hastur
3
@ Criggie: itu mungkin karena ddsudah menyelesaikan semua write()panggilan sistem, dan fsyncatau closediblokir menunggu tulisan mencapai disk. Dengan USB stick yang lambat, ambang batas buffer I / O Linux standar untuk seberapa besar buffer tulis yang kotor dapat mengarah pada perilaku yang berbeda secara kualitatif dibandingkan dengan file besar pada disk cepat, karena buffer sama besar dengan apa yang Anda salin dan masih membutuhkan waktu nyata.
Peter Cordes
5
Jawaban yang bagus Namun, saya ingin mencatat bahwa di OpenBSD sinyal kill yang tepat adalah SIGINFO, bukan SIGUSR1. Menggunakan -USR1 di OpenBSD akan membunuh dd. Jadi sebelum Anda mencoba ini di lingkungan baru, pada transfer yang tidak ingin Anda sela, Anda mungkin ingin membiasakan diri dengan bagaimana lingkungan bertindak (pada tes yang lebih aman).
TOOGAM
1
saran sinyal untuk ddinfo yang sangat bagus, terutama untuk server di mana Anda tidak dapat / tidak ingin menginstalpv
mike
38

Alat bantu saya untuk hal semacam ini adalah progress:

Alat ini dapat digambarkan sebagai perintah C Tiny , Dirty, Linux-and-OSX-Only yang mencari perintah dasar coreutils (cp, mv, dd, tar, gzip / gunzip, cat, dll.) Saat ini berjalan pada sistem Anda dan menampilkan persentase data yang disalin. Hal ini juga dapat menunjukkan perkiraan waktu dan throughput yang , dan memberikan "top-seperti" mode (monitoring).

Tangkapan layar "<code> progress </code> in action"

Ini hanya memindai /procperintah yang menarik, dan kemudian melihat direktori fddan fdinfomenemukan file yang dibuka dan mencari posisi, dan melaporkan status untuk file terbesar.

Ini sangat ringan, dan kompatibel dengan hampir semua perintah.

Saya merasa ini sangat berguna karena:

  • dibandingkan dengan pvdi pipa atau dcfldd, saya tidak harus ingat untuk menjalankan perintah yang berbeda ketika saya memulai operasi, saya dapat memonitor barang setelah fakta;
  • dibandingkan dengan kill -USR1, ini bekerja pada hampir semua perintah, saya tidak harus selalu memeriksa halaman manual untuk memastikan saya tidak secara tidak sengaja membunuh salinan; juga, itu bagus bahwa, ketika dipanggil tanpa parameter, itu menunjukkan kemajuan untuk perintah "transfer data" yang umum sedang berjalan, jadi saya bahkan tidak perlu mencari PID;
  • dibandingkan dengan pv -d, sekali lagi saya tidak perlu mencari PID.
Matteo Italia
sumber
1
Catatan: Anda dapat memantau lebih dari sekedar proses coreutils. Cukup tentukan nama perintah dengan --command <command-name>.
jpaugh
1
Ini. AKU MENUNGGU!
Floris
25

Jalankan dd, kemudian, dalam shell yang terpisah, aktifkan perintah berikut:

pv -d $(pidof dd) # root may be required

Ini akan membuat pv mendapatkan statistik pada semua deskriptor file yang dibuka dari ddproses. Ini akan menunjukkan Anda berdua di mana buffer membaca dan menulis duduk.

sleblanc
sumber
2
Bekerja setelah fakta !? Luar biasa !!
jpaugh
3
Itu sangat keren. Ini menghindari memory-bandwidth + context-switch overhead dari sebenarnya mem-piping semua data melalui 3 proses! @ jpaugh: Saya kira itu hanya mencari /proc/$PID/fdinfoposisi file, dan /proc/$PID/fduntuk melihat file mana (dan dengan demikian ukurannya). Jadi ya, sangat keren, dan ide yang bagus untuk fitur, tetapi saya tidak akan menyebutnya "luar biasa" karena ada API Linux yang membiarkannya memilih posisi file dari proses lain.
Peter Cordes
@PeterCordes Saya tidak menyadari posisi file terpapar oleh kernel. (Saya telah menghabiskan hidup saya dengan hati-hati mempersiapkan pvpipa sebelumnya.) Tentu saja, saya berasumsi sebanyak saya melihat bahwa ini bekerja.
jpaugh
9

Ada alternatif untuk dd: dcfldd.

dcfldd adalah versi GNU dd yang disempurnakan dengan fitur yang berguna untuk forensik dan keamanan.

Output status - dcfldd dapat memperbarui kemajuan pengguna dalam hal jumlah data yang ditransfer dan berapa lama waktu yang dibutuhkan untuk operasi.

dcfldd if=/dev/zero of=out bs=2G count=1 # test file
dcfldd if=out of=out2 sizeprobe=if
[80% of 2047Mb] 52736 blocks (1648Mb) written. 00:00:01 remaining.

http://dcfldd.sourceforge.net/
https://linux.die.net/man/1/dcfldd

Antonin Décimo
sumber
Itu nama perintah yang lebih panjang ... jelas, lebih rendah. (+1)
jpaugh
6

Sebagai persentase Anda harus melakukan beberapa matematika, tetapi Anda bisa mendapatkan kemajuan dari sebuah dd dalam bentuk yang dapat dibaca manusia, bahkan setelah sudah mulai, dengan melakukan kill -USR1 $(pidof dd)

Proses dd saat ini akan menampilkan mirip dengan:

11117279 byte (11 MB, 11 MiB) disalin, 13,715 s, 811 kB / s

Sirex
sumber
4
Itu pada dasarnya hal yang sama yang status=progressmemberi
rakslice
1
Saya sebenarnya akan mengatakan bahwa hal yang persis sama yang diberikan status = kemajuan.