리눅스에서 DD에 대한 비율을 얻는 방법이 있습니까?


41

여기에 무슨 일이 일어나고 있습니다.

Linux live USB를 통해 서버에서 드라이브 백업을 시작했습니다. 나는 dd바닐라 명령으로 첫 번째 드라이브를 복사하기 시작했습니다 . 그냥 sudo dd if=/dev/sda of=/dev/sdc1콘솔이 끝날 때까지 비워 둔다는 것을 기억했습니다.

어쨌든 같은 드라이브에 다른 백업을 실행해야했기 때문에이 드라이브도 함께 시작한 sudo dd if=/dev/sdb of=/dev/sdc3 status=progress다음 현재 전송 속도와 바이트 단위의 진행률을 보여주는 텍스트 줄을 얻었습니다.

1.8TB에서 백업되는 바이트 수를 계산하는 대신 백업 비율을 보여주는 방법을 원했습니다. status = progress보다 쉬운 방법이 있습니까?

답변:


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=100Moflag=syncdirect
-s1.8T-->1844G
dd


kill -USR1 pid

이 경우 이미 출시dd 당신이 PID를 individuated 한 후, 명령을 ( 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.
이름이 sigaction SIGINFO입니다. SIGUSR1하나,이 경우에해야 종료 프로그램을 ( dd...)
에서 우분투를 사용 -SIGUSR1( 10).


9
dd 명령에 'bs'를 사용하면 속도가 크게 빨라지는 것을 거의 확실하게 알 수 있습니다. 한 번에 100M 블록을 전송하기 위해 dd if = / dev / blah of = / tmp / blah bs = 100M
처럼

1
@Sirex 물론 하드웨어와 관련하여 전송 속도를 최적화하기 위해 bs를 설정해야합니다 ... 정답은 OP의 명령 줄을 반복합니다. :-)
Hastur

3
@Criggie : 아마도 dd모든 write()시스템 호출을 이미 완료 fsync했거나 close쓰기가 디스크에 도달하기를 기다리는 동안 차단되었을 수 있습니다. 느린 USB 스틱을 사용하면 더티 쓰기 버퍼가 얼마나 큰지에 대한 기본 Linux I / O 버퍼 임계 값은 빠른 디스크의 큰 파일보다 질적으로 다른 동작을 유발합니다. 여전히 눈에 띄는 시간이 걸립니다.
Peter Cordes

5
좋은 대답입니다. 그러나 OpenBSD에서 올바른 kill 신호는 SIGUSR1이 아니라 SIGINFO입니다. OpenBSD에서 -USR1을 사용하면 dd가 종료됩니다. 따라서 새로운 환경에서 시도하기 전에 중단하고 싶지 않은 전송에서 환경이 어떻게 작동하는지 (보다 안전한 테스트에서) 익히고 싶을 수 있습니다.
TOOGAM

1
에 대한 신호 조언 dd은 정말 훌륭한 정보입니다. 특히 설치할 수 없거나 설치하고 싶지 않은 서버의 경우pv
mike

38

이런 종류의 물건에 대한 나의 이동 도구는 progress다음과 같습니다.

이 도구는 시스템에서 현재 실행중인 coreutils 기본 명령 (cp, mv, dd, tar, gzip / gunzip, cat 등)을 찾는 Tiny , Dirty, Linux 및 OSX 전용 C 명령 으로 설명 할 수 있습니다 . 복사 된 데이터 의 백분율 을 표시합니다 . 또한 예상 시간처리량을 표시 할 수 있으며 "최상위"모드 (모니터링)를 제공합니다.

"<code> 진행 중 </ code> 작동"스크린 샷

그것은 단순히 검색 /proc디렉토리에 보이는 다음 흥미로운 명령에 대해, 그리고 fdfdinfo열 파일을 찾을 수 및 위치를 추구하는, 그리고 가장 큰 파일에 대한 보고서 상태.

매우 가볍고 거의 모든 명령과 호환됩니다.

다음과 같은 이유로 특히 유용합니다.

  • pv파이프 또는에 비해 dcfldd작업을 시작할 때 다른 명령을 실행해야한다는 사실을 기억하지 않아도 사실 후에 물건을 모니터링 할 수 있습니다.
  • 에 비해 kill -USR1실제로는 거의 모든 명령에서 작동하므로 실수로 복사본을 죽이지 않도록 맨 페이지를 항상 다시 확인하지 않아도됩니다. 또한 매개 변수없이 호출하면 현재 실행중인 일반적인 "데이터 전송"명령에 대한 진행률이 표시되므로 PID를 조회 할 필요조차 없습니다.
  • 에 비해 pv -d다시 PID를 찾을 필요가 없습니다.

1
참고 : coreutils 프로세스 이상을 모니터링 할 수 있습니다. 로 명령 이름을 지정하십시오 --command <command-name>.
jpaugh

1
이것입니다.
Floris

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가 있기 때문에 "놀라운"이라고 부르지 않습니다.
Peter Cordes

@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

백분율로 수학을 수행해야하지만 이미 시작한 후에도 인간이 읽을 수있는 형태로 dd의 진행 상황을 얻을 수 있습니다 kill -USR1 $(pidof dd)

현재 dd 프로세스는 다음과 유사하게 표시됩니다.

11117279 바이트 (11MB, 11MiB) 복사, 13.715 초, 811kB / 초


4
즉 기본적으로 같은 일이 status=progress있습니다
rakslice

1
사실 status = progress가 제공하는 것과 똑같은 말을하려고했습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.