Linux'ta DD'de yüzde alma yöntemi var mı?


41

İşte burada neler oluyor.

Sunucumdaki bir sürücünün yedeğini Linux canlı USB üzerinden başlattım. İlk sürücüyü ddvanilya komutuyla kopyalamaya başladım ; Sadece sudo dd if=/dev/sda of=/dev/sdc1ve sonra bunun tamamlanıncaya kadar konsolu boş bıraktığını hatırladım.

Yine de aynı sürücüye farklı bir yedekleme yapmam gerekiyordu, bu yüzden bunu da başladım sudo dd if=/dev/sdb of=/dev/sdc3 status=progressve ardından baytlardaki ilerlemenin yanı sıra geçerli aktarım hızını gösteren bir metin satırı aldım.

1.8TB'lerden kaç baytın yedeklendiğini hesaplamak yerine yedekleme yüzdesini gösteren bir metot umuyordum. Bunu yapmanın durum = ilerleme durumundan daha kolay bir yolu var mı?

Yanıtlar:


68

Bu sorunun cevabını gör [ 1 ]

pv

Örneğin başlamadan önce kullanabilirsiniz.pv

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 

Çıktı [ 2 ] :

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

Notlar:
Özellikle büyük dosyalar man ddiçin donanımınızdaki tüm işlemleri hızlandırmak için gerekli olan seçenekleri görmek ve ayarlamak isteyebilirsiniz , örneğin bs=100Marabellek ayarlamak, oflag=syncyazılan efektif baytları saymak için belki de direct...
Seçenek -ssadece tamsayı parametreleri alır 1.8T-->1844G.
İlk satırlardan fark edebileceğiniz gibi, hiç ihtiyacınız yok dd.


kill -USR1 pid

Eğer varsa zaten başlattıdd onun PID bireyleşirler sonra, komutu ( Ctrl- Z+ bgve bunu okumak veya pgrep ^dd...) Eğer bir sinyal gönderebilir USR1(veya SIGUSR1, ya SIGINFOaşağıya bakınız) ve çıkışını okuyun.
Programın PID değeri 1234 ise

kill -USR1 1234

dd STDERR'nin terminaline benzer bir şeyle cevap verecektir.

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

Uyarı: OpenBSD altında kill[ 3 ] davranışını önceden kontrol etmeniz gerekebilir : bunun yerine kullanın
kill -SIGINFO 1234.
Adında sigaction var SIGINFO. SIGUSR1Bir, bu durumda, gereken sonlandırmak programı ( dd...)
altında Ubuntu kullanımı -SIGUSR1( 10).


9
Neredeyse kesinlikle dd komutunda 'bs' kullanmanın oldukça hızlandırdığını göreceksiniz. Aynı anda = / dev / blah = / tmp / blah bs =
100M'nin

1
@Sirex Tabii ki bs'yi donanımınıza bağlı olarak aktarım hızını optimize edecek şekilde ayarlamanız gerekiyor ... Cevabında OP'nin komut satırını tekrarlıyoruz. :-)
Hastur

3
@Criggie çünkü: belki var ddvardı zaten tüm bitmiş write()sistem çağrıları ve fsyncya closeulaşmak diske yazma bekleyen engellendi. Yavaş bir USB çubuğu ile, büyük kirli yazma arabelleklerinin ne kadar büyük kirli yazma arabellekleri olabileceğine ilişkin varsayılan Linux I / O arabellek eşikleri, hızlı disklerdeki büyük dosyalardan niteliksel olarak farklı davranışlara yol açabilir, çünkü arabellekleri kopyaladığınız kadar büyüktür ve Hala fark edilir zaman alır.
Peter Cordes

5
Mükemmel cevap. Ancak, OpenBSD'de doğru kill sinyalinin SIGUSR1 değil SIGINFO olduğunu not etmek istiyorum. OpenBSD'de -USR1 kullanmak sadece dd'yi öldürür. Dolayısıyla, bunu yeni bir ortamda denemeden önce, kesmek istemediğiniz bir transferde, çevrenin nasıl davrandığını (daha güvenli bir testte) tanımak isteyebilirsiniz.
TOOGAM

1
sinyalleri için tavsiye ddgerçekten harika bir bilgi, özellikle yüklemek istemediğiniz / istemeyeceğiniz sunucular içinpv
mike

38

Bu tür şeyler için go-to-tool'um progress:

Bu araç şu anda sisteminizde çalışan coreutils temel komutlarını (cp, mv, dd, tar, gzip / gunzip, cat, vb.) Arayan Küçük , Kirli, Linux ve OSX-Sadece C komutu olarak tanımlanabilir ve kopyalanan verinin yüzdesini gösterir . Tahmini zaman ve iş hacmini gösterebilir ve "üste benzeyen" bir mod sağlar (izleme).

"<code> progress </code> kullanımda" ekran görüntüsü

Bu sadece tarar /procdizinleri bakar sonra ilginç komutlar için ve fdve fdinfoaçılan dosyaları bulmak ve pozisyonları aramaya ve en büyük dosya için raporlar durumu.

Çok hafif ve neredeyse her komutla uyumlu.

Özellikle yararlı buluyorum çünkü:

  • pvboru ile karşılaştırıldığında veya dcflddoperasyona başladığımda farklı bir komut çalıştırmam gerektiğini hatırlamak zorunda değilim, aslında olayları izleyebilirim;
  • kıyasla kill -USR1, bu hemen her komut çalışır, hep emin yanlışlıkla kopyasını öldürmeyeceğim yapmak için manpage tekrar kontrol etmek için gerekmez; ayrıca, parametreler olmadan çağrıldığında, şu anda çalışan herhangi bir ortak "veri aktarımı" komutunun ilerlemesini göstermesi hoş bir şeydir, bu yüzden PID'ye bakmam bile gerekmez;
  • ile karşılaştırıldığında pv -d, yine PID'ye bakmama gerek yok.

1
Not: Coreutils işlemlerinden daha fazlasını izleyebilirsiniz. Sadece komutun adını ile belirtin --command <command-name>.
jpaugh

1
This.Is.AWESOME!
Floris

25

Çalıştırın dd, sonra ayrı bir kabukta aşağıdaki komutu çağırın:

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

Bu, pv'nin ddişlemin tüm açık dosya tanımlayıcıları hakkında istatistikleri edinmesini sağlayacaktır . Hem okuma hem de yazma tamponunun nerede oturduğunu gösterir.


2
Gerçek sonra çalışır !? İnanılmaz!!
jpaugh

3
Bu çok havalı. Tüm verileri 3 işlemden geçirerek bellek-bant genişliği + bağlam-anahtarı ek yükünden kaçınır! @jpaugh: Sanırım sadece /proc/$PID/fdinfodosya pozisyonlarını ve hangi dosyaların (ve böylece boyutların) /proc/$PID/fdolduğunu görüyor . Öyleyse evet, çok havalı ve bir özellik için iyi bir fikir, ancak buna "şaşırtıcı" demezdim çünkü başka bir işlemin dosya konumlarını sorgulayan Linux API'leri var.
Peter Cordes

@PeterCordes Dosya pozisyonunun çekirdek tarafından ortaya çıktığını anlamadım. (Hayatımı dikkatlice pvönceden boru hatları hazırlamakla geçiriyorum.) Tabii ki, bunun işe yaradığını gördüğüm kadar uzun zamandır varsaydım.
jpaugh

9

Alternatif için var dd: dcfldd.

dcfldd, adli tıp ve güvenlik için kullanışlı özelliklere sahip, gelişmiş bir GNU dd sürümüdür.

Durum çıktısı - dcfldd, kullanıcının aktardığı veri miktarı ve ne kadar uzun işlem süreceği konusunda ilerlemesini güncelleyebilir.

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


Bu daha uzun bir komut adı ... açıkça, aşağılık. (+1)
jpaugh

6

Yüzde olarak, bazı matematik derslerini yapmanız gerekir, ancak bir dd'nin ilerlemesini insanın okunabilir formunda, zaten başladıktan sonra bile yapabilirsiniz. kill -USR1 $(pidof dd)

Geçerli dd işlemi aşağıdaki gibi görünecektir:

11117279 bayt (11 MB, 11 MiB) kopyalandı, 13.715 s, 811 kB / s


4
Bu temelde aynı şeyi status=progressverir
rakslice,

1
Aslında durumun, ilerlemenin verdiği şeyin tam olarak aynı olduğunu söylemek üzereydim.
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.