Чи існує метод отримання відсотка від DD в Linux?


41

Тож ось що відбувається.

Я створив резервну копію накопичувача на своєму сервері через живий USB через Linux. Я почав копіювати перший диск із ddкомандою vanilla; просто sudo dd if=/dev/sda of=/dev/sdc1тоді я згадав, що це просто залишає консоль порожньою, поки вона не закінчиться.

Мені потрібно було запустити іншу резервну копію на той же диск, тому я і почав цю програму, а sudo dd if=/dev/sdb of=/dev/sdc3 status=progressпотім отримав рядок тексту, який показує поточну швидкість передачі, а також хід у байтах.

Я сподівався на метод, який показує відсоток резервного копіювання, замість того, щоб робити математику, скільки байтів резервного копіювання з 1,8 ТБ. Чи є простіший спосіб зробити це, ніж статус = прогрес?

Відповіді:


68

Дивіться відповіді на це запитання [ 1 ]

pv

Наприклад, ви можете використовувати його pv перед початком

sudo apt-get install pv    # if you do not have it
pv < /dev/sda > /dev/sc3   # it is reported to be faster
pv /dev/sda > /dev/sc3     # it seems to have the same speed of the previous one
#or 
sudo dd if=/dev/sda | pv -s 1844G | dd of=/dev/sdc3  # Maybe slower 

Вихід [ 2 ] :

440MB 0:00:38 [11.6MB/s] [======>                             ] 21% ETA 0:02:19

Примітки:
Особливо для великих файлів ви можете побачити man ddта встановити параметри, необхідні для прискорення роботи всіх апаратних засобів, наприклад, bs=100Mвстановлення буфера, oflag=syncпідрахунку ефективних байтів, написаних, можливо direct...
Опція -sприймає лише цілі параметри 1.8T-->1844G.
Як ви можете помітити з перших рядків, вам це зовсім не потрібно dd.


kill -USR1 pid

Якщо ви вже запустили в ddкоманду після того , як ви індівідуіровано його PID ( Ctrl- Z+ bgі ви читаєте це, або pgrep ^dd...) , ви можете надіслати сигнал USR1(або SIGUSR1, або SIGINFOдивись нижче) і читати висновок.
Якщо PID програми 1234 с

kill -USR1 1234

dd відповість на терміналі свого STDERR чимось схожим на

4+1 records in
4+0 records out
41943040 bytes (42 MB) copied, 2.90588 s, 14.4 MB/s

Попередження: У OpenBSD вам, можливо, доведеться заздалегідь перевірити поведінку kill[ 3 ] : замість цього
kill -SIGINFO 1234.
Він існує сигакцією з назвою SIGINFO. Той SIGUSR1, у цьому випадку, повинен припинити програму ( dd) ...
У режимі Ubuntu -SIGUSR1(( 10)).


9
Ви майже напевно виявите, що використання "bs" в команді dd значно прискорює її. Як і дд, якщо = / dev / blah з = / tmp / blah bs = 100M для передачі блоків 100M одночасно
Sirex

1
@Sirex Звичайно, ви повинні встановити bs, щоб оптимізувати швидкість передачі даних щодо вашого обладнання ... У відповіді просто повторюється командний рядок ОП. :-)
Гастур

3
@Criggie: це, можливо, тому, ddщо вже закінчили всі write()системні виклики, fsyncабо closeзаблокували очікування, коли запис досягне диску. З повільною USB-палицею, пороги буфера вводу-виводу Linux за замовчуванням щодо великої кількості брудних буферів запису можуть призвести до якісно іншої поведінки, ніж у великих файлів на швидких дисках, оскільки буфери такі великі, як і те, що ви копіюєте, і це все ще займає помітний час.
Пітер Кордес

5
Чудова відповідь. Однак я хочу зазначити, що у OpenBSD правильним сигналом вбивства є SIGINFO, а не SIGUSR1. Використання -USR1 у OpenBSD просто вб'є дд. Тому перш ніж спробувати це в новому середовищі, при передачі, яку ви не хочете переривати, ви можете ознайомитись із тим, як діє середовище (на більш безпечному тесті).
TOOGAM

1
поради щодо сигналів - ddце справді чудова інформація, особливо для серверів, на яких ви не можете / не хочете встановлюватиpv
Майк

38

Мій інструмент переходу до таких матеріалів progress:

Цей інструмент може бути описаний як малолітка , Брудний, Linux-і-OSX-тільки команди C , який виглядає для Coreutils основних команд (пор, мв, дд, TAR, GZIP / Gunzip, кішки і т.д.) в даний час працює в вашій системі і відображає відсоток скопійованих даних. Він також може відображати орієнтовний час та пропускну здатність , а також забезпечує "верхній" режим (моніторинг).

Скріншот "<code> progress </code> in action"

Він просто сканує /procцікаві команди, а потім переглядає каталоги fdта fdinfoзнаходить відкриті файли та шукає позиції та звітує про стан найбільшого файлу.

Він дуже легкий і сумісний практично з будь-якою командою.

Я вважаю це особливо корисним, оскільки:

  • в порівнянні з pvв трубі або dcfldd, я не повинен пам'ятати, щоб запустити іншу команду, коли я починаю операцію, я можу контролювати речі після факту;
  • порівняно з kill -USR1, він працює практично в будь-якій команді, мені не потрібно завжди двічі перевіряти сторінку, щоб переконатися, що я випадково не вбив копію; також приємно, що при виклику без параметрів він показує прогрес для будь-якої загальної команди "передачі даних", що працює зараз, тому мені навіть не потрібно шукати PID;
  • порівняно з pv -d, знову мені не потрібно шукати PID.

1
Примітка. Ви можете контролювати більше, ніж просто основні процеси. Просто вкажіть ім'я команди за допомогою --command <command-name>.
jpaugh

1
Це круто!
Флоріс

25

Виконати dd, а потім в окремій оболонці викликати таку команду:

pv -d $(pidof dd) # root may be required

Це дозволить pv отримати статистику щодо всіх відкритих дескрипторів файлів ddпроцесу. Він покаже вам, де сидять буфер для читання та запису.


2
Працює після факту !? Дивовижний!!
jpaugh

3
Це дуже круто. Це дозволяє уникнути пропускної здатності пам’яті + перемикання контексту на фактичному переході всіх даних через 3 процеси! @jpaugh: Я думаю, він просто розглядає /proc/$PID/fdinfoпозиції файлів і /proc/$PID/fdбачить, які файли (і, отже, розміри). Так, так, дуже класна і хороша ідея для функції, але я б не називав це "дивовижною", оскільки є Linux API, які дозволяють опитувати позиції файлів іншого процесу.
Пітер Кордес

@PeterCordes Я не знав, що ядро ​​виявило позицію файлу. (Я витрачав своє життя ретельно, готуючи pvтрубопроводи заздалегідь.) Звичайно, я припустив, що раз побачив, що це працює.
jpaugh

9

Там є альтернатива dd: dcfldd.

dcfldd - це вдосконалена версія GNU dd з функціями, корисними для криміналістики та безпеки.

Виведення статусу - dcfldd може оновлювати користувача про його прогрес щодо кількості переданих даних та скільки часу триватиме операція.

dcfldd if=/dev/zero of=out bs=2G count=1 # test file
dcfldd if=out of=out2 sizeprobe=if
[80% of 2047Mb] 52736 blocks (1648Mb) written. 00:00:01 remaining.

http://dcfldd.sourceforge.net/
https://linux.die.net/man/1/dcfldd


Це довша назва команди ... явно, вона неповноцінна. (+1)
jpaugh

6

У відсотках вам доведеться зайнятись математикою, але ви можете отримати прогрес ДД в читаному для людини вигляді, навіть після того, як вже починаєте, займаючись kill -USR1 $(pidof dd)

Поточний процес dd відображатиметься аналогічно:

Скопійовано 11117279 байт (11 МБ, 11 МБ), 13,715 с, 811 кБ / с


4
Це в основному те саме, що status=progressдає
rakslice

1
Я насправді збирався сказати, що це саме те, що дає статус = прогрес.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.