Yanıtlar:
Güncelleme 2016 : Eğer GNU coreutils> = 8.24 kullanıyorsanız (varsayılan olarak Ubuntu Xenial 16.04'te yukarı doğru), ilerlemeyi göstermenin alternatif bir yolu için aşağıdaki yöntem 2'ye bakın.
pvpvSadece giriş / çıkış ddkomutlarını kurun ve yerleştirin .
Not : Zaten başlattığınızda kullanamazsınız dd.
Gönderen paket açıklaması :
pv- Boru Görüntüleyici - bir boru hattıyla verilerin ilerlemesini izlemek için kullanılan terminal tabanlı bir araçtır. Verilerin ne kadar çabuk geçtiğini, ne kadar sürdüğünü, tamamlanmaya ne kadar yakın olduğunu ve tamamlanmasının ne kadar süreceğini tahmin etmek için iki işlem arasında herhangi bir normal boru hattına yerleştirilebilir.
Kurulum
sudo apt-get install pv
Örnek
dd if=/dev/urandom | pv | dd of=/dev/null
Çıktı
1,74MB 0:00:09 [ 198kB/s] [ <=> ]
--sizeBir zaman tahmini istiyorsanız , yaklaşık boyutunu belirtebilirsiniz .
Örnek 2GB diskin / dev / sdb'den kopyalandığını varsayarsak
Olmadan pvemir vermek:
sudo dd if=/dev/sdb of=DriveCopy1.dd bs=4096
Komutuyla pv:
sudo dd if=/dev/sdb | pv -s 2G | dd of=DriveCopy1.dd bs=4096
Çıktı:
440MB 0:00:38 [11.6MB/s] [======> ] 21% ETA 0:02:19
Diğer kullanımlar
Elbette pvçıktıyı stdout'a yönlendirmek için doğrudan kullanabilirsiniz :
pv /home/user/bigfile.iso | md5sum
Çıktı
50,2MB 0:00:06 [8,66MB/s] [=======> ] 49% ETA 0:00:06
Bu durumda, pvboyutu otomatik olarak tanıdığını unutmayın .
statusseçenek eklendi dd(GNU Coreutils 8.24+)ddGNU Coreutils 8.24+ sürümünde (Ubuntu 16.04 ve daha yenisi) statusilerlemeyi göstermek için yeni bir seçenek bulundu:
dd if=/dev/urandom of=/dev/null status=progress
462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
dd if=/dev/zero bs=1M count=35000 | pv | dd of=VirtualDisk.raw.
pv bigfile.iso | dd of=VirtualDisk.raw bs=1M count=35000çalışır, doğrulandı. @SopalajodeArrierez, ikinci gd de parametreler verilebilir.
pv < /dev/sda > /dev/sdbdaha iyi hız elde etmek için görünüyor ( kaynak )
dd if=/dev/urandom | pv | of=/dev/sdb~ 18MB / s yazma, dd if=/dev/zero | pv | of=/dev/sdb~ 80MB / s ve düz eski dd if=/dev/zero of=/dev/sdb~ 550MB / s (SSD maksimum yazma hızına yakın) verir. Hepsi ile bs=4096000.
Gönderen HowTo: gg ilerleyişini izleme
killKomutu kullanarak dd'nin ilerlemesini durdurmadan izleyebilirsiniz .
ddÇalışırken ilerlemesini görmek için başka bir terminal açıp şunu girin:
sudo kill -USR1 $(pgrep ^dd)
Bu , işlemi durdurmadan terminal penceresinde ddilerleme gösterecektir dd. BSD veya OS X kullanıyorsanız, INFOyerine kullanın USR1. USR1Sinyal dd sona erer.
ddİlerlemeyle ilgili düzenli güncellemeler almak istiyorsanız , şunu girin:
watch -n5 'sudo kill -USR1 $(pgrep ^dd)'
watchddher -n saniyede bir ( -n5= 5 saniye) süreci kontrol edecek ve durmadan rapor edecektir.
Yukarıdaki komutlarda uygun tek tırnaklara dikkat edin.
kill -INFO $(pgrep ^dd$)BSD sistemlerinde kullanmanız gerekir (OSX gibi).
sudo pkill -usr1 ddhatırlaması daha kolay, mükemmel çalışıyor (en azından Ubuntu 14.04'te) ve yazması daha az.
pvTeddHansen'ın gösterdiği gibi transferi yavaşlatacak. Ayrıca, bahse girerim ki birçok kişi Googling yapıyor çünkü operasyona zaten başlamışlardı dd;)
Birkaç kullanışlı örnek, pvdiğer cevaplardan sonra daha az yazma veya daha fazla ilerleme ile birlikte kullanılır.
İlk pvönce şu komutu kullanarak yüklemeniz gerekir :
sudo apt-get install pv
O zaman bazı örnekler:
pv -n /dev/urandom | dd of=/dev/null
pv -tpreb source.iso | dd of=/dev/BLABLA bs=4096 conv=notrunc,noerror
Not: ilk örnek daha sonra yazarak 5 karakterdir dd if=/dev/urandom | pv | dd of=/dev/null.
Ve bir disk sürücüsünü klonlamak için favorim (X harfini sürücü harfleriyle değiştirin):
(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

kaynak: http://www.cyberciti.biz/faq/linux-unix-dd-command-show-progress-while-coping/
Ayrıca kendimi arşivlediğim için de.
dialogkomut ile yüklemeniz gerekecektirapt-get install dialog
dialog örneği. ŞİMDİ SERENITY !
dialogkabuk senaryoları yazarken delicesine yardımcı olacağını keşfetti : D
brew install pv dialogMac için. Ayrıca bu beyefendi tarzı ile hesaplar. Bravo.
Çalışırken Ctrl+ + Shifttuşlarını kullanın ve ilerlemeyi (bayt cinsinden) verirTdd
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)
dd.
^Tterminale çıkar (birçok terminal uygulaması dışında Ctrl-Shift-T'ye müdahale eder ve yeni bir sekme açar). OSX / BSD'deki birçok araştırmacı bu cevabı takdir edebilir, ancak bunun Ubuntu için (ya da genel olarak GNU / LInux?)
Bütünlüğü uğruna:
Sürüm 8.24 arasında GNU coreutils ilerleme yazdırmak için bir parametre tanıtan gg için bir yama içerir.
Bu değişikliği tanıtan taahhüdün yorumu şöyle:
dd: yeni durum = istatistikleri düzenli aralıklarla yazdırmak için ilerleme düzeyi
Ubuntu 16.04.2 LTS dahil olmak üzere pek çok dağıtım bu sürümü kullanır.
apt install build-essentialve apt-get build-dep coreutilssonra coreutils-8.25.tar.xz dosyasını indirip tar xvf coreutils-8.25.tar.xz configure --prefix=$HOME/usr/localçalıştırın make. Yeni derlenmiş dir ddaltında olacak src. / Bin 'e kopyalayabilir ve mevcut birini veya jus' u src / dd
En iyisi http://dcfldd.sourceforge.net/ kullanarak apt-get üzerinden yüklemek kolaydır
ddseçenek ve seçeneklerine status=onvarsayılan olarak sahiptir . Ben başka bir isim vereceğim :)statusinterval=Nsizeprobe=[if|of]DD
Yerli ilerleme durumu dd !!!
Coreutils'in yeni sürümü (8.24), ddaraca bir ilerleme durumu ekliyor :
Xubuntu 15.10'da Kullanımı:
Bir terminal açın ve şu komutları yazın:
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)
ddKök olarak çalıştır :
sudo su
cd src
./dd if=/dev/sdc of=/dev/sda conv=noerror status=progress
Göreceksiniz: Bayt, saniye ve hız (Bayt / saniye).
Sürümlerini kontrol etmek için dd:
Yerli:
dd --version
Yeni:
cd coreutils-8.24/src
./dd --version
Dd'yi daha önce başlattıysanız ve diske bir pendrive kopyası oluştururken olduğu gibi bir dosya yazıyorsanız, değişiklikleri görmek ve tamamlamayı tahmin etmek için çıktı dosyasının boyutunu sürekli olarak gözlemlemek için watch komutunu kullanabilirsiniz.
watch ls -l /pathtofile/filename
Yalnızca dosya boyutunu görmek için (h-insan görünümü):
watch ls -sh /pathtofile/filename
dd | pv | ddÜçlü sadece dd kullanarak 260 saniye aksine benim 50GB vm kopyalama, 800 saniye sürebilir yaptı. Bu boru hattıyla, en azından, pv, girdi dosyasının ne kadar büyük olduğu konusunda hiçbir fikre sahip olmadığı için, ne kadar süredir size söyleyemeyeceği için, aşağıdaki gibi yapmanın dezavantajı yoktur;
Büyük bir şey için pv önlemek ve (Bash kullanıyorsanız):
Kontrol-Z dd süreci
bgarka planda koymak için. İkinci sayının işlem kimliği olduğu bggibi çıktı vereceğini gözlemleyin [1] 6011. Öyleyse yapın:
while true; do kill -USR1 process_id ; sleep 5; done
nerede process_id gözlemlediğiniz işlem kimliğidir. Gibi bir şey gördüğünüzde Control-C'ye basın:
[1]+ Done dd if=/path/file.qcow2 of=/dev/kvm/pxetest bs=4194304 conv=sparse
-bash: kill: (60111) - No such process
Bitirdiniz.
Düzenleme: Aptal Sistem Yöneticisi! Hayatını otomatikleştir, çalışma! İzlemek istediğim uzun bir gd işlemim varsa, işte size enchilada ile ilgilenecek tek bir astar; hepsini bir satıra koy:
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
Tabii ki, komut dosyası, belki de $ 1 giriş dosyanızı ve $ 2 çıkış dosyasını yapabilirsiniz. Bu, okuyucu için bir egzersiz olarak bırakılmıştır. Öldürmeden önce o küçük uykuya ihtiyacınız olduğunu unutmayın, yoksa ölüm henüz hazır değilken gg'ye bir sinyal göndermeye çalışırken ölebilir. Uykularınızı istediğiniz gibi ayarlayın (belki de ikinci uykuyu tamamen kaldırın).
Bash-FTW! :-)
whileDöngüyü sıkıştırın . Kullanın watch.
sudo watch pkill dd. Ardından ddistatistikleri rahatça izleyin .
watch pkill -USR1 -x dd. Ayrıca watchdiğer benzer işler için kullandığım için, bu doğal olarak geliyor.
http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html
Temelde:
kill -USR1 < dd pid >
dd if=... of=... bs=4M status=progress oflag=dsync
oflag=dsyncYazınızı senkronize halde tutacaktır, bu nedenle bilgileri status=progressdaha doğru olacaktır. Ancak biraz daha yavaş olabilir.
conv=fsyncdaha iyidir
Ubuntu 16.04, dd (coreutils) Sürüm 8.25 ile birlikte gelir . Dolayısıyla seçenek status=progress olduğunu Desteklenen :-)
Kullanmak status=progressiçin ddkomutunuzla birlikte eklemeniz yeterli .
Örnek :
dd bs=4M if=/media/severus/tools-soft/OperatingSystems/ubuntu-16.04-desktop-amd64.iso of=/dev/null status=progress && sync
Statüsünü verir
1282846183 bytes (1.2 GiB, 1.1 GiB) copied, 14.03 s, 101.9 MB/s
status=progressAktarım sırasında ilerleme elde etmek için seçeneğini kullanın .
Ek olarak, conv=fsyncG / Ç hatalarını gösterecektir.
Örnek:
sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync
Gerçekten ddrescue'dan hoşlanıyorum, dd olarak çalışıyor ancak çıktı veriyor ve hatalarda başarısız olmuyor, aksine çok gelişmiş bir algoritmaya sahip, başarılı bir kopya çıkarmak için gerçekten çok zor bir girişim var ... Bunun için de birçok GUI var.
Proje: https://www.gnu.org/software/ddrescue
Wikipedia: https://en.wikipedia.org/wiki/Ddrescue
İlerlemeyi göstermek için ddkullanacağımız bir bash sarmalayıcı oluşturdum pv. İçine koyun .bashrcve ddher zamanki gibi kullanın :
# 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
Kaynak:
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[@]}"
}
#!/bin/bash. Altta: tmp=":${PATH}:"; tmp=${tmp/:/usr/local/bin:/:}; tmp=${tmp%:}; PATH=${tmp#:}; dd "$@"Veya sabit kodlu ddkonum isteyebilirsiniz . O zaman kullan local dd=/usr/bin/dd. Yürütülebilir parça eklemek unutmayın: chmod +x /usr/local/dd.
Bu yüzden bugün çalışırken killdöngü içinde koşmaya çalışmaktan biraz sıkıldım ddve bunları paralel olarak kolayca çalıştırmak için bu yöntemle geldim:
function vdd {
sudo dd "$@" &
sudo sh -c "while pkill -10 ^dd$; do sleep 5; done"
}
Şimdi vddnormalde kullanacağınız herhangi bir yeri kullanın dd(tüm argümanları doğrudan iletir) ve her 5 saniyede bir yazılı bir ilerleme raporu alırsınız.
Tek dezavantajı, dd tamamlandığında komutun hemen geri dönmemesidir; bu nedenle, bu komutun bildirmeden ve çıkmadan önce dd döndürdükten sonra fazladan 5 saniye beklemenizi sağlayabilir.
Bu, gd'yi her 2 saniyede bir istatistik sağlamaya zorlar.
watch killall -USR1 dd
Her 2 saniyeden 5 saniyeye geçmek için şunun gibi -n 5 seçeneğini ekleyin:
watch -n 5 killall -USR1 dd
CentOS ülkesinden birisinin bu konuyu bulması durumunda ...
'Status = progress' seçeneği CentOS 7.5 ve 7.6 ile çalışır
@DavidDavidson tarafından yukarıda verilen yanıt, bu özellik Coreutils 8.24'te yeni eklendiğini gösteriyor.
GNU coreutils'in 8.24 sürümü, dd için ilerlemeyi yazdırmak üzere bir parametre tanıtan bir yamayı içerir.
Durum böyle olabilir, ancak CentOS aynı versiyon düzenini takip etmiyor olabilir.
CentOS 7.6.1810 ile birlikte gelen Coreutils sürümü:
coreutils-8.22-23.el7.x86_64 : A set of basic GNU tools commonly used in shell scripts
Ve yüklü olan dd sürümü:
[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.
Bu 8.22 versiyonlarını gösterir .
Bununla birlikte, 'status = progress' ı hem CentOS 7.5 hem de CentOS 7.6'da (her ikisi de Coreutils'in 8.22 sürümünde) dd ile test ettim ve düzgün çalışıyor.
RedHat'ın neden böyle eski bir Coreutils sürümünü kullanmayı seçtiğini bilmiyorum, ancak işlevsellik 8.22 ile var.
Yukarıda bahsedildiği gibi, en azından GNU coreutils veya busybox'ından 'gg' ile, ilerleme bilgisini stderr'e yazdırarak USR1 sinyaline yanıt verecektir.
Yüzde tamamlama göstergesinin güzel olduğunu gösteren dd için küçük bir sarmalayıcı komut dosyası yazdım ve dd'nin işlemine ya da herhangi bir şekilde çalışma biçimine müdahale etmemeye çalışıyor. Onu github'da bulabilirsiniz:
http://github.com/delt01/dd_printpercent
Ne yazık ki, bu SIGUSR1 numarası sadece derleme zamanında etkin olan bu özel özellik ile birlikte GNU dd (coreutils paketinden) veya busybox'ın 'dd' moduyla çalışır. FreeBSD ve OS X ... dahil birçok BSD sistemine dahil olan 'dd' stoğuyla çalışmaz.
Herhangi bir coreutils programının ilerlemesini kullanarak izleyebilirsiniz progress - Coreutils Progress Viewer.
İzleyebilir:
cp mv dd katran kedi rsync grep fgrep egrep kesmek sıralama md5sum sha1sum sha224sum sha256sum sha384sum sha512sum adb gzip gunzip bzip2 bunzip2
Manpage görebilirsiniz
Komut çalışırken ayrı bir terminal penceresinde kullanabilir veya dd komutuyla başlatabilirsiniz:
dd if=/dev/sda of=file.img & progress -mp $!
Burada &ilk komutu çatallar ve komut bitene kadar beklemek yerine derhal devam eder.
Progress komutu şu şekilde başlatılır: -mbu nedenle, izlenen işlem sona erene kadar bekler, -pbu nedenle verilen bir teklifi izler ve $!son komutun talebidir.
Sd ile gg yayınlarsanız, ilerleme ile de devam etmelisiniz:
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