DD'nin ilerlemesini nasıl izlersiniz?


654

ddbir mucize. Bir sabit sürücüyü diğerine kopyalamanıza, tamamen bir sabit sürücüyü tamamen sıfırlamanıza, vb dd. İzin verir. Komut bitinceye kadar sadece imlecin üzerine oturur. Peki bir kişi dd'nin gelişimini nasıl izliyor?

Yanıtlar:


728

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.


Yöntem 1: kullanarak pv

pvSadece 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 .


Yöntem 2: Yeni 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:

Örnek

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

Çıktı

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

76
pv bigfile.iso | = / dev / sizin cihazınız
Ion Br.

18
"Dd" parametreleri birinci yarısı (borunun giriş kısmı) uygun olduğuna dikkat edin: 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=35000çalışır, doğrulandı. @SopalajodeArrierez, ikinci gd de parametreler verilebilir.
SiddharthaRT

11
kullanarak pv < /dev/sda > /dev/sdbdaha iyi hız elde etmek için görünüyor ( kaynak )
Nicola Feltrin

14
FYI hızda. Bilgisayarımda Samsung 840 PRO SSD ile yapılan testler: 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.
Tedd Hansen,

461

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.


19
Bu çalıştı, ancak birkaç yorum. Her şeyden önce, geri tepmelerinizden neden kaçtığınızdan emin değilim (eğer SO editörü için yanlış yaptınız). İkincisi, ^ dd $ 'ı kullanmanızı öneririm, sadece başka bir şey dd ile çalışıyorsa. Son olarak, USR1 sinyalini göndermek için sudo'ya ihtiyacınız yok. Aksi takdirde, iyi cevap, +1.
gsingh2011

22
NB! Bu yol dd çalışmasını OSX altında durdurur.
Maxim Kholyavkin 17:14

26
@ Speakus kill -INFO $(pgrep ^dd$)BSD sistemlerinde kullanmanız gerekir (OSX gibi).
Torben

20
sudo pkill -usr1 ddhatırlaması daha kolay, mükemmel çalışıyor (en azından Ubuntu 14.04'te) ve yazması daha az.
12

21
Bunu sevdim çünkü korkarım 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;)
sudo

104

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

ekran görüntüsü

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

Ayrıca kendimi arşivlediğim için de.


3
ayrıca dialogkomut ile yüklemeniz gerekecektirapt-get install dialog
k7k0

7
Lovedialog örneği. ŞİMDİ SERENITY !
alex grey

Bu diyaloğu yalnızca python ile arayabilir misiniz?
mikeymop

1
Bu cevap sayesinde, bunun dialogkabuk senaryoları yazarken delicesine yardımcı olacağını keşfetti : D
holms,

2
brew install pv dialogMac için. Ayrıca bu beyefendi tarzı ile hesaplar. Bravo.
evilSnobu

62

Ç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)

5
Kubuntu Vakfı'nda benim için çalışmıyor. Muhtemelen çelişen anahtar bağlantıları?
jamadagni

14
Harika yol. OSX altında çalışır, ancak ubuntu altında çalışmaz
14.04

1
İlk satır OS X tarafından üretilir, sadece son 3 satır bundan gelir dd.
Itay Grudev

3
Kill-INFO'yu OS X gibi bir BSD'de kullanabilmelisiniz
macshome

3
Bu Ubuntu'da çalışmıyor. Ctrl-T / Ctrl-Shift-T sadece ^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?)
Olmadığı açıkça belirtilmelidir

60

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.


sadece 8.24 coreutils'i nasıl derlediğimi eklemek istiyorum: 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
holms

2
Güzel! Bu özelliği beğendim. Ve dd'nin ilerleme çıktısını almayı öğretmesi yaklaşık 30 yıl aldı. :-)
Johannes Overmann

Ne rahatlama! Hemen bu argümanı bir dd kabuk takma adına ekleyeceğim.
Stephan Henningsen

Durumun bazen iki sayıyla yazdırılacağını, biri SI birimlerinde ve eşdeğer birimlerin ikili birimler halinde (örneğin, 10 MB, 9,5 MiB) yazdırılacağını unutmayın.
palswim

33

En iyisi http://dcfldd.sourceforge.net/ kullanarak apt-get üzerinden yüklemek kolaydır


3
işaretçi için dcfldd, dd ile uyumlu, ancak bazı yeni özellikler için teşekkürler. Özellikle standart ilerlemeyi seviyorum.
Floyd

4
Neden dcfldd'nin daha iyi bilinmediği, benim için tam bir gizem.
Freedom_Ben

28
muhtemelen adı için.
Giovanni Toraldo,

İlerleme mesajları için, mesaj güncelleme sıklığı ve yüzde göstergesi için (bloklar halinde N) ddseçenek ve seçeneklerine status=onvarsayılan olarak sahiptir . Ben başka bir isim vereceğim :)statusinterval=Nsizeprobe=[if|of]DD
kavadias

25

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

18

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

Ayrıca geçerli bir yöntem ...
ζ--

3
Faydalı, ancak dd çıktısını bir dosyadan başka birşeye aktarıyorsanız bu işe yaramaz (örneğin diske yazmadan önce gzip ').
Ponkadoodle

Özel dosyalar üzerinde çalışmaz.
Johannes Overmann

13

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! :-)


1
whileDöngüyü sıkıştırın . Kullanın watch.
muru

1
@muru buna bağlı. Sisteminizi bilmiyorum ama CentOS7 * 'de çıktı biraz bozuk; okunabilir ancak düzenli görünmüyor. Ayrıca önceki çıktınızın üzerinde durur, böylece dd'nizin hız geçmişini kaybedersiniz; mayın 20 MB / s ile 300 MB / s arasında değişmektedir. Rakamların değişkenlik gösterdiğini ve öğretici olduğunu görmek ilginç. Büyük varyansın bir kısmının, yazdığım bir LV için tahsisi artıran LVM ince havuzlarından kaynaklandığını düşünüyorum. * evet bu bir ubuntu forum ama burada "dd monitör ilerlemesi" için geldim. Google’daki ilk sonuç.
Mike S

Oh, demek istediğim başka bir terminal veya ekran penceresinde koş sudo watch pkill dd. Ardından ddistatistikleri rahatça izleyin .
muru

Pkill varsayılan olarak SIGTERM göndermez mi? Tek bir dd: kthreadd, tuddjob ve dd çalıştırırken pgrep dd 3 pid ile geldiği için denemek bile istemiyorum. Pkill'in yapacaklarından korkuyorum. -USR1 sinyalini pkill ile gönderebilirsiniz, fakat yine de çekirdek ipliğine veya obbjob'a göndermenin güvenli olup olmadığını bilmiyorum. Saat komutu daha temiz görünüyor, ancak sadece bir süre döngüsünden kaçınmak için bir sürü ilave adım gibi görünüyor. Genellikle tek bir pencerede DD yapıyorsam hemen sonra aynı kabukta bir şeyler yapacağım. While döngüsü güvenli: hangi pid'in sinyali aldığını KESİNLİKLE biliyorsunuz.
Mike S

çoğunlukla kullandığımdan beri hangi ilaçların sinyal aldığını umursamıyorum watch pkill -USR1 -x dd. Ayrıca watchdiğer benzer işler için kullandığım için, bu doğal olarak geliyor.
muru



6

Ubuntu'da 16.04

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

görüntü tanımını buraya girin


5

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


3

İ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[@]}"
}

İyi yol ama sudo veya zaman gibi komutlarla çalışmıyor.
Maxim Kholyavkin

1
Üstte bununla birlikte / usr / local / bin / dd dizinine koyun #!/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.
midenok

2

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.


2

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

2

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.


1

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.


Bağlantı öldü.
İsmail,

1

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.