Как вы контролируете прогресс дд?
dd это чудо Он позволяет дублировать жесткий диск на другой, полностью обнулять жесткий диск и т. Д. Но после запуска dd Команда, нет ничего, чтобы рассказать вам о ее прогрессе. Он просто сидит у курсора, пока команда не завершится. Так как же следить за прогрессом дд?
22 ответа
От HowTo: следить за прогрессом дд
Вы можете отслеживать прогресс дд, не останавливая его, используя 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 секунд) и сообщите, не останавливая его.
Обратите внимание на правильные одинарные кавычки в командах выше.
Обновление 2016: Если вы используете GNU coreutils >= 8.24 (по умолчанию в Ubuntu Xenial 16.04 и выше), см. Способ 2 ниже для альтернативного способа отображения прогресса.
Способ 1: с помощью 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 распознает размер автоматически.
Способ 2: новый 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
Несколько удобных примеров использования с 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/
Также для архивации себя.
Для полноты картины:
Версия 8.24 GNU coreutils включает в себя патч для dd, который вводит параметр для печати прогресса.
Коммит, представляющий это изменение, имеет комментарий:
дд: новый статус = уровень прогресса для периодической печати статистики
Многие дистрибутивы, в том числе Ubuntu 16.04.2 LTS, используют эту версию.
Используйте 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)
Лучше всего использовать 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, и если вы записываете файл, например, при создании копии pendrive на диск, вы можете использовать команду watch для постоянного наблюдения за размером выходного файла, чтобы увидеть изменения и оценить завершение.
watch ls -l /pathtofile/filename
Чтобы увидеть только размер файла (человеческое представление):
watch ls -sh /pathtofile/filename
dd | pv | dd Триада заставила мою копию 50 ГБ vm занять 800 секунд, в отличие от 260 секунд, использующих только dd. С этим конвейером, по крайней мере, 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!:-)
http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html
В принципе:
kill -USR1 < dd pid >
На 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
Самый простой это:
dd if=... of=... bs=4M status=progress oflag=dsync
oflag=dsync будет держать ваши записи в синхронизации, поэтому информация о status=progress точнее Однако это может быть немного медленнее.
Используйте опцию status=progress чтобы получить прогресс во время перевода.
К тому же, conv=fsync будет отображать ошибки ввода / вывода.
Пример:
sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync
Это заставляет dd предоставлять статистику каждые 2 секунды, что по умолчанию для часов:
watch killall -USR1 dd
Чтобы изменить каждые 2 секунды на каждые 5 секунд, добавьте параметр -n 5 следующим образом:
watch -n 5 killall -USR1 dd
Мне очень нравится ddrescue, он работает как dd, но выдает результат и не дает ошибок при ошибках, напротив, у него очень продвинутый алгоритм, и он очень старается сделать успешную копию... Для этого также есть много GUI
Проект: https://www.gnu.org/software/ddrescue/
Википедия: https://en.wikipedia.org/wiki/Ddrescue
На всякий случай, если кто-нибудь из 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.
Я создал оболочку для 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[@]}"
}
Вы можете наблюдать за прогрессом любой программы 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 $!
Вот & Разветвляется первая команда и продолжает немедленно, вместо того, чтобы ждать, пока команда не закончится.
Команда прогресса запускается с: -m так что он ждет, пока контролируемый процесс не закончится, -p так что он контролирует данный пид и $! последний командный 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
Поэтому сегодня я немного расстроился, пытаясь бежать kill в то время как в цикле dd был запущен, и придумал этот метод для запуска их параллельно, легко:
function vdd {
sudo dd "$@" &
sudo sh -c "while pkill -10 ^dd$; do sleep 5; done"
}
Теперь просто используйте vdd везде, где вы обычно используете dd (он передает все аргументы напрямую), и вы будете получать отчет о проделанной работе каждые 5 секунд.
Единственным недостатком является то, что команда не возвращается сразу после завершения dd; поэтому возможно, что эта команда заставит вас ждать еще 5 секунд после того, как dd вернется, прежде чем он заметит и выйдет.
Как упоминалось выше, по крайней мере, с помощью '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 ...:(
В моей системе Ubuntu 20.04 я использую dcfldd
❯ sudo dcfldd if=20210708.img status=on of=/dev/sdd bs=1M sizeprobe=if
[46% of 3814Mb] 1792 blocks (1792Mb) written. 00:00:28 remaining.
Здесь, в sizeprobe, у нас есть 3 параметра, if,of,BYTES, которые определяют размер ввода, вывода или количество BYTES для использования с сообщениями о состоянии.
статус по умолчанию включен, я просто использовал явно.
Чтобы добавить отличный ответ @JSBack, вот как вы можете получить диалоговое окно для очистки диска с помощью dd:
(dd if=/dev/zero | pv -s $(lsblk -b -o SIZE /dev/sdX | tail -n 1) -n | sudo dd of=/dev/sdX bs=1M) 2>&1 | dialog --gauge "Wiping disk /dev/sdX, Please wait..." 10 70 0
