ddの進捗をどのように監視しますか?


654

dd不思議です。ハードドライブを別のハードドライブに複製したり、ハードドライブを完全にゼロにしたりすることができますdd。コマンドが最終的に終了するまで、カーソルの位置に置かれます。では、ddの進捗状況をどのように監視するのでしょうか?

回答:


728

2016年更新:GNU coreutils> = 8.24(Ubuntu Xenial 16.04以降のデフォルト)を使用する場合、進行状況を表示する別の方法については、以下の方法2を参照してください。


方法1:を使用して pv

pv入力/出力専用ddコマンドの間にインストールして配置します。

:既に開始している場合は使用できませんdd

パッケージの説明から:

pv-パイプビューアー-パイプラインを介してデータの進行状況を監視するための端末ベースのツールです。2つのプロセス間の通常のパイプラインに挿入して、データの通過速度、所要時間、完了までの時間、完了までの推定時間を視覚的に示すことができます。

設置

sudo apt-get install pv

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

出力

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

--size時間の見積もりが必要な場合は、おおよそのサイズを指定できます。


例/ dev / sdbからコピーされる2GBのディスクを想定

なしのコマンドpv

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

コマンドを使用しましたpv

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

出力:

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

その他の用途

もちろん、pv直接出力をstdoutにパイプするために使用できます。

pv /home/user/bigfile.iso | md5sum

出力

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

この場合、pvサイズは自動的に認識されることに注意してください。


方法2:(GNU Coreutils 8.24+)にstatus追加された新しいオプションdd

ddGNU Coreutils 8.24+(Ubuntu 16.04以降)ではstatus、進行状況を表示する新しいオプションが追加されました。

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

出力

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

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

18
「dd」のパラメーターは、前半(パイプの入力部分)で適切であることに注意してくださいdd if=/dev/zero bs=1M count=35000 | pv | dd of=VirtualDisk.raw
ソパラホデアリエレス14年

6
pv bigfile.iso | dd of=VirtualDisk.raw bs=1M count=35000動作確認済み。@SopalajodeArrierez、パラメーターは2番目のddで指定できます。
SiddharthaRT

11
使用するpv < /dev/sda > /dev/sdbと速度が向上するようです(ソース
ニコラフェルトリン

14
速度に関する参考までに。Samsung 840 PRO SSDを搭載したコンピューターでのテスト:dd if=/dev/urandom | pv | of=/dev/sdb書き込みで最大18MB /秒、書き込みで最大dd if=/dev/zero | pv | of=/dev/sdb80MB /秒、古いdd if=/dev/zero of=/dev/sdbもので最大550MB /秒(SSD最大書き込み速度に近い)。ですべてbs=4096000
テッドハンセン

461

HowToから:ddの進行状況を監視する

killコマンドを使用して、ddを停止せずに進行状況を監視できます。

dd実行中の進行状況を確認するには、別のターミナルを開いて次のように入力します。

sudo kill -USR1 $(pgrep ^dd)

これにより、プロセスを停止することなくddddターミナルウィンドウに進行状況が表示されます。BSDまたはOS Xを使用している場合は、のINFO代わりに使用しますUSR1USR1信号は、DDを終了します。

dd進行状況の定期的な更新を取得する場合は、次を入力します。

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

watchdd-n秒(-n5= 5秒)ごとにプロセスをプローブし、停止せずにレポートします。

上記のコマンドの適切な一重引用符に注意してください。


19
これは機能しましたが、いくつかのコメントがありました。まず第一に、なぜバックティックをエスケープしたのかわかりません(SOエディタ用の場合は、間違ってしました)。次に、接頭辞ddで他の何かが実行されている場合に備えて、^ dd $の使用をお勧めします。最後に、USR1シグナルを送信するのにsudoは必要ありません。そうでなければ、良い答え、+ 1。
gsingh2011

22
NB!このようにして、interupts ddはOSXで動作します。
マキシムKholyavkin 14年

26
@Speakus kill -INFO $(pgrep ^dd$)BSDシステム(OSXなど)で使用する必要があります。
トーベン

20
sudo pkill -usr1 dd覚えやすく、完全に正常に動作し(少なくともUbuntu 14.04で)、入力しにくいです。
-Phizes

21
pvTeddHansenが示したように、転送が遅くなるのではないかと心配しているので、これが気に入っています。また、多くの人がこれをグーグルしているのは間違いないでしょう。なぜなら、彼らはすでにdd操作を開始しているからです;)
sudo

104

pv他の回答よりも少ないタイピングまたはより多くの進歩を備えたいくつかの便利なサンプル使用法:

最初に、次pvのコマンドでをインストールする必要があります。

sudo apt-get install pv

次に、いくつかの例を示します。

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

注:最初のサンプルは、5文字少ない入力dd if=/dev/urandom | pv | dd of=/dev/nullです。

そして、ディスクドライブのクローンを作成するのに私のお気に入り(Xをドライブ文字で置き換えます):

(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

スクリーンショット

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

自分自身をアーカイブするためにも。


3
dialogのコマンドでもインストールする必要がありますapt-get install dialog
k7k0

7
LOVEdialog例を。セレニティナウ
アレックスグレー

あなたはそのダイアログをPythonで呼び出すことができますか?
mikeymop

1
この回答のおかげで、dialogこれがシェルスクリプトの作成に非常に役立つことが
わかり

2
brew install pv dialogMac用。また、この紳士はスタイルで計算します。ブラボー。
-evilSnobu

62

実行中にCtrl+ Shift+ Tを使用ddすると、進行状況(バイト単位)が出力されます。

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 Trustyでは私には機能しません。競合する可能性のあるキーバインディング?
jamadagni 14年

14
素晴らしい方法。OSXでは動作しますが、ubuntu 14.04では動作しません
マキシム・ホリャフキン14年

1
最初の行はOS Xによって生成され、後者の3行のみがからのものddです。
イタイGrudev

3
OS XなどのBSDでkill -INFOを使用できるはずです
-macshome

3
これはUbuntuでは機能しません。Ctrl-T / Ctrl-Shift-T ^Tはターミナルにのみ出力します(多くのターミナルアプリはCtrl-Shift-Tをインターセプトし、新しいタブを開きます)。OSX / BSD上の多くのサーチャーは、この答えを理解し得るが、それはそれはUbuntuのためではないことが明らかにされるべきである(あるいは一般的にはGNU / Linuxの?)
mwfearnley

60

完全を期すために:

GNU coreutilsのバージョン8.24には、進行状況を出力するパラメーターを導入するddのパッチが含まれています。

この変更導入するコミットにはコメントがあります:

dd:ステータスを定期的に出力するための新しいstatus = progressレベル

Ubuntu 16.04.2 LTSを含む多くのディストリビューションがこのバージョンを使用しています。


8.24 coreutils:apt install build-essentialとをコンパイルした方法を追加してapt-get build-dep coreutils、coreutils-8.25.tar.xzをダウンロードtar xvf coreutils-8.25.tar.xz configure --prefix=$HOME/usr/localして実行しmakeます。新しくコンパイルされたものddsrcdirの下にあります。これを/ binにコピーして、既存のものまたはsrc / ddとして実行されているjusを置き換えることができます
-holms

2
クール!この機能が気に入っています。そして、進行状況の出力を印刷するようにddに教えるのにちょうど約30年かかりました。:-)
ヨハネスオーバーマン

なんて安心!この引数をddシェルエイリアスにすぐに追加します。
ステファンヘニングセン

ステータスは、SI単位の1つの数値とバイナリ単位の同等の値(10 MB、9.5 MiBなど)の2つの数値で印刷される場合があることに注意してください。
palswim

33

最適なのはhttp://dcfldd.sourceforge.net/を使用することです。apt-get を使用して簡単にインストールできます。


3
ddと非常に互換性がありますが、いくつかの優れた新機能を備えたdcflddへのポインタをありがとう 私は特に標準的な進歩が好きです。
フロイド

4
dcflddがあまり知られていない理由は、私にとって完全な謎です。
Freedom_Ben

28
おそらくその名前のため。
ジョヴァンニトラルド14

デフォルトで、進行状況メッセージ、メッセージ更新頻度、および割合インジケーターのddオプション(ブロック内のN)のオプションがあります。私はそれを別名:)status=onstatusinterval=Nsizeprobe=[if|of]DD
kavadias

25

ネイティブの進行状況がddに追加されました!!!

新しいバージョンのCoreutils(8.24)は、ddツールに進行状況を追加します。

Xubuntu 15.10での使用:

ターミナルを開き、次のコマンドを入力します。

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ルートとして実行:

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

表示されるのは、バイト、秒、速度(バイト/秒)です。

のバージョンを確認するにはdd

ネイティブ:

dd --version

新着:

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

18

既にddを起動していて、ディスクにペンドライブのコピーを作成するときなどにファイルを書き込む場合、watchコマンドを使用して出力ファイルのサイズを常に監視し、変更を確認して完了を推定できます。

watch ls -l /pathtofile/filename

ファイルサイズのみを表示するには(h-humanビュー):

watch ls -sh /pathtofile/filename

また、実行可能な方法...
ζ--

3
有用ですが、dd出力をファイル以外の何かにパイピングしている場合(ディスクに書き込む前にgzipするなど)、これは必ずしも機能しません。
ポンカドゥードル14

特殊ファイルでは機能しません。
ヨハネスオーバーマン

13

dd | pv | ddトライアドはちょうどDD使用して260秒とは対照的に、私の50ギガバイトのVMのコピーは、800秒かかりました。このパイプラインでは、少なくともpvには入力ファイルの大きさがわからないため、自分がどれだけ遠くにあるかを伝えることができないため、次のように行うことで不利な点はありません。

私は大きなものでpvを避けます、そして(Bashを使用している場合):

Control-Z ddプロセス

bgバックグラウンドに配置します。後者の番号がプロセスIDであるbgような出力が得られることに注意してください[1] 6011。だから、やる:

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

process_idは、観察したプロセスIDです。次のようなものが表示されたら、Control-Cを押します。

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

できました。

編集:愚かなシステム管理者!あなたの人生を自動化してください、動作しません!監視したいddプロセスが長い場合、エンチラーダ全体を処理するワンライナーがあります。これをすべて1行に入力します。

 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

もちろん、スクリプトを作成して、$ 1を入力ファイルに、$ 2を出力ファイルにできます。これは読者の演習として残されています。キルの前に少しスリープする必要があることに注意してください。キルが終了しない場合、ddにシグナルを送信しようとして死ぬ可能性があります。必要に応じて睡眠を調整します(2番目の睡眠を完全に削除することもあります)。

Bash- FTW!:-)


1
whileループを圧縮します。を使用しwatchます。
ムル

1
@muruそれは依存します。お使いのシステムについては知りませんが、CentOS7 *では出力が少し文字化けしています。読みやすいですが、整然と見えません。また、以前の出力を踏みつけるため、ddの速度の履歴が失われます。私のものは20 MB / sと300 MB / sの間で異なります。数字が変化し、有益であるのを見るのも面白いです。大きな違いの一部は、LVMシンプールが書き込み中のLVの割り当てを増やしているためだと思います。*はい、これはubuntuフォーラムですが、「dd monitor progress」を探してここに来ました。Googleでの最初の結果です。
マイクS

ああ、私は別の端末または画面ウィンドウで実行することを意味しましたsudo watch pkill dd。その後dd、快適に統計情報を出力します。
ムル

pkillはデフォルトでSIGTERMを送信しませんか?単一のddを実行するとpgrep ddが3つのpidを生成するため、kthreadd、oddjob、およびddのように、私も実験したくありません。スキルが何をするのか怖いです。pkillを使用して-USR1シグナルを送信できますが、カーネルスレッドまたはobbjobに送信しても安全かどうかはわかりません。watchコマンドはよりきれいに見えますが、whileループを回避するためだけに多くの余分なステップがあるようです。一般に、1つのウィンドウでddを実行している場合、すぐに同じシェルで何かを実行します。whileループは安全です。どのpidがシグナルを受け取るかを正確に知っています。
マイクS

私はを使用してwatch pkill -USR1 -x ddいるため、どのPIDがシグナルを取得するかはほとんど気にしません。私watchは他の同様のタスクにも使用しているため、これは当然のことです。
ムル

11

1
「pkill -USR1 dd」は、私が知っている最も単純なバージョンです(とにかくddの1つのインスタンスを実行している限り)。私のシステムでは、sudoが必要です: "sudo pkill -USR1 dd"。ddコマンドを入力した後に機能し、新しいものをインストールする必要はありません。
フレッドハミルトン

7

最も簡単なのは:

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

oflag=dsyncあなたの文章の同期を保つので、の情報status=progressはより正確です。ただし、少し遅いかもしれません。


1
よるgnu.org/software/coreutils/manual/html_node/dd-invocation.html、使用してはconv=fsync良いです
陳登-Taの

これをありがとう!リモートlvm2に対してddを実行していますが、bs = 4Mにより転送が20倍になり、進行状況の表示がすばらしいです。
ロニーベスト

6

Ubuntu 16.04で

Ubuntu 16.04にはdd(coreutils)バージョン8.25が付属しています。したがって、このオプションstatus=progress サポートされています:-)

使用するstatus=progressには、ddコマンドとともに追加するだけです。

例:

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

ステータスを

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

ここに画像の説明を入力してください


5

オプションstatus=progressを使用して、転送中に進行状況を取得します。

さらに、conv=fsyncI / Oエラーを表示します。

例:

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


3

進行状況の表示にdd使用pvするbashラッパーを作成しました。それをあなたに入れて、いつものように.bashrc使用しますdd

# 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

ソース:

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

良い方法ですが、sudoやtimeなどのコマンドでは機能しません。
マキシムKholyavkin 14年

1
これを上にして/ usr / local / bin / ddに配置します#!/bin/bash。下部:tmp=":${PATH}:"; tmp=${tmp/:/usr/local/bin:/:}; tmp=${tmp%:}; PATH=${tmp#:}; dd "$@"または、dd場所をハードコードすることもできます。次にを使用しますlocal dd=/usr/bin/dd。実行可能ビットを追加することを忘れないでください:chmod +x /usr/local/dd
midenok

2

そのため、今日、実行kill中にループで実行しようとすると少しイライラしdd、それらを簡単に並行して実行するためのこの方法を思いつきました。

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

これでvdd、通常使用する任意の場所を使用するだけでdd(すべての引数が直接渡されます)、5秒ごとに進行状況レポートが出力されます。

唯一の欠点は、ddが完了してもコマンドがすぐに返らないことです。そのため、このコマンドは、ddが戻ってから気づいて終了するまで、さらに5秒待機する可能性があります。


2

これにより、ddは2秒ごとに統計情報を提供します。これは、監視のデフォルトです。

watch killall -USR1 dd

2秒ごとから5秒ごとに変更するには、次のように-n 5オプションを追加します。

watch -n 5 killall -USR1 dd

2

CentOSの土地の誰かがこのスレッドを見つけた場合に備えて...

'status = progress'オプションはCentOS 7.5および7.6で動作します

上記の@davidDavidsonによる回答は、この機能がCoreutils 8.24で新たに追加されたことを意味しています。

GNU coreutilsのバージョン8.24には、進行状況を出力するパラメーターを導入するddのパッチが含まれています。

この場合もありますが、CentOSは同じバージョン管理スキームに従っていない可能性があります。

CentOS 7.6.1810に付属するCoreutilsのバージョンは次のとおりです。

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

また、インストールされるddのバージョンは次のとおりです。

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

これは、バージョン8.22を示しています。

ただし、CentOS 7.5とCentOS 7.6(Coreutilsのバージョン8.22の両方)でddを使用して 'status = progress'をテストしましたが、正常に機能します。

RedHatがこのような古いバージョンのCoreutilsを使用することを選択した理由はわかりませんが、8.22には機能が存在します。


1

上記のように、少なくともGNU coreutilsの「dd」またはbusyboxでは、進捗情報をstderrに出力することでUSR1シグナルに応答します。

私はddの小さなラッパースクリプトを作成しました。このラッパースクリプトは、優れたパーセント完了インジケーターを示し、ddのプロセスや機能の方法に干渉しないようにしています。githubで見つけることができます:

http://github.com/delt01/dd_printpercent

残念ながら、このSIGUSR1トリックは、GNU dd(coreutilsパッケージから)またはbusyboxの 'dd'モードでのみ機能し、その特定の機能はコンパイル時に有効になります。FreeBSDやOS Xなど、ほとんどのBSDシステムに含まれる標準の「dd」では動作しません... :(


リンクは無効です。
イシュマエル

1

を使用して、coreutilsプログラムの進行状況を監視できprogress - Coreutils Progress Viewerます。

以下を監視できます。

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

マンページを見ることができます

コマンドの実行中に別のターミナルウィンドウで使用するか、ddコマンドで起動できます。

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

ここで&は、最初のコマンドを分岐し、コマンドが終了するまで待つのではなく、すぐに続行します。

progressコマンドは次のコマンドで起動-mされます。監視対象プロセスが終了するまで待機する-pため、指定されたpidを監視し$!、最後のコマンドpidになります。

sudoを使用してddを発行する場合は、進捗も必要です。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.