Як ви стежите за прогресом dd?


654

ddдиво. Це дозволяє дублювати жорсткий диск на інший, повністю нульовий жорсткий диск і т. Д. Але, як тільки ви запускаєте ddкоманду, нічого не скаже вам про її прогрес. Він просто сидить там за курсором, поки команда остаточно не закінчиться. Отже, як слідкує за ходом роботи ДД?

Відповіді:


728

Оновлення 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

76
pv bigfile.iso | dd of = / dev / yourdevice
Іон Бр.

18
Зверніть увагу , що параметри «дд» підходять в першій половині (вхідна частина труби): dd if=/dev/zero bs=1M count=35000 | pv | dd of=VirtualDisk.raw.
Sopalajo de Arrierez

6
pv bigfile.iso | dd of=VirtualDisk.raw bs=1M count=35000твори, перевірені. @SopalajodeArrierez, параметри можна задати у другому дд.
SiddharthaRT

11
використання, pv < /dev/sda > /dev/sdbздається, набирає кращої швидкості ( джерело )
Nicola Feltrin

14
FYI на швидкість. Тести на моєму комп’ютері з SSD- дисплеєм Samsung 840 PRO: 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.
Тедд Хансен

461

Від HowTo: відстежуйте хід dd

Ви можете стежити за ходом 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 працює щось інше. Нарешті, для надсилання сигналу USR1 вам не потрібно судо. В іншому випадку хороша відповідь, +1.
gsingh2011

22
NB! Таким чином інтерфейси dd працюють під OSX.
Максим Холявкін

26
@Speakus Ви повинні використовувати kill -INFO $(pgrep ^dd$)в системах BSD (наприклад, OSX).
Торбен

20
sudo pkill -usr1 ddпростіше запам’ятати, працює чудово (принаймні на Ubuntu 14.04) і менше друкується.
Фізи

21
Мені це подобається, бо, боюся pv, сповільнить передачу, як показав Тедд Хансен. Крім того, я ставлю на обмін, що багато людей це гуглить, тому що вони вже розпочали ddоперацію;)
sudo

104

Кілька зручних прикладних застосувань із 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прикладу. СЕРІЯ ЗАРАЗ !
alex grey

Чи можете ви викликати цей діалог лише з 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)

5
Не працює для мене на Kubuntu Trusty. Можливо, суперечливі ключові прив’язки?
jamadagni

14
Чудовий шлях. Він працює під OSX, але не працює під ubuntu 14.04
Максим Холявкін

1
Перший рядок генерується ОС 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 включає в себе патч для дд введення параметра для друку прогресу.

Комісія, яка вводить цю зміну, має коментар:

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

Багато дистрибутивів, включаючи Ubuntu 16.04.2 LTS, використовують цю версію.


просто хочу додати, як я склав 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буде під srcdir. Ви можете скопіювати його в / bin та замінити існуючий або jus запускати як src / dd
holms

2
Класно! Мені подобається ця особливість. І на те, що вчити ДД друкувати результати прогресу знадобилося лише близько 30 років. :-)
Йоганнес Оверманн

Яке полегшення! Я негайно додам цей аргумент у псевдонімі оболонки dd.
Стефан Геннінгсен

Зверніть увагу, що стан іноді друкується з двома номерами, одне в одиницях SI і еквівалентне значення у двійкових одиницях (наприклад, 10 МБ, 9,5 МіБ).
palswim

33

Найкраще використовувати http://dcfldd.sourceforge.net/ це легко встановити через apt-get


3
дякую за вказівник на dcfldd, дуже сумісний з dd, але деякі хороші нові функції. Особливо мені подобається стандартний прогрес.
Флойд

4
Чому dcfldd не є більш відомим - для мене повна загадка.
Freedom_Ben

28
ймовірно, за своєю назвою.
Джованні Торальдо

У ньому є параметри ddта status=onза замовчуванням параметри для повідомлень про прогрес, statusinterval=N(N у блоках), для частоти оновлення повідомлень та sizeprobe=[if|of]відсоткового показника. Я його псевдоніму DD
отримаю

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як корінь:

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

18

Якщо ви вже запустили dd, і якщо ви пишете такий файл, як, наприклад, під час створення копії маятника на диск, ви можете використовувати команду watch, щоб постійно спостерігати розмір вихідного файлу, щоб побачити зміни та оцінити завершення.

watch ls -l /pathtofile/filename

Щоб побачити лише розмір файлу (h-людський вигляд):

watch ls -sh /pathtofile/filename

Також життєздатний метод ...
ζ--

3
Корисно, хоча це не обов'язково спрацьовує, якщо ви підключаєте висновок dd до чогось іншого, ніж файл (наприклад, gzip'ing перед тим, як записати його на диск).
Ponkadoodle

Не працює на спеціальних файлах.
Йоханнес Оверманн

13

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


1
Стисніть whileпетлю. Використовуйте watch.
муру

1
@muru це залежить. Я не знаю про вашу систему, але на CentOS7 * вихід трохи зіпсований; це читабельно, але не виглядає впорядковано. Крім того, він перекидається на ваш попередній вихід, так що ви втрачаєте історію швидкості вашого дд; міна коливається в межах від 20 Мб / с до 300 Мб / с. Цікаво спостерігати, як номери змінюються і повчально. Я думаю, що велика дисперсія пов'язана з тим, що тонкі пули LVM збільшують виділення для НН, про які я пишу. * так, це форум ubuntu, але я прийшов сюди шукати "хід моніторингу прогресу". Це перший результат в Google.
Майк S

О, я мав на увазі в іншому терміналі чи вікні екрана, біжи sudo watch pkill dd. Потім дивіться, як ddвивести статистику зручно.
муру

Не зможе pkill надіслати SIGTERM за замовчуванням? Я навіть не хочу експериментувати, оскільки pgrep dd придумує 3 pid-адреси під час роботи одного dd: kthreadd, oddjob та dd. Я боюся того, що буде робити pkill. Ви можете надіслати сигнал -USR1 за допомогою pkill, але знову ж таки, я не знаю, чи безпечно це надіслати до потоку ядра чи до obbjob. Команда watch виглядає більш чистою, але, схоже, багато додаткових кроків, щоб уникнути певного циклу. Як правило, якщо я роблю DD в одному вікні, я зроблю щось одразу після цього в тій же оболонці. Цикл while безпечний: ви точно знаєте, який під отримує сигнал.
Майк S

в основному мені байдуже, які прищі отримують сигнал, оскільки я їх використовую watch pkill -USR1 -x dd. Оскільки я також використовую watchдля інших подібних завдань, це приходить природно.
муру

11

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краще
Chen Deng-Ta

Дякую за це! Я роблю dd на віддаленому lvm2 і bs = 4M збільшив мій переказ на 20, і показник прогресу чудовий.
Lonnie Best

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

4

Мені дуже подобається ddrescue, він працює як dd, але дає вихід і не дає збоїв на помилках, навпаки, він має дуже просунутий алгоритм, який дуже важко намагається зробити успішну копію ... Є також багато графічних інтерфейсів для цього

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

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

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


3

Я створив баш-обгортку, 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[@]}"
}

Хороший спосіб, але він не працює з такими командами, як 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.
midenok

2

Тому сьогодні я трохи засмутився спробою запустити killцикл під час ddзапуску, і придумав цей метод для їх запуску паралельно, легко:

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

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

Єдиним недоліком є ​​те, що команда не повертається одразу після завершення dd; тому можливо, що ця команда може змусити вас чекати додаткових 5 секунд після повернення dd до того, як вона помітить і вийде.


2

Це змушує dd надавати статистику кожні 2 секунди, яка за замовчуванням спостерігається:

watch killall -USR1 dd

Щоб змінити кожні 2 секунди на кожні 5 секунд, додайте варіант -n 5 на зразок цього:

watch -n 5 killall -USR1 dd

2

Про всяк випадок, коли хтось із землі 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.


1

Як було сказано вище, принаймні з 'dd' від GNU coreutils або busbox, він буде реагувати на сигнал USR1, друкуючи інформацію про хід на stderr.

Я написав невеликий сценарій обгортки для dd, який показує хороший відсотковий показник, і намагається жодним чином не втручатися у процес чи спосіб функціонування ДД. Ви можете знайти його на github:

http://github.com/delt01/dd_printpercent

На жаль, ця хитрість SIGUSR1 працює лише з GNU dd (з пакету coreutils) або режимом 'dd' зайнятої скриньки, яка має певну особливість, включену під час компіляції. Він не працює з запасом 'dd', що входить до більшості систем BSD, включаючи FreeBSD та OS X ... :(


Посилання мертва.
ishmael

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 $!

Тут &розгортається перша команда і продовжується негайно, замість того, щоб чекати, поки команда закінчиться.

Команда ходу запускається за допомогою: -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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.