Ответы:
Обновление 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
скорость записи dd if=/dev/zero | pv | of=/dev/sdb
~ 18 МБ / с, скорость ~ 80 МБ / с, а у старой dd if=/dev/zero of=/dev/sdb
версии ~ 550 МБ / с (близко к максимальной скорости записи SSD). Все с bs=4096000
.
От 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 секунд) и сообщать, не останавливая его.
Обратите внимание на правильные одинарные кавычки в командах выше.
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
примеру. SERENITY СЕЙЧАС !
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 включает в себя патч для дд введения параметра для печати прогресса.
Коммит, представляющий это изменение, имеет комментарий:
дд: новый статус = уровень прогресса для периодической печати статистики
Многие дистрибутивы, в том числе 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
директории. Вы можете скопировать его в / bin и заменить существующий или запустить его как 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
с правами 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
Если вы уже запустили dd и записываете файл, например, при создании копии pendrive на диск, вы можете использовать команду watch для постоянного наблюдения за размером выходного файла, чтобы увидеть изменения и оценить завершение.
watch ls -l /pathtofile/filename
Чтобы увидеть только размер файла (человеческое представление):
watch ls -sh /pathtofile/filename
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! :-)
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, но выдает результат и не дает ошибок при ошибках, напротив, у него очень продвинутый алгоритм, и он очень старается сделать успешную копию ... Для этого также есть много GUI
Проект: https://www.gnu.org/software/ddrescue
Википедия: https://en.wikipedia.org/wiki/Ddrescue
Я создал оболочку 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[@]}"
}
#!/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 вернется, прежде чем он заметит и выйдет.
Это заставляет dd предоставлять статистику каждые 2 секунды, что по умолчанию для часов:
watch killall -USR1 dd
Чтобы изменить каждые 2 секунды на каждые 5 секунд, добавьте параметр -n 5 следующим образом:
watch -n 5 killall -USR1 dd
На всякий случай, если кто-нибудь из 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.
Как упоминалось выше, по крайней мере, с помощью '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 ... :(
Вы можете наблюдать за ходом использования любой программы 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