본문 바로가기

리눅스

[draft] 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

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 작업에 있었다고 볼 수 있습니다.
728x90

디스크에서 데이터 읽기(읽기 성능)

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 작업에 중점이 있었던 것으로 해석할 수 있습니다.

디스크의 읽기/쓰기 성능을 측정하는 방법

쓰기 성능 측정

디스크 쓰기 성능을 측정하려면 임의의 파일을 디스크에 쓰고 그 속도를 확인할 수 있습니다.

dd if=/dev/zero of=/path/to/testfile bs=1G count=1 oflag=dsync

읽기 성능 측정

기존에 작성한 파일을 사용하여 디스크 읽기 성능을 측정할 수 있습니다.

dd if=/path/to/testfile of=/dev/null bs=1G count=1 iflag=dsync

입출력 성능을 종합적으로 측정

한 번에 여러 쓰기/읽기 테스트를 하고 측정할 수 있습니다.

dd if=/dev/zero of=/path/to/testfile bs=1M count=1024 conv=fdatasync
  • SAS
$ sudo dd if=/dev/zero of=/data1/testfile bs=1M count=1024 conv=fdatasync
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 8.94842 s, 120 MB/s
  • Solid State SATA
$ sudo dd if=/dev/zero of=/data2/testfile bs=1M count=1024 conv=fdatasync
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 5.23688 s, 205 MB/s

초당 MB(MB/s) 단위로 쓰기/읽기 속도를 확인하여 디스크 성능을 평가할 수 있습니다.

일반적으로 나올 수 있는 속도 범위

1. SSD (Solid State Drive)

쓰기 테스트 결과: SATA SSD에서 약 400~550 MB/s, NVMe SSD에서 1,500~3,000 MB/s 이상.

  • SATA SSD는 인터페이스 한계로 인해 최대 600 MB/s 정도입니다.
  • NVMe SSD는 PCIe 인터페이스를 활용해 고속으로 작업하므로 속도가 훨씬 높습니다.

2. SAS (Serial Attached SCSI)

쓰기 테스트 결과: SAS HDD (10,000~15,000 RPM)의 경우 150~400 MB/s.

  • 고성능 SAS SSD의 경우 800~1,200 MB/s까지 가능.

3. SATA (Serial ATA)

HDD 쓰기 테스트 결과: 7,200 RPM HDD의 경우 일반적으로 80~150 MB/s.

  • 일부 고속 10,000 RPM SATA 드라이브는 약 200 MB/s까지 도달할 수 있습니다.

4. IDE (Integrated Drive Electronics)

쓰기 테스트 결과: 20~50 MB/s.

  • 구형 드라이브이며 SATA나 SAS에 비해 성능이 낮습니다.

참고URL

- Ubuntu Manpage : dd

 

728x90