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.
pv
pv
Sadece giriş / çıkış dd
komutları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] [ <=> ]
--size
Bir zaman tahmini istiyorsanız , yaklaşık boyutunu belirtebilirsiniz .
Örnek 2GB diskin / dev / sdb'den kopyalandığını varsayarsak
Olmadan pv
emir 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, pv
boyutu otomatik olarak tanıdığını unutmayın .
status
seçenek eklendi dd
(GNU Coreutils 8.24+)dd
GNU Coreutils 8.24+ sürümünde (Ubuntu 16.04 ve daha yenisi) status
ilerlemeyi 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/sdb
daha 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
kill
Komutu 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 dd
ilerleme gösterecektir dd
. BSD veya OS X kullanıyorsanız, INFO
yerine kullanın USR1
. USR1
Sinyal dd sona erer.
dd
İlerlemeyle ilgili düzenli güncellemeler almak istiyorsanız , şunu girin:
watch -n5 'sudo kill -USR1 $(pgrep ^dd)'
watch
dd
her -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 dd
hatırlaması daha kolay, mükemmel çalışıyor (en azından Ubuntu 14.04'te) ve yazması daha az.
pv
TeddHansen'ı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, pv
diğ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.
dialog
komut ile yüklemeniz gerekecektirapt-get install dialog
dialog
örneği. ŞİMDİ SERENITY !
dialog
kabuk senaryoları yazarken delicesine yardımcı olacağını keşfetti : D
brew install pv dialog
Mac 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
.
^T
terminale çı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-essential
ve apt-get build-dep coreutils
sonra 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 dd
altı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
dd
seçenek ve seçeneklerine status=on
varsayılan olarak sahiptir . Ben başka bir isim vereceğim :)statusinterval=N
sizeprobe=[if|of]
DD
Yerli ilerleme durumu dd !!!
Coreutils'in yeni sürümü (8.24), dd
araca 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)
dd
Kö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
bg
arka planda koymak için. İkinci sayının işlem kimliği olduğu bg
gibi çı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! :-)
while
Döngüyü sıkıştırın . Kullanın watch
.
sudo watch pkill dd
. Ardından dd
istatistikleri rahatça izleyin .
watch pkill -USR1 -x dd
. Ayrıca watch
diğ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=dsync
Yazınızı senkronize halde tutacaktır, bu nedenle bilgileri status=progress
daha doğru olacaktır. Ancak biraz daha yavaş olabilir.
conv=fsync
daha 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=progress
için dd
komutunuzla 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=progress
Aktarım sırasında ilerleme elde etmek için seçeneğini kullanın .
Ek olarak, conv=fsync
G / Ç 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 dd
kullanacağımız bir bash sarmalayıcı oluşturdum pv
. İçine koyun .bashrc
ve dd
her 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 dd
konum 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 kill
döngü içinde koşmaya çalışmaktan biraz sıkıldım dd
ve 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 vdd
normalde 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: -m
bu nedenle, izlenen işlem sona erene kadar bekler, -p
bu 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