Ответы:
Обновление 2016 : Если вы используете GNU coreutils> = 8.24 (по умолчанию в Ubuntu Xenial 16.04 и выше), см. Способ 2 ниже для альтернативного способа отображения прогресса.
pvУстановите pvи поместите его между ddкомандами ввода / вывода .
Примечание : вы не можете использовать его, когда вы уже начали dd.
Из описания пакета :
pv- Pipe Viewer - инструмент на основе терминала для мониторинга прохождения данных через конвейер. Он может быть вставлен в любой нормальный конвейер между двумя процессами, чтобы наглядно показать, как быстро проходят данные, сколько времени это заняло, как близко к завершению, и оценить, как долго это будет продолжаться до завершения.
Монтаж
sudo apt-get install pv
пример
dd if=/dev/urandom | pv | dd of=/dev/null
Выход
1,74MB 0:00:09 [ 198kB/s] [ <=> ]
Вы можете указать приблизительный размер с помощью, --sizeесли вы хотите оценить время.
Пример Предполагается, что диск объемом 2 ГБ копируется из / dev / sdb
Команда без 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в 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
dd if=/dev/zero bs=1M count=35000 | pv | dd of=VirtualDisk.raw.
pv bigfile.iso | dd of=VirtualDisk.raw bs=1M count=35000работает, проверено. @SopalajodeArrierez, параметры могут быть заданы во втором дд.
pv < /dev/sda > /dev/sdbкажется , чтобы получить более высокую скорость ( источник )
dd if=/dev/urandom | pv | of=/dev/sdbскорость записи dd if=/dev/zero | pv | of=/dev/sdb~ 18 МБ / с, скорость ~ 80 МБ / с, а у старой dd if=/dev/zero of=/dev/sdbверсии ~ 550 МБ / с (близко к максимальной скорости записи SSD). Все с bs=4096000.
От HowTo: следить за прогрессом дд
Вы можете отслеживать прогресс dd, не останавливая его, используя killкоманду.
Чтобы увидеть ход ddвыполнения, откройте другой терминал и введите:
sudo kill -USR1 $(pgrep ^dd)
Это будет отображать ddпрогресс в ddокне терминала без остановки процесса. Если вы используете BSD или OS X, используйте INFOвместо USR1. USR1Сигнал прекращает дд.
Если вы хотите получать регулярные обновления ddпрогресса, введите:
watch -n5 'sudo kill -USR1 $(pgrep ^dd)'
watchбудет проверять ddпроцесс каждые -n секунд ( -n5= 5 секунд) и сообщать, не останавливая его.
Обратите внимание на правильные одинарные кавычки в командах выше.
kill -INFO $(pgrep ^dd$)в системах BSD (например, OSX).
sudo pkill -usr1 ddлегче запомнить, отлично работает (по крайней мере, в Ubuntu 14.04) и меньше печатать.
pvэто замедлит передачу, как показал Тедд Хансен. Кроме того, я держу пари, что многие люди гуглят это, потому что они уже начали ddоперацию;)
Несколько удобных примеров использования с 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/
Также для архивации себя.
dialogс помощью командыapt-get install dialog
dialogпримеру. SERENITY СЕЙЧАС !
dialogэто безумно поможет в написании сценариев оболочки: D
brew install pv dialogдля Mac. Также этот джентльмен вычисляет стиль. Браво.
Используйте 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)
dd.
^Tна терминал (за исключением того, что многие терминальные приложения пересекают Ctrl-Shift-T и открывают новую вкладку). Многие поисковики по OSX / BSD могут оценить этот ответ, но следует уточнить, что это не для Ubuntu (или GNU / LInux в целом?)
Для полноты картины:
Версия 8,24 из Coreutils GNU включает в себя патч для дд введения параметра для печати прогресса.
Коммит, представляющий это изменение, имеет комментарий:
дд: новый статус = уровень прогресса для периодической печати статистики
Многие дистрибутивы, в том числе Ubuntu 16.04.2 LTS, используют эту версию.
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. Вновь скомпилированный ddбудет в srcдиректории. Вы можете скопировать его в / bin и заменить существующий или запустить его как src / dd
Лучше всего использовать http://dcfldd.sourceforge.net/, его легко установить через apt-get
ddи опцию status=onпо умолчанию для сообщений о ходе выполнения statusinterval=N(N в блоках) для частоты обновления сообщений и sizeprobe=[if|of]для процентного показателя. Я буду псевдоним это к DD:)
Родной статус прогресса был добавлен в 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с правами root:
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 и записываете файл, например, при создании копии pendrive на диск, вы можете использовать команду watch для постоянного наблюдения за размером выходного файла, чтобы увидеть изменения и оценить завершение.
watch ls -l /pathtofile/filename
Чтобы увидеть только размер файла (человеческое представление):
watch ls -sh /pathtofile/filename
dd | pv | ddТриада сделала мой 50GB VM копия займет 800 секунд, в отличие от 260 секунд , используя только дд. С этим конвейером, по крайней мере, pv не знает, насколько велик входной файл, поэтому он не сможет сказать вам, как далеко вы продвинулись, поэтому нет недостатка в том, чтобы сделать это следующим образом - и вы получите хорошее преимущество в скорости:
Я хотел бы избежать pv на что-нибудь большое, и (если использовать Bash):
Контрол-д процесс
bgпоставить его в фоновом режиме. Обратите внимание, что bgэто даст вам вывод, например, [1] 6011где последний номер является идентификатором процесса. Ну действуй:
while true; do kill -USR1 process_id ; sleep 5; done
где process_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, который я хочу контролировать, вот одна строка, которая позаботится обо всей энчиладе для вас; поместите все это в одну строку:
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, когда он еще не готов. Приспособьте свои сны по желанию (возможно, даже удалите второй сон вообще).
Баш- FTW! :-)
whileпетлю. Используйте watch.
sudo watch pkill dd. Тогда смотрите ddвывод статистики удобно.
watch pkill -USR1 -x dd. Так как я также использую watchдля других подобных задач, это естественно.
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будет более точной. Однако это может быть немного медленнее.
conv=fsyncлучше использовать
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
Используйте опцию, status=progressчтобы получить прогресс во время перевода.
Кроме того, conv=fsyncбудут отображаться ошибки ввода-вывода.
Пример:
sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync
Мне очень нравится ddrescue, он работает как dd, но выдает результат и не дает ошибок при ошибках, напротив, у него очень продвинутый алгоритм, и он очень старается сделать успешную копию ... Для этого также есть много GUI
Проект: https://www.gnu.org/software/ddrescue
Википедия: https://en.wikipedia.org/wiki/Ddrescue
Я создал оболочку bash, ddкоторая будет использоваться 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[@]}"
}
#!/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.
Поэтому сегодня я немного расстроился попыткой запустить killцикл во время ddработы и пришел к такому методу, который позволяет легко запускать их параллельно:
function vdd {
sudo dd "$@" &
sudo sh -c "while pkill -10 ^dd$; do sleep 5; done"
}
Теперь используйте только vddто, что вы обычно используете dd(он передает все аргументы напрямую), и вы будете получать отчет о ходе работы каждые 5 секунд.
Единственным недостатком является то, что команда не возвращается сразу после завершения dd; поэтому возможно, что эта команда заставит вас ждать еще 5 секунд после того, как dd вернется, прежде чем он заметит и выйдет.
Это заставляет dd предоставлять статистику каждые 2 секунды, что по умолчанию для часов:
watch killall -USR1 dd
Чтобы изменить каждые 2 секунды на каждые 5 секунд, добавьте параметр -n 5 следующим образом:
watch -n 5 killall -USR1 dd
На всякий случай, если кто-нибудь из CentOS Land найдет эту тему ...
Опция status = progress работает с CentOS 7.5 и 7.6
Ответ выше @davidDavidson подразумевает, что эта функция была недавно добавлена в Coreutils 8.24.
Версия 8.24 GNU coreutils включает в себя патч для dd, который вводит параметр для печати прогресса.
Это может иметь место, но CentOS может не следовать той же схеме управления версиями.
Версия Coreutils, которая поставляется с CentOS 7.6.1810:
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 .
Тем не менее, я проверил «status = progress» с dd на CentOS 7.5 и CentOS 7.6 (оба с версией 8.22 Coreutils), и он работает правильно.
Я не знаю, почему RedHat выбирает такую старую версию Coreutils, но функциональность существует с 8.22.
Как упоминалось выше, по крайней мере, с помощью 'dd' из GNU coreutils или busybox, он будет реагировать на сигнал USR1, печатая информацию о ходе выполнения в stderr.
Я написал небольшой скрипт-обертку для dd, который показывает хороший показатель завершения процента и пытается никак не повлиять на процесс или способ работы dd. Вы можете найти его на github:
http://github.com/delt01/dd_printpercent
К сожалению, этот прием SIGUSR1 работает только с GNU dd (из пакета coreutils) или с занятым режимом 'dd', когда эта особенность включена во время компиляции. Он не работает со стандартным dd, включенным в большинство систем BSD, включая FreeBSD и OS X ... :(
Вы можете наблюдать за ходом использования любой программы 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 команды.
Если вы запускаете dd с помощью sudo, вам тоже нужно продвигаться:
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