Как вы контролируете прогресс дд?

654

ddэто чудо Он позволяет дублировать жесткий диск на другой, полностью обнулять жесткий диск и т. Д. Но как только вы запустите ddкоманду, вам нечего будет сказать о ее ходе. Он просто сидит у курсора, пока команда не завершится. Так как же следить за прогрессом дд?

Джеймс
источник

Ответы:

729

Обновление 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
Phoibos
источник
76
pv bigfile.iso | дд = / dev / yourdevice
Ион Бр.
18
Обратите внимание , что параметры «дд» подходят в первой половине (входная часть трубы): dd if=/dev/zero bs=1M count=35000 | pv | dd of=VirtualDisk.raw.
Сопалахо де Арриерес
6
pv bigfile.iso | dd of=VirtualDisk.raw bs=1M count=35000работает, проверено. @SopalajodeArrierez, параметры могут быть заданы во втором дд.
SiddharthaRT
11
используя , pv < /dev/sda > /dev/sdbкажется , чтобы получить более высокую скорость ( источник )
Nicola FELTRIN
14
К вашему сведению на скорости. Тесты на моем компьютере с твердотельным накопителем Samsung 840 PRO: 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.
Тедд Хансен
461

От 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 секунд) и сообщать, не останавливая его.

Обратите внимание на правильные одинарные кавычки в командах выше.

Джеймс
источник
19
Это сработало, но пара комментариев. Прежде всего, я не уверен, почему вы избежали своих кавычек (если это для редактора SO, вы сделали это неправильно). Во-вторых, я бы порекомендовал использовать ^ dd $, на случай, если что-то еще работает с префиксом dd. Наконец, вам не нужно sudo для отправки сигнала USR1. В противном случае хороший ответ +1.
gsingh2011
22
NB! Таким образом, interupts dd работает под OSX.
Максим Холявкин
26
@Speakus Вы должны использовать kill -INFO $(pgrep ^dd$)в системах BSD (например, OSX).
Торбен
20
sudo pkill -usr1 ddлегче запомнить, отлично работает (по крайней мере, в Ubuntu 14.04) и меньше печатать.
Фазы
21
Мне это нравится, потому что я боюсь, что pvэто замедлит передачу, как показал Тедд Хансен. Кроме того, я держу пари, что многие люди гуглят это, потому что они уже начали ddоперацию;)
sudo
103

Несколько удобных примеров использования с 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
ЛЮБОВЬ к dialogпримеру. SERENITY СЕЙЧАС !
Алекс
Вы можете только вызвать этот диалог с Python?
mikeymop
1
благодаря этому ответу обнаружил, что dialogэто безумно поможет в написании сценариев оболочки: D
holms
2
brew install pv dialogдля Mac. Также этот джентльмен вычисляет стиль. Браво.
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)
01010101
источник
5
У меня не работает на Kubuntu Trusty. Возможно противоречивые привязки клавиш?
Джамадагни
14
Замечательный способ. Он работает под OSX, но не работает под ubuntu 14.04
Максим Холявкин
1
Первая строка генерируется OS X, только последние 3 строки из dd.
Итай Грудев
3
Вы должны быть в состоянии использовать kill -INFO на BSD, как OS X
macshome
3
Это не работает в Ubuntu. Ctrl-T / Ctrl-Shift-T выводит только ^Tна терминал (за исключением того, что многие терминальные приложения пересекают Ctrl-Shift-T и открывают новую вкладку). Многие поисковики по OSX / BSD могут оценить этот ответ, но следует уточнить, что это не для Ubuntu (или GNU / LInux в целом?)
mwfearnley
60

Для полноты картины:

Версия 8,24 из Coreutils GNU включает в себя патч для дд введения параметра для печати прогресса.

Коммит, представляющий это изменение, имеет комментарий:

дд: новый статус = уровень прогресса для периодической печати статистики

Многие дистрибутивы, в том числе Ubuntu 16.04.2 LTS, используют эту версию.

davidDavidson
источник
просто хочу добавить, как я скомпилировал 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. Вновь скомпилированный ddбудет в srcдиректории. Вы можете скопировать его в / bin и заменить существующий или запустить его как src / dd
holms
2
Здорово! Мне нравится эта функция. И потребовалось всего около 30 лет, чтобы научить дд печатать результаты. :-)
Йоханнес Оверманн
Какое облегчение! Я немедленно добавлю этот аргумент в псевдоним оболочки dd.
Стефан Хеннингсен
Обратите внимание, что иногда состояние будет печататься с двумя числами, одно в единицах СИ и эквивалентное значение в двоичных единицах (например, 10 МБ, 9,5 МБ).
Palswim
33

Лучше всего использовать http://dcfldd.sourceforge.net/, его легко установить через apt-get

TheNano
источник
3
спасибо за указатель на dcfldd, очень совместимый с dd, но с некоторыми хорошими новыми функциями. Мне особенно нравится стандартный прогресс.
Флойд
4
Почему dcfldd не очень известен, для меня полная загадка.
Freedom_Ben
28
вероятно, для его имени.
Джованни Торальдо
Он имеет опции ddи опцию status=onпо умолчанию для сообщений о ходе выполнения statusinterval=N(N в блоках) для частоты обновления сообщений и sizeprobe=[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с правами 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
user3394963
источник
18

Если вы уже запустили dd и записываете файл, например, при создании копии pendrive на диск, вы можете использовать команду watch для постоянного наблюдения за размером выходного файла, чтобы увидеть изменения и оценить завершение.

watch ls -l /pathtofile/filename

Чтобы увидеть только размер файла (человеческое представление):

watch ls -sh /pathtofile/filename
fabricator4
источник
Также жизнеспособный метод ...
ζ--
3
Полезно, хотя это не обязательно работает, если вы передаете вывод dd во что-то, кроме файла (например, gzip'ing перед записью на диск).
Ponkadoodle
Не работает на специальных файлах.
Йоханнес Оверманн
13

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! :-)

Майк С
источник
1
Сожмите whileпетлю. Используйте watch.
Муру
1
@ Муру, это зависит. Я не знаю о вашей системе, но на CentOS7 * вывод немного искажен; это читабельно, но не выглядит упорядоченно. Кроме того, он выходит за пределы предыдущего вывода, поэтому вы теряете историю скорости вашего дд; мой варьируется от 20 МБ / с до 300 МБ / с. Интересно наблюдать, как цифры меняются и поучительны. Я думаю, что некоторая большая разница связана с тем, что тонкие пулы LVM увеличивают выделение для LV, к которому я пишу. * да, это форум по Ubuntu, но я пришел сюда в поисках "dd monitor progress". Это первый результат в Google.
Майк С
О, я имел в виду в другом терминале или окне экрана запустить sudo watch pkill dd. Тогда смотрите ddвывод статистики удобно.
Муру
Не отправит ли pkill SIGTERM по умолчанию? Я даже не хочу экспериментировать, так как pgrep dd предлагает 3 pid при запуске одного dd: kthreadd, oddjob и dd. Я боюсь того, что сделает pkill. Вы можете послать сигнал -USR1 с помощью pkill, но опять же я не знаю, безопасно ли это отправлять в поток ядра или в obbjob. Команда watch выглядит чище, но кажется, что это лишние шаги, чтобы избежать цикла while. Как правило, если я делаю дд в одном окне, я собираюсь сделать что-то сразу же в той же оболочке. Цикл while безопасен: вы точно знаете, какой pid получает сигнал.
Майк С,
в основном мне все равно, какие пиди получают сигнал, так как я использую watch pkill -USR1 -x dd. Так как я также использую watchдля других подобных задач, это естественно.
Муру
11

http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html

В основном:

kill -USR1 < dd pid >
hnasarat
источник
1
"pkill -USR1 dd" - это самая простая версия, которую я знаю (во всяком случае, если вы просто запускаете один экземпляр dd). В моей системе мне нужно 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лучше использовать
Чен Дэн-Та,
Спасибо за это! Я делаю дд на удаленный lvm2 и 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=fsyncбудут отображаться ошибки ввода-вывода.

Пример:

sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync
MUY Бельгия
источник
4

Мне очень нравится ddrescue, он работает как dd, но выдает результат и не дает ошибок при ошибках, напротив, у него очень продвинутый алгоритм, и он очень старается сделать успешную копию ... Для этого также есть много GUI

Проект: https://www.gnu.org/software/ddrescue

Википедия: https://en.wikipedia.org/wiki/Ddrescue

введите описание изображения здесь

SuperMau
источник
3

Я создал оболочку 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[@]}"
}
midenok
источник
Хороший способ, но он не работает с такими командами, как sudo или time.
Максим Холявкин
1
Поместите его в / / дд / USR / местные бин с этим: вверху #!/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.
Миденок
2

Поэтому сегодня я немного расстроился попыткой запустить killцикл во время ddработы и пришел к такому методу, который позволяет легко запускать их параллельно:

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

Теперь используйте только vddто, что вы обычно используете dd(он передает все аргументы напрямую), и вы будете получать отчет о ходе работы каждые 5 секунд.

Единственным недостатком является то, что команда не возвращается сразу после завершения dd; поэтому возможно, что эта команда заставит вас ждать еще 5 секунд после того, как dd вернется, прежде чем он заметит и выйдет.

robru
источник
2

Это заставляет dd предоставлять статистику каждые 2 секунды, что по умолчанию для часов:

watch killall -USR1 dd

Чтобы изменить каждые 2 секунды на каждые 5 секунд, добавьте параметр -n 5 следующим образом:

watch -n 5 killall -USR1 dd
Kostyantyn
источник
2

На всякий случай, если кто-нибудь из 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.

J Hauss
источник
1

Как упоминалось выше, по крайней мере, с помощью '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 ... :(

DELT
источник
Ссылка мертва.
Измаил
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 команды.

Если вы запускаете 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
labsin
источник