Bagaimana Anda memantau kemajuan dd?


654

ddadalah sebuah keajaiban. Ini memungkinkan Anda menduplikasi hard drive ke yang lain, sama sekali nol hard drive, dll. Tapi begitu Anda meluncurkan ddperintah, tidak ada yang bisa memberi tahu Anda tentang perkembangannya. Itu hanya duduk di sana di kursor sampai perintah akhirnya selesai. Jadi bagaimana seseorang memantau kemajuan dd?

Jawaban:


729

Pembaruan 2016 : Jika Anda menggunakan GNU coreutils> = 8.24 (default di Ubuntu Xenial 16.04 ke atas), lihat metode 2 di bawah ini untuk cara alternatif untuk menampilkan kemajuan.


Metode 1: Dengan menggunakan pv

Instal pvdan letakkan di antara ddperintah input / output saja .

Catatan : Anda tidak dapat menggunakannya saat sudah mulai dd.

Dari deskripsi paket :

pv- Pipe Viewer - adalah alat berbasis terminal untuk memantau kemajuan data melalui pipa. Ini dapat dimasukkan ke dalam pipa normal antara dua proses untuk memberikan indikasi visual tentang seberapa cepat data melewati, berapa lama waktu yang dibutuhkan, seberapa dekat dengan penyelesaiannya, dan perkiraan berapa lama sampai selesai.

Instalasi

sudo apt-get install pv

Contoh

dd if=/dev/urandom | pv | dd of=/dev/null

Keluaran

1,74MB 0:00:09 [ 198kB/s] [      <=>                               ]

Anda dapat menentukan perkiraan ukuran dengan --sizejika Anda menginginkan estimasi waktu.


Contoh Dengan asumsi disk 2GB sedang disalin dari / dev / sdb

Perintah tanpa pvadalah:

sudo dd if=/dev/sdb of=DriveCopy1.dd bs=4096

Perintah dengan pv:

sudo dd if=/dev/sdb | pv -s 2G | dd of=DriveCopy1.dd bs=4096

Keluaran:

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

Penggunaan lainnya

Anda tentu saja dapat menggunakan pvlangsung untuk mem-pipe output ke stdout:

pv /home/user/bigfile.iso | md5sum

Keluaran

50,2MB 0:00:06 [8,66MB/s] [=======>         ] 49% ETA 0:00:06

Perhatikan bahwa dalam hal ini, pvkenali ukurannya secara otomatis.


Metode 2: statusOpsi baru ditambahkan ke dd(GNU Coreutils 8.24+)

dddi GNU Coreutils 8.24+ (Ubuntu 16.04 dan yang lebih baru) mendapat statusopsi baru untuk menampilkan progres:

Contoh

dd if=/dev/urandom of=/dev/null status=progress

Keluaran

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s

76
pv bigfile.iso | dd = / dev / yourdevice
Ion Br.

18
Perhatikan bahwa parameter untuk "dd" sesuai di babak pertama (input bagian dari pipa): dd if=/dev/zero bs=1M count=35000 | pv | dd of=VirtualDisk.raw.
Sopalajo de Arrierez

6
pv bigfile.iso | dd of=VirtualDisk.raw bs=1M count=35000bekerja, diverifikasi. @SopalajodeArrierez, parameter dapat diberikan pada dd kedua.
SiddharthaRT

11
menggunakan pv < /dev/sda > /dev/sdbtampaknya mendapatkan kecepatan ( sumber ) yang lebih baik
Nicola Feltrin

14
FYI pada kecepatan. Tes di komputer saya dengan Samsung 840 PRO SSD: dd if=/dev/urandom | pv | of=/dev/sdbmemberi ~ 18MB / s tulis, dd if=/dev/zero | pv | of=/dev/sdbmemberi ~ 80MB / s, dan lama biasa dd if=/dev/zero of=/dev/sdbmemberikan ~ 550MB / s (dekat dengan kecepatan tulis maks SSD). Semua dengan bs=4096000.
Tedd Hansen

461

Dari HowTo: Pantau perkembangan dd

Anda dapat memantau progres dd tanpa menghentikannya dengan menggunakan killperintah.

Untuk melihat kemajuan ddsetelah itu berjalan, buka terminal lain dan masukkan:

sudo kill -USR1 $(pgrep ^dd)

Ini akan menampilkan ddprogres di ddjendela terminal tanpa menghentikan proses. Jika Anda menggunakan BSD atau OS X, gunakan INFOsebagai ganti USR1. The USR1sinyal akan mengakhiri dd.

Jika Anda ingin mendapatkan pembaruan ddkemajuan secara rutin , masukkan:

watch -n5 'sudo kill -USR1 $(pgrep ^dd)'

watchakan menyelidiki ddproses setiap -n detik ( -n5= 5 detik) dan melaporkan tanpa menghentikannya.

Perhatikan tanda kutip tunggal yang tepat dalam perintah di atas.


19
Ini berhasil, tetapi beberapa komentar. Pertama-tama, saya tidak yakin mengapa Anda lolos dari backticks Anda (jika itu untuk editor SO, Anda melakukannya dengan salah). Kedua saya akan merekomendasikan menggunakan ^ dd $, kalau-kalau ada sesuatu yang lain berjalan dengan awalan dd. Akhirnya, Anda tidak perlu sudo untuk mengirim sinyal USR1. Jika tidak, jawaban yang baik, +1.
gsingh2011

22
NB! Dengan cara ini interupts bekerja di bawah OSX.
Maxim Kholyavkin

26
@Speakus Anda harus menggunakan kill -INFO $(pgrep ^dd$)pada sistem BSD (seperti OSX).
Torben

20
sudo pkill -usr1 ddlebih mudah diingat, berfungsi dengan sangat baik (setidaknya pada Ubuntu 14.04), dan kurang untuk mengetik.
Phizes

21
Saya suka ini karena saya takut pvakan memperlambat transfer, seperti yang ditunjukkan TeddHansen. Juga, saya berani bertaruh banyak orang yang mencari Google ini karena mereka sudah memulai ddoperasi;)
sudo

104

Beberapa contoh penggunaan praktis dengan pvdan kurang mengetik atau lebih banyak kemajuan daripada jawaban lain:

Pertama, Anda perlu menginstal pv, dengan perintah:

sudo apt-get install pv

Maka beberapa contoh adalah:

pv -n /dev/urandom | dd of=/dev/null
pv -tpreb source.iso | dd of=/dev/BLABLA bs=4096 conv=notrunc,noerror

Catatan: sampel pertama kurang dari 5 karakter saat mengetik dd if=/dev/urandom | pv | dd of=/dev/null.

Dan favorit saya untuk mengkloning disk drive (ganti X dengan huruf drive):

(pv -n /dev/sdX | dd of=/dev/sdX bs=128M conv=notrunc,noerror) 2>&1 | dialog --gauge "Running dd command (cloning), please wait..." 10 70 0

tangkapan layar

sumber: http://www.cyberciti.biz/faq/linux-unix-dd-command-show-progress-while-coping/

Juga untuk pengarsipan diriku.


3
Anda perlu menginstal juga dialogdengan perintahapt-get install dialog
k7k0

7
CINTA yang dialogmisalnya. SERENITY SEKARANG !
alex grey

Bisakah Anda memanggil dialog itu dengan python?
mikeymop

1
terima kasih atas jawaban ini, menemukan dialogini akan sangat membantu dalam menulis skrip shell: D
holms

2
brew install pv dialoguntuk Mac. Pria ini juga menghitung dengan gaya. Bravo.
evilSnobu

62

Gunakan Ctrl+ Shift+ Tsaat ddsedang berjalan, dan itu akan menampilkan progres (dalam byte):

load: 1.51  cmd: dd 31215 uninterruptible 0.28u 3.67s
321121+0 records in
321120+0 records out
164413440 bytes transferred in 112.708791 secs (1458745 bytes/sec)

5
Tidak bekerja untuk saya di Kubuntu Trusty. Kemungkinan ikatan yang saling bertentangan?
jamadagni

14
Cara yang bagus. Ini bekerja di bawah OSX, tetapi tidak bekerja di bawah ubuntu 14.04
Maxim Kholyavkin

1
Baris pertama dihasilkan oleh OS X, hanya 3 baris terakhir yang berasal dd.
Itay Grudev

3
Anda harus dapat menggunakan kill -INFO pada BSD seperti OS X
macshome

3
Ini tidak berfungsi di Ubuntu. Ctrl-T / Ctrl-Shift-T hanya keluaran ^Tke terminal (kecuali banyak aplikasi terminal akan mencegat Ctrl-Shift-T dan membuka tab baru). Banyak pencari di OSX / BSD mungkin menghargai jawaban ini, tetapi harus diperjelas bahwa ini bukan untuk Ubuntu (atau GNU / LInux secara umum?)
mwfearnley

60

Demi kelengkapan:

Versi 8.24 dari GNU coreutils termasuk tambalan untuk dd memperkenalkan parameter untuk mencetak kemajuan.

Komit yang memperkenalkan perubahan ini memiliki komentar:

dd: status baru = tingkat kemajuan untuk mencetak statistik secara berkala

Banyak distribusi, termasuk Ubuntu 16.04.2 LTS menggunakan versi ini.


hanya ingin menambahkan bagaimana saya telah mengkompilasi 8.24 coreutils: apt install build-essentialdan apt-get build-dep coreutils, kemudian unduh coreutils-8.25.tar.xz, tar xvf coreutils-8.25.tar.xz configure --prefix=$HOME/usr/localdan jalankan make. Yang baru dikompilasi ddakan berada di bawah srcdir. Anda dapat menyalinnya ke / bin dan mengganti yang sudah ada atau hanya menjalankan sebagai src / dd
holms

2
Keren! Saya suka fitur ini. Dan hanya butuh sekitar 30 tahun untuk mengajar dd untuk mencetak hasil kemajuan. :-)
Johannes Overmann

Apa yang lega! Saya akan segera menambahkan argumen ini dalam alias dd shell.
Stephan Henningsen

Perhatikan bahwa statusnya terkadang akan dicetak dengan dua angka, satu dalam satuan SI dan nilai yang setara dalam satuan biner (mis. 10 MB, 9,5 MiB).
palswim

33

Yang terbaik adalah menggunakan http://dcfldd.sourceforge.net/ mudah untuk menginstal melalui apt-get


3
terima kasih atas pointer ke dcfldd, sangat kompatibel dengan dd tetapi beberapa fitur baru yang bagus. Saya terutama menyukai kemajuan standar.
Floyd

4
Mengapa dcfldd tidak lebih dikenal adalah misteri yang lengkap bagi saya.
Freedom_Ben

28
mungkin karena namanya.
Giovanni Toraldo

Ini memiliki opsi dddan opsi status=onsecara default, untuk pesan progres, statusinterval=N(N dalam blok) untuk frekuensi pembaruan pesan dan sizeprobe=[if|of]untuk indikator persentase. Saya akan alias ke DD:)
kavadias

25

Status kemajuan asli ditambahkan ke dd !!!

Versi baru Coreutils (8.24) menambahkan status progres ke ddalat:

Penggunaan di Xubuntu 15.10:

Buka terminal dan ketik perintah ini:

wget ftp://ftp.gnu.org/pub/gnu/coreutils/coreutils-8.24.tar.xz
tar -xf coreutils-8.24.tar.xz
cd coreutils-8.24
./configure && make -j $(nproc)

Jalankan ddsebagai root:

sudo su
cd src
./dd if=/dev/sdc of=/dev/sda conv=noerror status=progress

Anda akan melihat: Bytes, detik dan kecepatan (Bytes / detik).

Untuk memeriksa versi dd:

Asli:

dd --version

Baru:

cd coreutils-8.24/src
./dd --version

18

Jika Anda sudah mulai dd, dan jika Anda sedang menulis file seperti ketika membuat salinan flashdisk ke disk, Anda dapat menggunakan perintah arloji untuk terus-menerus mengamati ukuran file output untuk melihat perubahan dan memperkirakan penyelesaian.

watch ls -l /pathtofile/filename

Untuk hanya melihat ukuran file (tampilan manusia):

watch ls -sh /pathtofile/filename

Juga metode yang layak ...
Dec--

3
Berguna, meskipun ini tidak selalu berhasil jika Anda memipiskan output dd ke sesuatu selain file (mis. Gzip'ing sebelum menuliskannya ke disk).
Ponkadoodle

Tidak berfungsi pada file khusus.
Johannes Overmann

13

The dd | pv | ddtriad membuat saya copy 50GB vm mengambil 800 detik, sebagai lawan 260 detik hanya menggunakan dd. Dengan pipa ini, setidaknya, pv tidak tahu seberapa besar file input sehingga tidak akan bisa memberi tahu Anda seberapa jauh Anda sehingga tidak ada kerugian untuk melakukannya sebagai berikut- dan Anda mendapatkan keuntungan kecepatan yang bagus:

Saya akan menghindari pv pada sesuatu yang besar, dan (jika menggunakan Bash):

Kontrol-Z proses dd

bguntuk meletakkannya di latar belakang. Perhatikan yang bgakan memberi Anda output seperti di [1] 6011mana angka terakhir adalah id proses. Begitu juga:

while true; do kill -USR1 process_id ; sleep 5; done

di mana process_id adalah id proses yang Anda amati. Tekan Control-C ketika Anda melihat sesuatu seperti:

[1]+  Done dd if=/path/file.qcow2 of=/dev/kvm/pxetest bs=4194304 conv=sparse
-bash: kill: (60111) - No such process

Kamu selesai.

Sunting: Administrator Sistem Konyol! Otomatiskan hidup Anda, jangan bekerja! Jika saya memiliki proses dd panjang yang ingin saya pantau, berikut ini adalah satu-baris yang akan mengurus seluruh enchilada untuk Anda; letakkan ini semua dalam satu baris:

 dd if=/path/to/bigimage of=/path/to/newimage conv=sparse bs=262144 & bgid=$!; while true; do sleep 1; kill -USR1 $bgid || break; sleep 4; done

Anda dapat, tentu saja, skrip itu, mungkin membuat $ 1 file input Anda dan $ 2 file output Anda. Ini dibiarkan sebagai latihan untuk pembaca. Perhatikan bahwa Anda perlu sedikit tidur sebelum membunuh atau membunuh mungkin mati mencoba mengirim sinyal ke dd ketika belum siap. Sesuaikan tidur Anda seperti yang diinginkan (bahkan mungkin menghapus sama sekali tidur kedua).

Bash-FTW! :-)


1
Kompres whileloop. Gunakan watch.
muru

1
@uru itu tergantung. Saya tidak tahu tentang sistem Anda tetapi pada CentOS7 * output sedikit kacau; itu bisa dibaca tetapi tidak terlihat teratur. Juga menginjak output Anda sebelumnya sehingga Anda kehilangan riwayat kecepatan dd Anda; tambang bervariasi antara 20 MB / s dan 300 MB / s. Sangat menarik untuk menonton angkanya bervariasi dan instruktif juga. Saya pikir beberapa varians besar disebabkan oleh LVM thin pools meningkatkan alokasi untuk LV yang saya tulis. * ya ini forum ubuntu tapi saya sampai di sini mencari "dd monitor progress". Ini hasil pertama di Google.
Mike S

Oh, maksud saya di terminal lain atau jendela layar, jalankan sudo watch pkill dd. Kemudian tonton ddoutput statistik dengan nyaman.
muru

Apakah pkill akan mengirim SIGTERM secara default? Saya bahkan tidak ingin bereksperimen, karena pgrep dd muncul dengan 3 pid ketika menjalankan satu dd: kthreadd, oddjob, dan dd. Saya takut apa yang akan dilakukan pkill. Anda bisa mengirim sinyal -USR1 dengan pkill tetapi sekali lagi saya tidak tahu apakah itu aman untuk dikirim ke utas kernel atau obbjob. Perintah arloji terlihat lebih bersih tetapi sepertinya banyak langkah tambahan hanya untuk menghindari loop sementara. Umumnya jika saya melakukan dd dalam satu jendela saya akan melakukan sesuatu setelahnya di shell yang sama. Loop sementara aman: Anda tahu persis pid mana yang mendapatkan sinyal.
Mike S

kebanyakan saya tidak peduli yang mendapatkan sinyal, karena saya gunakan watch pkill -USR1 -x dd. Karena saya juga menggunakan watchuntuk tugas serupa lainnya, yang ini muncul secara alami.
muru


7

Paling mudah adalah:

 dd if=... of=... bs=4M status=progress oflag=dsync

oflag=dsyncakan membuat tulisan Anda tetap sinkron, sehingga informasi status=progresslebih akurat. Namun mungkin sedikit lebih lambat.



Terima kasih untuk ini! Saya melakukan dd ke lvm2 jarak jauh dan bs = 4M meningkatkan transfer saya dengan faktor 20 dan indikasi progresnya luar biasa.
Lonnie Best

6

Di Ubuntu 16.04

Ubuntu 16.04 hadir dengan dd (coreutils) Versi 8.25 . Oleh karena itu opsi status=progress ini Didukung :-)

Untuk menggunakannya, cukup tambahkan perintah status=progressAnda dd.

Contoh:

dd bs=4M if=/media/severus/tools-soft/OperatingSystems/ubuntu-16.04-desktop-amd64.iso of=/dev/null status=progress && sync

Memberikan status sebagai

1282846183 bytes (1.2 GiB, 1.1 GiB) copied, 14.03 s, 101.9 MB/s

masukkan deskripsi gambar di sini


5

Gunakan opsi status=progressuntuk mendapatkan kemajuan selama transfert.

Selain itu, conv=fsyncakan muncul kesalahan I / O.

Contoh:

sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync


3

Saya telah membuat bash wrapper ddyang akan digunakan pvuntuk menunjukkan kemajuan. Masukkan ke dalam Anda .bashrcdan gunakan ddseperti biasa:

# dd if=/dev/vvg0/root of=/dev/vvg1/root bs=4M
    2GB 0:00:17 [ 120MB/s] [===========================================================>] 100%            
0+16384 records in
0+16384 records out
2147483648 bytes (2.1 GB) copied, 18.3353 s, 117 MB/s

Sumber:

dd()
{
    local dd=$(which dd); [ "$dd" ] || {
        echo "'dd' is not installed!" >&2
        return 1
    }

    local pv=$(which pv); [ "$pv" ] || {
        echo "'pv' is not installed!" >&2
        "$dd" "$@"
        return $?
    }

    local arg arg2 infile
    local -a args
    for arg in "$@"
    do
        arg2=${arg#if=}
        if [ "$arg2" != "$arg" ]
        then
            infile=$arg2
        else
            args[${#args[@]}]=$arg
        fi
    done

    "$pv" -tpreb "$infile" | "$dd" "${args[@]}"
}

Cara yang baik tetapi tidak bekerja dengan perintah seperti sudo atau waktu.
Maxim Kholyavkin

1
Memasukkannya ke / usr / local / bin / bb dengan ini di atas: #!/bin/bash. Di bagian bawah: tmp=":${PATH}:"; tmp=${tmp/:/usr/local/bin:/:}; tmp=${tmp%:}; PATH=${tmp#:}; dd "$@"Atau Anda mungkin ingin ddlokasi hardcode . Kemudian gunakan local dd=/usr/bin/dd. Jangan lupa untuk menambahkan sedikit executable: chmod +x /usr/local/dd.
midenok

2

Jadi hari ini saya sedikit frustrasi dengan mencoba menjalankan killdalam satu lingkaran saat ddsedang berjalan, dan muncul dengan metode ini untuk menjalankannya secara paralel, dengan mudah:

function vdd {
    sudo dd "$@" &
    sudo sh -c "while pkill -10 ^dd$; do sleep 5; done"
}

Sekarang gunakan vddsaja di mana saja Anda biasanya menggunakan dd(melewati semua argumen langsung melalui) dan Anda akan mendapatkan laporan kemajuan dicetak setiap 5s.

Satu-satunya downside adalah bahwa perintah tersebut tidak segera kembali ketika dd selesai; jadi ada kemungkinan bahwa perintah ini dapat membuat Anda menunggu 5s tambahan setelah dd kembali sebelum pemberitahuan dan keluar.


2

Yang ini memaksa dd untuk memberikan statistik setiap 2 detik yang merupakan standar untuk menonton:

watch killall -USR1 dd

Untuk mengubah dari setiap 2 detik menjadi setiap 5 detik, tambahkan opsi -n 5 seperti ini:

watch -n 5 killall -USR1 dd

2

Kalau-kalau ada orang dari tanah CentOS yang menemukan utas ini ...

Opsi 'status = progress' bekerja dengan CentOS 7.5 dan 7.6

Jawaban di atas oleh @davidDavidson menyiratkan fitur yang baru ditambahkan di Coreutils 8.24.

Versi 8.24 dari GNU coreutils termasuk tambalan untuk dd memperkenalkan parameter untuk mencetak kemajuan.

Ini mungkin terjadi, tetapi CentOS mungkin tidak mengikuti skema versi yang sama.

Versi Coreutils yang hadir dengan CentOS 7.6.1810 adalah:

coreutils-8.22-23.el7.x86_64 : A set of basic GNU tools commonly used in shell scripts

Dan versi dd yang diinstal adalah:

[root@hostname /]# dd --version
dd (coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Paul Rubin, David MacKenzie, and Stuart Kemp.

Ini menunjukkan versi 8.22 .

Namun, saya telah menguji 'status = progres' dengan dd pada CentOS 7.5 dan CentOS 7.6 (keduanya dengan versi 8.22 dari Coreutils) dan berfungsi dengan baik.

Saya tidak tahu mengapa RedHat memilih untuk menggunakan Coreutils versi lama tetapi fungsinya memang ada dengan 8.22.


1

Seperti disebutkan di atas, setidaknya dengan 'dd' dari GNU coreutils, atau busybox, ia akan merespons sinyal USR1 dengan mencetak info progres ke stderr.

Saya menulis skrip pembungkus kecil untuk dd yang menunjukkan indikator persen-lengkap yang bagus, dan mencoba untuk tidak mengganggu proses dd atau cara berfungsi dengan cara apa pun. Anda dapat menemukannya di github:

http://github.com/delt01/dd_printpercent

Sayangnya, trik SIGUSR1 ini hanya berfungsi dengan GNU dd (dari paket coreutils) atau mode 'dd' busybox dengan fitur spesifik yang diaktifkan pada waktu kompilasi. Itu tidak bekerja dengan stok 'dd' yang disertakan dengan sebagian besar sistem BSD, termasuk FreeBSD dan OS X ... :(


Tautannya sudah mati.
ishmael

1

Anda dapat menyaksikan kemajuan dari setiap program coreutils menggunakan progress - Coreutils Progress Viewer.

Itu dapat memonitor:

cp mv dd tar cat rsync grep fgrep egrep potong urutkan md5sum sha1sum sha224sum sha256sum sha384sum sha512sum adb gzip gunzip bzip2 bunzip2 xz unxz lzma unlzma 7z 7za zcat bzcat

Anda dapat melihat halaman manualnya

Anda dapat menggunakannya di jendela terminal terpisah saat perintah sedang berjalan atau jalankan dengan perintah dd:

dd if=/dev/sda of=file.img & progress -mp $!

Di sini &mem-fork perintah pertama dan melanjutkan segera alih-alih menunggu sampai perintah berakhir.

Perintah progres diluncurkan dengan: -mjadi ia menunggu sampai proses yang dipantau berakhir, -psehingga ia memonitor pid yang diberikan dan $!merupakan perintah terakhir pid.

Jika Anda mengeluarkan dd dengan sudo, Anda juga harus terlalu maju:

sudo dd if=/dev/sda of=file.img &
sudo progress -m
# with no -p, this will wait for all coreutil commands to finish
# but $! will give the sudo command's pid
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.