Відповіді:
Оновлення 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
буде під src
dir. Ви можете скопіювати його в / 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