본문 바로가기

리눅스

dd 명령어

728x90

dd 명령어

dd 명령어는 리눅스나 유닉스 운영 체제에서 사용하는 명령어 중 하나로 다양한 용도로 사용됩니다. 일반적으로는 디스크나 파티션 이미지를 만들거나 복사할 때 사용합니다.

명령어의 기본 문법

dd if=<input 파일 경로> of=<output 파일 경로> bs=<block size> count=<number of blocks>

여기서 if는 입력 파일 경로, of는 출력 파일 경로, bs는 블록 크기, count는 블록 수를 의미합니다. 이 명령어를 실행하면 입력 파일에서 지정한 크기의 블록을 읽어 출력 파일로 씁니다. 이때 입력 파일에서 읽은 블록의 크기는 bs로 지정한 크기와 같거나 작아야 하며, 출력 파일에 쓰인 블록의 수는 count로 지정한 수와 같거나 작아야 합니다.

 

예를 들어, /dev/sda 디스크의 전체 이미지를 파일로 저장하려면 다음과 같이 입력합니다.

dd if=/dev/sda of=image.img bs=1M

이 명령어는 /dev/sda 디스크에서 1MB씩 블록을 읽어 image.img 파일에 쓰게 됩니다. count를 생략하면 디스크 전체를 읽어올 수 있습니다.

디스크 복사(하드 복사)

  • 원본 디스크 확인
lsblk
  • 디스크 복사
    • if는 입력 파일(원본 디스크), of는 출력 파일(대상 디스크)
      • /dev/sdX 원본 디스크
      • /dev/sdY 대상 디스크
      • bs 블록 크기
      • status=progress 진행 상황을 표시
sudo dd if=/dev/sdX of=/dev/sdY bs=4M status=progress
  • /dev/zero를 /stg/ddfile로 복사
sudo dd if=/dev/zero of=/stg/ddfile bs=10240000 count=1000 status=progress
  • Sync 명령 실행
    • 복사가 완료되면, 데이터가 디스크에 완전히 기록되도록 sync 명령을 실행합니다.
sudo sync
728x90

dd 명령어를 이용한 파일시스템 성능 측정

  • 디스크에 데이터 쓰기(쓰기 성능)
time dd if=/dev/zero of=tmpfileout bs=32k count=32000
  • if=/dev/zero: 입력 데이터는 /dev/zero에서 나오도록 지정하며, 이는 무한히 많은 null 바이트(0)를 생성합니다.
  • of=tmpfileout: 출력 파일을 tmpfileout으로 지정합니다.
  • bs=32k: 블록 크기를 32 킬로바이트로 설정합니다.
  • count=32000: 복사할 블록의 수를 나타냅니다. 이 경우 32000개의 블록을 복사합니다.
$ time dd if=/dev/zero of=tmpfileout bs=32k count=32000
32000+0 records in
32000+0 records out
1048576000 bytes (1.0 GB) copied, 2.01006 s, 522 MB/s

real      0m2.029s
user     0m0.007s
sys       0m1.432s
  • 실행 결과 분석
  1. Records (레코드):
    • 32000+0 records in: 입력 파일에서 읽은 레코드의 수입니다.
    • 32000+0 records out: 출력 파일로 쓴 레코드의 수입니다.
  2. 데이터 크기:
    • 1048576000 bytes (1.0 GB) copied: 전체 데이터 크기 및 크기에 대한 다양한 표현입니다.
  3. 전송 속도:
    • 522 MB/s: 데이터를 복사하는 속도입니다.
  4. 시간 정보:
    • real 0m2.029s: 실제 경과된 시간으로, 명령어가 완료되기까지 걸린 전체 시간입니다.
    • user 0m0.007s: 사용자 CPU 시간으로, 명령어 실행 도중 소비된 사용자 CPU 시간입니다.
    • sys 0m1.432s: 시스템 CPU 시간으로, 명령어 실행 도중 소비된 시스템 CPU 시간입니다.

이 결과를 종합하면 다음과 같은 해석이 가능합니다.

  • 전송 속도가 빠르게 나타나면서, 32K 블록 단위로 1.0GB의 데이터를 2.029초만에 복사했습니다.
  • real 시간과 sys 시간의 차이가 큽니다. sys 시간이 높게 나타나는 경우, 명령어 실행 중에 시스템 자원을 많이 사용한 것으로 해석할 수 있습니다.
  • 사용자 CPU 시간 (user)은 상대적으로 낮게 나타나면서, CPU 소비는 크게 기여하지 않았습니다. 명령어의 주요 부하는 I/O 작업에 있었다고 볼 수 있습니다.

 

  • 디스크에서 데이터 읽기(읽기 성능)
time dd if=tmpfileout of=/dev/zero bs=32k
  • if=tmpfileout: 입력 파일은 tmpfileout입니다.
  • of=/dev/zero: 출력 파일은 /dev/zero로 지정되어 있습니다. /dev/zero는 무한히 많은 null 바이트(0)를 생성하는 특수한 파일입니다.
  • bs=32k: 블록 크기를 32 킬로바이트로 설정합니다.
$ time dd if=tmpfileout of=/dev/zero bs=32k
32000+0 records in
32000+0 records out
1048576000 bytes (1.0 GB) copied, 3.2633 s, 321 MB/s

real      0m3.267s
user     0m0.034s
sys       0m0.931s
  • 실행 결과 분석
  1. Records (레코드):
    • 32000+0 records in: 입력 파일에서 읽은 레코드의 수입니다.
    • 32000+0 records out: 출력 파일로 쓴 레코드의 수입니다.
  2. 데이터 크기:
    • 1048576000 bytes (1.0 GB) copied: 전체 데이터 크기 및 크기에 대한 다양한 표현입니다.
  3. 전송 속도:
    • 321 MB/s: 데이터를 복사하는 속도입니다.
  4. 시간 정보:
    • real 0m3.267s: 실제 경과된 시간으로, 명령어가 완료되기까지 걸린 전체 시간입니다.
    • user 0m0.034s: 사용자 CPU 시간으로, 명령어 실행 도중 소비된 사용자 CPU 시간입니다.
    • sys 0m0.931s: 시스템 CPU 시간으로, 명령어 실행 도중 소비된 시스템 CPU 시간입니다.

이 결과를 종합하면 다음과 같은 해석이 가능합니다.

  • 전송 속도가 빠르게 나타나면서, 32K 블록 단위로 1.0GB의 데이터를 3.2633초만에 복사했습니다.
  • real 시간이 sys 시간과 비교해 크게 나타나고 있습니다. 이는 시스템 자원의 활용이 높다는 것을 나타낼 수 있습니다.
  • 사용자 CPU 시간 (user)과 시스템 CPU 시간 (sys)이 비교적 낮게 나타나면서, CPU 소비는 크게 기여하지 않았습니다. I/O 작업에 중점이 있었던 것으로 해석할 수 있습니다.

 

728x90