dd
は不思議です。ハードドライブを別のハードドライブに複製したり、ハードドライブを完全にゼロにしたりすることができます。ただし、dd
コマンドを起動すると、その進行状況を伝えるものは何もありません。コマンドが最終的に終了するまで、カーソルの位置に置かれます。では、ddの進捗状況をどのように監視するのでしょうか?
From HowTo:ddの進行状況を監視する
kill
コマンドを使用すると、ddを停止せずに進行状況を監視できます。
実行中のdd
の進行状況を確認するには、別のターミナルを開いて次のように入力します。
Sudo kill -USR1 $(pgrep ^dd)
これにより、プロセスを停止することなく、dd
ターミナルウィンドウにdd
進行状況が表示されます。 BSDまたはOS Xを使用している場合は、USR1
の代わりにINFO
を使用します。 USR1
シグナルはddを終了します。
dd
進捗の定期的な更新を取得する場合は、次のように入力します。
watch -n5 'Sudo kill -USR1 $(pgrep ^dd)'
watch
は、-n秒(-n5
= 5秒)ごとにdd
プロセスをプローブし、停止せずにレポートします。
上記のコマンドの適切な一重引用符に注意してください。
Update 2016:GNUを使用する場合coreutils> = 8.24(Ubuntu Xenial 16.04以降のデフォルト)、進行状況を表示する別の方法については、以下の方法2を参照してください。
pv
を使用してpv
をインストールし、入力/出力のみdd
コマンドの間に配置します。
注:dd
を既に開始している場合は使用できません。
From パッケージの説明 :
pv
-Pipe Viewer-パイプラインを介したデータの進行状況を監視するための端末ベースのツールです。 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
はサイズを自動的に認識することに注意してください。
status
に追加された新しいdd
オプション(GNU Coreutils 8.24+)dd
in GNU 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
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
注:最初のサンプルは、dd if=/dev/urandom | pv | dd of=/dev/null
の入力より5文字少ないです。
そして、ディスクドライブのクローンを作成するのに私のお気に入り(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/
自分自身をアーカイブするためにも。
つかいます 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)
完全を期すために:
バージョン8.24GNU coreutilsには、進行状況を出力するパラメーターを導入するddのパッチが含まれています。
コミット この変更の紹介にはコメントがあります:
dd:定期的に統計を出力する新しいstatus = progressレベル
Ubuntu 16.04.2 LTSを含む多くのディストリビューションがこのバージョンを使用しています。
http://dcfldd.sourceforge.net/ を使用するのが最適です。apt-getを使用して簡単にインストールできます。
ネイティブの進行状況が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
すでにddを起動しており、ペンドライブのコピーをディスクに作成するときなどにファイルを書き込む場合、watchコマンドを使用して出力ファイルのサイズを常に監視し、変更を確認して完了を推定できます。
watch ls -l /pathtofile/filename
ファイルサイズのみを表示するには(h-humanビュー):
watch ls -sh /pathtofile/filename
dd | pv | dd
トライアドにより、ddを使用した260秒ではなく、50GBのvmコピーに800秒かかりました。このパイプラインでは、少なくともpvには入力ファイルの大きさがわからないため、自分がどれだけ遠くにいるかを伝えることができないため、次のように行うことで不利な点はありません。
私は大きなものでpvを避けます(そしてBashを使用している場合):
Control-Z ddプロセス
bg
はバックグラウンドに配置します。 bg
が[1] 6011
のような出力を提供することに注意してください。後者の番号はプロセスIDです。だから、やる:
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! :-)
http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html
基本的に:
kill -USR1 < dd pid >
dd if=... of=... bs=4M status=progress oflag=dsync
oflag=dsync
は文章の同期を保つので、status=progress
の情報はより正確です。ただし、少し遅いかもしれません。
Ubuntu 16.04にはdd(coreutils)バージョン8.25が付属しています。したがって、オプションstatus=progress
isサポート:-)
使用するには、dd
コマンドとともにstatus=progress
を追加するだけです。
例:
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
オプションstatus=progress
を使用して、転送中に進行状況を取得します。
さらに、conv=fsync
はI/Oエラーを表示します。
例:
Sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync
私はddrescueが本当に好きです。ddとして機能しますが、出力を提供し、エラーで失敗しません。逆に、非常に高度なアルゴリズムを備えており、コピーを成功させるために本当に努力します...
プロジェクト: https://www.gnu.org/software/ddrescue
dd
を介してbashラッパーを作成し、pv
を使用して進行状況を表示します。 .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[@]}"
}
これにより、ddは2秒ごとに統計情報を提供します。これは、監視のデフォルトです。
watch killall -USR1 dd
2秒ごとから5秒ごとに変更するには、次のように-n 5オプションを追加します。
watch -n 5 killall -USR1 dd
そのため、今日、kill
の実行中にdd
をループで実行しようとすると少しイライラし、それらを簡単に並列実行するためのこのメソッドを思いつきました。
function vdd {
Sudo dd "$@" &
Sudo sh -c "while pkill -10 ^dd$; do sleep 5; done"
}
これで、通常vdd
(すべての引数を直接渡す)を使用する任意の場所でdd
を使用するだけで、5秒ごとに進行状況レポートが出力されます。
唯一の欠点は、ddが完了してもコマンドがすぐに返らないことです。そのため、このコマンドは、ddが戻ってから気づいて終了するまで、さらに5秒待機する可能性があります。
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で存在します。
上記のように、少なくともGNU coreutilsまたはbusyboxの「dd」を使用すると、進捗情報をstderrに出力することでUSR1シグナルに応答します。
ナイスパーセントコンプリートインジケーターを表示するddの小さなラッパースクリプトを記述し、ddのプロセスや機能の方法に干渉しないようにします。 githubで見つけることができます:
http://github.com/delt01/dd_printpercent
残念ながら、このSIGUSR1トリックは、GNU dd(coreutilsパッケージから)またはbusyboxの 'dd'モードでのみ機能し、その特定の機能はコンパイル時に有効になります。 FreeBSDやOS Xなど、ほとんどのBSDシステムに含まれる標準の「dd」では動作しません... :(
progress - Coreutils Progress Viewer
を使用して、coreutilsプログラムの進行状況を監視できます。
以下を監視できます。
cp mvddtar 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
manpage を見ることができます
コマンドの実行中に別のターミナルウィンドウで使用するか、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