dd
это чудо. Он позволяет вам дублировать жесткий диск на другой, полностью обнулять жесткий диск и т. Д. Но как только вы запустите команду dd
, вам нечего будет сказать о ее ходе. Он просто сидит у курсора, пока команда не завершится. Так как же следить за прогрессом дд?
с HowTo: Отследить прогресс dd
Вы можете, не останавливая его, с помощью команды kill
.
Чтобы увидеть прогресс dddd
после его запуска, откройте другой терминал и войдите:
sudo kill -USR1 $(pgrep ^dd)
В окне терминала dd
будет отображен ход выполнения dd
без остановки процесса. Если вы используете BSD или OS X, используйте INFO
вместо USR1
. Сигнал USR1
завершит процесс dd.
Если вы хотите получать регулярные обновления прогресса dd
, то введите:
watch -n5 'sudo kill -USR1 $(pgrep ^dd)'
watch
прощупывает процесс dd
каждые -n секунд (-n5
= 5 секунд) и сообщите об этом, не останавливая его.
Обратите внимание на правильные одиночные кавычки в командах выше.
Итак, сегодня я немного разочаровался при попытке запустить kill
в цикле, пока dd
работал, и придумал этот метод для их параллельного запуска, легко:
function vdd {
sudo dd "$@" &
sudo sh -c "while pkill -10 ^dd$; do sleep 5; done"
}
Теперь просто используйте vdd
где угодно обычно используйте dd
(он передает все аргументы напрямую), и вы будете получать отчет о ходе выполнения каждые 5 секунд.
Единственным недостатком является то, что команда не возвращается сразу после завершения dd; поэтому возможно, что эта команда заставит вас ждать еще 5 секунд после возврата dd, прежде чем он заметит и завершит работу.
Вы можете наблюдать за прогрессом любой программы 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 unlzip2 bunzip2 xz unxz lzma unlzma unlzcatma 7z lsg [2] [2] 12174] Вы можете использовать его в отдельном окне терминала во время выполнения команды или запустить с помощью команды 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
На случай, если кто-нибудь из 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 .
Тем не менее, я протестировал 'status = progress' с dd как на CentOS 7.5, так и на CentOS 7.6 (обе с Coreutils версии 8.22), и он работает правильно.
Я не знаю, почему RedHat решает использовать такие старая версия Coreutils, но функциональность существует в версии 8.22.
Это заставляет dd предоставлять статистику каждые 2 секунды, что по умолчанию для часов:
watch killall -USR1 dd
Чтобы изменить каждые 2 секунды на каждые 5 секунд, добавьте параметр -n 5, например:
watch -n 5 killall -USR1 dd
Обновление 2016: Если вы используете GNU coreutils >= 8.24 (по умолчанию в Ubuntu Xenial 16.04 вверх), см. метод 2 ниже для альтернативного способа отображения прогресса.
pv
Установите pv
и поместите его между командами только ввода/вывода dd
.
Примечание: его нельзя использовать, если вы уже запустили dd
.
С описание пакета :
pv
- Pipe Viewer - это клемма-основанный на инструменте мониторинга ход обработки данных по трубопроводу. Его можно вставить в любой обычный трубопровод между двумя процессами для визуального отображения как быстро проходят данные, сколько времени это заняло, как близко... чтобы закончить его, и оценить, как долго это будет продолжаться до тех пор. Завершение.
Installation
sudo apt-get install pv
Example
dd if=/dev/urandom | pv | dd of=/dev/null
Output
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' от GNU coreutils или busybox он будет реагировать на сигнал USR1, выводя информацию о ходе выполнения в stderr.
Я написал небольшую оболочку скрипт для dd, который показывает хороший индикатор процента выполнения и каким-либо образом пытается не вмешиваться в процесс или способ функционирования dd. Вы можете найти его на github:
http://github.com/delt01/dd_printpercent
К сожалению, этот трюк с SIGUSR1 работает только с GNU dd (из пакета coreutils) или режимом busybox dd с этим конкретным функция включена во время компиляции. Он не работает со стандартным dd, входящим в состав большинства систем BSD, включая FreeBSD и OS X ...: (
Я создал оболочку 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[@]}"
}
Используйте опцию 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
Ubuntu 16.04 поставляется с dd (coreutils) Версия 8.25 . Поэтому опция status=progress
is Supported :-)
Чтобы использовать ее, просто добавьте 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
dd if=... of=... bs=4M status=progress oflag=dsync
oflag = dsync
будет синхронизировать ваши записи, поэтому информация status = progress
будет более точной. Однако это может быть немного медленнее.
http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy. html
В основном:
kill -USR1 < dd pid >
Триада dd | pv | dd
заставила мою копию 50ГБ vm занять 800 секунд, по сравнению с 260 секундами, используя только dd. С этим конвейером, по крайней мере, pv понятия не имеет, насколько большой входной файл, так что он не сможет сказать вам, как далеко вы находитесь, так что нет никаких недостатков, чтобы сделать это следующим образом - и вы получаете хорошее преимущество в скорости:
Я бы избежать pv на что-нибудь большое, и (при использовании Bash):
Control-Z процесс dd
bg
, чтобы положить его в фоновом режиме. Обратите внимание, что bg
выдаст такой вывод как [1] 6011
, где последним номером является id процесса. Итак, do:
while true; do kill -USR1 process_id ; sleep 5; done
where process_id - 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! :-)
В 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
Déi bescht benotzt http://dcfldd.sourceforge.net/ et ass einfach duerch apt-get
Ради полноты:
Версия 8.24 GNU coreutils включает патч для dd, вводящий параметр для печати прогресса.
Коммит , вводящий это изменение, имеет комментарий:
dd: новый уровень status=progress для печати статистики периодически
Многие дистрибутивы, в том числе Ubuntu 16. 04.2 LTS используйте эту версию.
Используйте 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)
Несколько удобных примеров использование с 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 /
Также для архивации самого себя.
Если вы уже запустили dd и записываете файл, например, при создании копии флеш-накопителя на диск, вы можете использовать команду watch для постоянного наблюдения за размером вывода файл, чтобы увидеть изменения и оценить завершение.
watch ls -l /pathtofile/filename
Чтобы увидеть только размер файла (вид h-human):
watch ls -sh /pathtofile/filename