Відповіді:
Оновлення 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дає запис ~ 18 МБ / с, дає ~ 80 МБ / с dd if=/dev/zero | pv | of=/dev/sdb, а звичайний старий dd if=/dev/zero of=/dev/sdbдає ~ 550 МБ / с (близький до максимальної швидкості запису SSD). Усі з bs=4096000.
Ви можете стежити за ходом 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прикладу. СЕРІЯ ЗАРАЗ !
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 включає в себе патч для дд введення параметра для друку прогресу.
Комісія, яка вводить цю зміну, має коментар:
dd: новий статус = рівень прогресу для періодичного друку статистики
Багато дистрибутивів, включаючи 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буде під srcdir. Ви можете скопіювати його в / bin та замінити існуючий або jus запускати як 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як корінь:
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-людський вигляд):
watch ls -sh /pathtofile/filename
dd | pv | ddТріада зробила мій 50GB VM копія займе 800 секунд, на відміну від 260 секунд , використовуючи тільки дд. Принаймні, цей конвеєр не має уявлення, наскільки великий вхідний файл, тому він не зможе сказати вам, як далеко ви знаходитесь, так що немає недоліків зробити це так: і ви отримаєте хорошу перевагу швидкості:
Я б уникнув pv на чомусь великому, і (якщо використовувати Bash):
Контроль-Z у процесі управління
bgщоб поставити його на другий план. Зауважте, що bgви отримаєте вихід, як, наприклад, [1] 6011останній номер - це ідентифікатор процесу. То роби:
while true; do kill -USR1 process_id ; sleep 5; done
де process_id - ідентифікатор процесу, який ви спостерігали. Натисніть Control 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 - вашим вихідним файлом. Це залишається як вправа для читача. Зверніть увагу, що вам потрібно спати перед вбивством або може вмерти, намагаючись надіслати сигнал до ДД, коли він ще не готовий. Налаштуйте сон за бажанням (можливо, навіть взагалі приберіть другий сон).
Bash- 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, але дає вихід і не дає збоїв на помилках, навпаки, він має дуже просунутий алгоритм, який дуже важко намагається зробити успішну копію ... Є також багато графічних інтерфейсів для цього
Проект: https://www.gnu.org/software/ddrescue
Вікіпедія: https://en.wikipedia.org/wiki/Ddrescue
Я створив баш-обгортку, 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 до того, як вона помітить і вийде.
Про всяк випадок, коли хтось із землі CentOS знайде цю тему ...
Параметр '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 .
Однак я перевірив «статус = прогрес» у dd на CentOS 7.5 та CentOS 7.6 (обидві версії 8.22 Coreutils) і він функціонує належним чином.
Я не знаю, чому RedHat вирішує використовувати таку стару версію Coreutils, але функціонал існує з 8.22.
Як було сказано вище, принаймні з 'dd' від GNU coreutils або busbox, він буде реагувати на сигнал USR1, друкуючи інформацію про хід на stderr.
Я написав невеликий сценарій обгортки для 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 $!
Тут &розгортається перша команда і продовжується негайно, замість того, щоб чекати, поки команда закінчиться.
Команда ходу запускається за допомогою: -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