Dd (유닉스)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

`dd`는 유닉스 계열 운영체제에서 사용되는 명령어로, 데이터를 복사하고 변환하는 데 사용된다. 1974년 Version 5 Unix의 일부로 처음 등장했으며, IBM의 JCL DD문에 대한 언급에서 이름을 따왔다. `dd`는 파일 복사, 장치 간 데이터 전송, MBR 백업 및 복원, 디스크 완전 소거, 드라이브 성능 벤치마킹 등 다양한 용도로 활용되며, 진행 상황을 표시하는 기능도 제공한다.

Dd (유닉스) - [IT 관련 정보]에 관한 문서
기본 정보
종류명령어
개발자켄 톰프슨 (AT&T 벨 연구소)
발표일1974년 6월
운영 체제유닉스, 유닉스 계열, 플랜 9, 인페르노, 윈도우
플랫폼크로스 플랫폼
장르명령
라이선스coreutils: GPLv3+
Plan 9: MIT 라이선스
저장소coreutils: coreutils 저장소
📚 더 읽어볼만한 페이지
  • 데이터 복구 소프트웨어 - 리커바
  • 디스크 복제 - 클론질라
    클론질라는 디스크 복제 및 배포를 위한 오픈 소스 소프트웨어로, 파티션 및 디스크 복제, 이미지 생성, 복원 기능을 제공하며 다양한 파일 시스템을 지원한다.
  • 디스크 복제 - 고스트 (디스크 유틸리티)
    고스트는 시만텍에서 개발한 디스크 백업 및 복구 소프트웨어로, 시스템 이미지 생성, 복구, 증분/예약 백업, 암호화 기능을 제공했으나 2009년 이후 개발이 중단되었다.
  • 하드 디스크 소프트웨어 - CHKDSK
    CHKDSK는 디스크의 파일 시스템 무결성을 검사하고 오류를 수정하는 시스템 도구로, 다양한 운영체제에서 구현되었으며 파일 시스템 오류 수정 및 손상된 파일 조각 복구 기능을 제공하지만 데이터 손상이나 시스템 불안정을 야기할 수 있다는 비판도 있다.
  • 하드 디스크 소프트웨어 - 디스크 유틸리티
    macOS에 내장된 디스크 유틸리티는 하드 디스크, 이동식 미디어, 디스크 이미지 등의 디스크 볼륨 관리, 검증 및 복구, 포맷, 파티셔닝, 복제, 디스크 이미지 생성, 변환, 백업, 암호화, 보안 삭제 기능을 제공하며, GUI 및 CLI 환경을 지원한다.

2. 역사

1974년, `dd` 명령어는 Version 5 Unix의 일부로 등장했다. 데니스 리치에 따르면, 이 이름은 IBM작업 제어 언어 (JCL)에서 발견되는 DD문을 참고한 것이며, 여기서 "Data Definition"의 약자이다. 더글러스 맥길로이에 따르면, `dd`는 "원래 DEC 컴퓨터의 ASCII, 리틀 엔디안, 바이트 스트림 세계와 IBM의 EBCDIC, 빅 엔디안, 블록화된 세계 사이의 파일을 변환하기 위한 것"이었다. 에릭 S. 레이먼드는 이 명령의 구문이 다른 유닉스 명령어보다 JCL 문에 더 유사하기 때문에 "인터페이스 설계는 분명히 장난이었다"고 생각한다.

1987년, `dd` 명령어는 1987년 발행된 X/Open 이식성 가이드 2판에 명시되었다. 이는 IEEE Std 1003.1-2008 (POSIX)로 계승되었으며, Single UNIX Specification의 일부이다.

1990년, 데이비드 매켄지는 GNU 파일유틸리티 (현재 coreutils의 일부)를 발표했는데, 여기에는 `dd` 명령어가 포함되어 있었다. 이 명령어는 폴 루빈, 데이비드 매켄지, 스튜어트 켐프가 작성했다. 1991년부터 짐 메이어링이 유지 관리하고 있다.

1995년, Plan 9 2nd edition이 출시되었고, 해당 `dd` 명령어 인터페이스는 JCL 문 스타일 대신 전통적인 명령줄 옵션 스타일을 사용하도록 재설계되었다.

최소 1999년부터 UnxUtils에서 Microsoft Windows용 네이티브 Win32 포팅이 제공되고 있다.

`dd`는 오타로 인해 드라이브를 지우는 기능 때문에 종종 "Disk Destroyer"라고 불리기도 한다.

3. 사용법

`dd` 명령어는 유닉스 계열 운영체제에서 파일을 복사하고 변환하는 데 사용되는 강력한 도구이다. 하지만, 명령어의 옵션 구문이 다른 유닉스 명령어들과는 다른 독특한 형태를 가지고 있어 주의가 필요하다.

`dd`는 `option=value` 형태의 구문을 사용하는데, 이는 `-option value` 또는 `--option=value` 와 같은 일반적인 유닉스 명령어 옵션 형식과는 다르다. 예를 들어, 입력 파일을 지정할 때는 `if=input.txt`와 같이 사용한다.

기본적으로 `dd`는 표준 입력에서 데이터를 읽어 표준 출력으로 결과를 출력한다. 하지만, `if` (입력 파일) 및 `of` (출력 파일) 옵션을 사용하여 이러한 입출력 동작을 변경할 수 있다. 예를 들어 `dd if=/dev/sda of=/dev/sdb`는 `/dev/sda`의 내용을 `/dev/sdb`로 복사한다.

실행 중인 `dd` 프로세스에 SIGINFO 신호(또는 리눅스에서 USR1 신호)를 보내면, 현재까지의 I/O 통계를 표준 에러 스트림에 출력하고 복사를 계속 진행한다.

`dd`는 IBM작업 제어 언어(JCL)에서 발견되는 DD문에서 유래되었다. `dd`는 "Data Definition"의 약자로 알려져 있었으나, 더글러스 맥길로이에 따르면, "원래 DEC 컴퓨터의 ASCII, 리틀 엔디안, 바이트 스트림 세계와 IBM의 EBCDIC, 빅 엔디안, 블록화된 세계 사이의 파일을 변환하기 위한 것"이었다.

`dd`는 오타로 인해 드라이브를 지워 "Disk Destroyer"라는 별명을 얻기도 했다.

3.1. 기본 구문

dd영어는 다른 많은 유닉스 프로그램과 달리 `option=value` 구문을 사용하는 명령 줄 유틸리티이다. 이는 보다 표준적인 `-option value` 또는 `--option=value` 형식과는 다르다. 기본적으로 dd영어는 표준 입력에서 읽어 표준 출력으로 쓰지만, `if` (입력 파일) 및 `of` (출력 파일) 옵션을 사용하여 변경할 수 있다.

dd영어 호출의 비표준 부분은 구현마다 다르다.

입출력, 복사 크기, 읽기/쓰기 시작 위치, 1회 읽기/쓰기 데이터 크기, 데이터 변환 관련 옵션은 다음과 같다.

👆
좌우로 밀어서 보기
옵션설명
if=[file]표준 입력 대신 파일 file에서 읽는다.
of=[file]표준 출력 대신 파일 file에 쓴다.
count=[blocks]ibs 바이트 블록 blocks 개수만큼 입력 파일을 복사한다.
skip=[blocks]ibs 바이트 블록 blocks 개수만큼 입력 파일의 시작 부분을 건너뛴다.
seek=[blocks]출력 시작 부분에 있는 obs 바이트 블록 blocks 개수만큼 쓰지 않는다.
bs=[bytes]한 번에 bytes 바이트씩 읽고 쓴다.
ibs=[bytes]한 번에 bytes 바이트씩 읽는다. 기본값은 512이다.
obs=[bytes]한 번에 bytes 바이트씩 쓴다. 기본값은 512이다.
conv=[CONVERSION]데이터를 변환한다.
conv=noerror읽기 오류가 발생해도 계속 진행한다.
conv=sync입력 블록 크기가 ibs에 지정된 바이트 수보다 작을 때 패딩을 수행한다.

3.2. 주요 옵션

`dd` 명령어는 다양한 옵션을 사용하여 파일 복사 및 변환 작업을 수행할 수 있다. 이러한 옵션들은 `option=value` 형태로 지정되며, 표준적인 유닉스 명령어 옵션 형식(`-option value` 또는 `--option=value`)과는 다르다.

다음은 `dd` 명령어의 주요 옵션들을 표로 정리한 것이다.

👆
좌우로 밀어서 보기
옵션설명기본값
`if=[파일]`입력 파일을 지정한다.표준 입력
`of=[파일]`출력 파일을 지정한다.표준 출력
`bs=[바이트]`한 번에 읽고 쓸 바이트 수를 지정한다. 이 값은 `ibs`와 `obs` 옵션을 모두 재정의한다.512 바이트
`ibs=[바이트]`한 번에 읽을 바이트 수를 지정한다.512 바이트
`obs=[바이트]`한 번에 쓸 바이트 수를 지정한다.512 바이트
`count=[블록 수]`복사할 입력 블록 수를 지정한다.(없음)
`skip=[블록 수]`입력 파일에서 건너뛸 `ibs` 바이트 블록 수를 지정한다.(없음)
`seek=[블록 수]`출력 파일에서 건너뛸 `obs` 바이트 블록 수를 지정한다.(없음)
`conv=[변환 옵션]`데이터 변환 옵션을 지정한다.(없음)


블록 크기 옵션에 제공되는 값은 십진수 정수로 해석되며, 바이트보다 큰 단위를 나타내는 접미사를 포함할 수 있다. POSIX는 512에 대한 `b` (블록)와 1024에 대한 `k` (키비바이트) 접미사만 지정한다. 구현에 따라 추가적인 접미사 지원이 다를 수 있다. 예를 들어, (Free) BSD는 `m` (메비바이트), `g` (기비바이트) 등을, GNU는 `M` 및 `G`를 사용하며, SI 단위에 해당하는 킬로바이트에 `kB`, `MB`, `GB`를 사용한다.

`conv` 옵션은 데이터를 변환하는 데 사용되며, 다음과 같은 변환 옵션이 있다.

* `noerror`: 읽기 오류가 발생해도 계속 진행한다.
* `sync`: 입력 블록 크기가 `ibs`에 지정되지 않은 바이트 수에 미치지 못할 때 패딩을 수행한다.

블록 크기는 `dd` 명령의 복사 성능에 영향을 미친다. 많은 작은 읽기 또는 쓰기는 더 적은 수의 큰 읽기 또는 쓰기보다 느린 경우가 많다. 큰 블록을 사용하려면 더 많은 RAM이 필요하며 오류 복구가 복잡해질 수 있다.

3.3. 블록 크기

블록은 한 번에 읽거나 쓰는 바이트의 수를 측정하는 단위이다. `bs` 옵션은 읽기 블록 크기(`ibs`)와 쓰기 블록 크기(`obs`)를 동시에 설정하며, `ibs`와 `obs` 옵션으로 각각을 개별적으로 지정할 수도 있다. 입력 및 출력 블록 크기의 기본값은 512바이트이다. `count` 옵션은 복사할 블록 수를, `skip`과 `seek` 옵션은 각각 읽기 및 쓰기를 시작할 위치를 블록 단위로 지정한다.

블록 크기 옵션에 제공되는 값은 십진수 정수로 해석되며, 접미사를 사용하여 단위를 나타낼 수 있다. POSIX는 512바이트를 나타내는 `b`와 1024바이트(키비바이트)를 나타내는 `k` 접미사만 지정한다. GNU dd는 `M` (메비바이트), `G` (기비바이트) 등의 접미사를 지원한다. 예를 들어, `bs=16M`은 16메비바이트(16777216바이트)를, `bs=3kB`는 3000바이트를 의미한다.

곱셈 연산자 `x`를 사용하여 블록 크기를 계산할 수도 있다. 예를 들어, `bs=2x80x18b`는 2 × 80 × 18 × 512 = 1474560 바이트로, 1440KiB 플로피 디스크의 크기와 같다.

블록 크기는 `dd` 명령의 성능에 영향을 준다. 큰 블록 크기는 더 빠른 속도를 제공하지만, 더 많은 RAM을 필요로 한다. `dd`가 테이프 드라이브나 네트워크와 같이 가변 블록 크기 장치와 함께 사용될 경우, 블록 크기는 통신 프로토콜에 따라 테이프 레코드 크기 또는 네트워크 패킷 크기를 결정할 수 있다.

다음은 블록 크기 및 입출력 관련 옵션이다.

👆
좌우로 밀어서 보기
옵션설명기본값
`ibs=[bytes]`한 번에 bytes 바이트씩 읽음512
`obs=[bytes]`한 번에 bytes 바이트씩 씀512
`bs=[bytes]`한 번에 bytes 바이트씩 읽고 씀-
`count=[blocks]``ibs` 바이트 블록 `blocks` 개수만큼 입력 파일을 복사-
`skip=[blocks]``ibs` 바이트 블록 `blocks` 개수만큼 입력 파일의 시작 부분을 건너뜀-
`seek=[blocks]`출력의 시작 부분에 있는 `obs` 바이트 블록 `blocks` 개수만큼 쓰지 않음-
`if=[file]`표준 입력 대신 파일 `file`에서 읽음-
`of=[file]`표준 출력 대신 파일 `file`로 씀-

4. 용도

`dd` 명령어는 다양한 용도로 사용될 수 있다. 일반적인 파일 복사 명령어보다 속도가 느릴 수 있지만, "파일의 특정 지점에서 덮어쓰거나 잘라내거나 파일 내에서 탐색하는" 고유한 기능을 가지고 있어 유닉스 파일 API에 대한 저수준 인터페이스를 제공한다.

`dd`는 파일, 장치, 파티션 및 볼륨 간에 데이터를 복제할 수 있다. 또한, 전송 중에 `conv` 옵션을 사용하여 데이터를 수정할 수도 있다. 예를 들어, CD-ROM, DVD 또는 블루레이 디스크에서 ISO 디스크 이미지를 생성하거나, 이전에 생성된 이미지에서 하드 디스크 드라이브 (또는 SD 카드 등)를 복원하거나, 한 파티션을 다른 파티션으로 복제할 수 있다.

`dd`는 데이터를 제자리에서 수정할 수 있다. 예를 들어, 다음 명령은 파일의 처음 512바이트를 널 바이트로 덮어쓴다.

```bash
dd if=/dev/zero of=path/to/file bs=512 count=1 conv=notrunc
```

`notrunc` 옵션은 출력 파일을 잘라내지 않도록 하여, 지정된 바이트만 변경하고 나머지 부분은 그대로 유지한다. 이 옵션이 없으면 `dd`는 512바이트 길이의 출력 파일을 생성한다.

4.1. 데이터 전송 및 복제

dd영어는 파일, 장치, 파티션 및 볼륨 간에 데이터를 복제할 수 있다. 데이터는 이들 중 어느 곳에서든 입출력될 수 있지만 파티션으로 출력할 때는 중요한 차이점이 있다. 또한, 전송 중에 `conv` 옵션을 사용하여 매체에 맞게 데이터를 수정할 수 있다.

👆
좌우로 밀어서 보기
dd영어의 데이터 전송 형태
명령어설명
dd if=/dev/sr0 of=myCD.iso bs=2048 conv=noerror,syncCD-ROM으로부터 ISO 디스크 이미지를 생성한다. 일부 경우 작성된 ISO 이미지는 CD-ROM 기록에 사용되는 것과 동일하지 않을 수도 있다.
dd if=system.img of=/dev/sdc bs=4096 conv=noerror이전에 만든 이미지로부터 하드 디스크 드라이브(또는 SD 카드)를 복원한다.
dd if=/dev/sda2 of=/dev/sdb2 bs=4096 conv=noerror하나의 파티션을 다른 파티션으로 복제한다.
dd if=/dev/ad0 of=/dev/ad1 bs=1M conv=noerror하드 디스크 드라이브 "ad0"을 "ad1"으로 복제한다.


`noerror` 옵션은 오류가 발생해도 계속 진행하도록 하고, `sync` 옵션은 출력 블록을 패딩하도록 한다.

4.2. 마스터 부트 레코드(MBR) 백업 및 복원

MBR을 백업하거나 복원할 수 있다.

* MBR 백업:

👆
좌우로 밀어서 보기
명령어설명
`dd if=/dev/sda of=MBR.img bs=512 count=1``/dev/sda` 장치의 MBR을 `MBR.img` 파일로 백업한다. (MS-DOS 파티션, MBR 매직 바이트 포함)
`dd if=/dev/sda of=MBR_boot.img bs=446 count=1``/dev/sda` 장치의 MBR 부트 코드만 `MBR_boot.img` 파일로 백업한다. (파티션 테이블 및 부팅 시 필요한 매직 바이트 제외)


* 플로피 드라이브의 처음 두 섹터 복제:
👆
좌우로 밀어서 보기
명령어설명
`dd if=/dev/fd0 of=MBRboot.img bs=512 count=2``/dev/fd0` (플로피 드라이브)의 처음 두 섹터를 `MBRboot.img` 파일로 복제한다.

4.3. 데이터 수정

`dd`는 파일의 특정 부분의 데이터를 수정할 수 있다. 예를 들어, 다음 명령을 실행하면 파일의 처음 512바이트를 널(null) 바이트로 채울 수 있다.

`dd if=/dev/zero of=path/to/file bs=512 count=1 conv=notrunc`

`notrunc` 변환 옵션은 출력 파일을 잘라내지 않는다는 것을 의미한다. 즉, 출력 파일이 이미 존재하면 지정된 바이트만 바꾸고 출력 파일의 나머지 부분은 그대로 둔다. 이 옵션을 사용하지 않으면 `dd`는 512바이트 길이의 출력 파일을 생성한다.

4.4. 디스크 완전 소거 (데이터 완전 삭제)

보안을 위해 버려진 장치의 디스크 완전 소거를 해야 할 때가 있다.

`dd`를 사용하여 디스크를 0으로 채워 소거할 수 있다.
```bash
dd if=/dev/zero of=/dev/sda bs=4k
```
다른 방법으로 디스크를 임의의 데이터로 채워 소거할 수도 있다.
```bash
dd if=/dev/urandom of=/dev/sda bs=4k
```

위의 방법에서 `bs=16M` 옵션을 사용하면 `dd`가 한 번에 16MB를 읽고 쓰게 한다. 최신 시스템에서는 더 큰 블록 크기가 더 빠를 수도 있다. 0을 만드는 것은 매우 빠르지만 임의의 데이터는 CPU에서 생성해야 하므로, 드라이브를 임의의 데이터로 채우는 것이 0으로 채우는 것보다 시간이 더 오래 걸릴 수 있다. 최신 하드 디스크 드라이브에서는 드라이브를 0으로 채우면 드라이브에 포함된 대부분의 데이터를 영구적으로 복구할 수 없게 된다. 그러나 플래시 메모리와 같은 다른 종류의 드라이브에서는 많은 데이터를 데이터 잔류를 통해 여전히 복구할 수 있다.

최신 하드 디스크 드라이브에는 드라이브의 접근 가능하고 접근 불가능한 모든 부분을 영구적이고 안전하게 지우도록 설계된 보안 삭제 명령이 포함되어 있다. 일부 솔리드 스테이트 드라이브에서도 작동할 수 있지만, 2017년 현재 USB 플래시 드라이브나 Secure Digital 플래시 메모리에서는 작동하지 않는다. 사용할 수 있는 경우, `dd`를 사용하는 것보다 빠르고 안전하다. 리눅스에서는 hdparm 명령의 `--security-erase-enhanced` 옵션을 통해 접근할 수 있다.

4.5. 데이터 복구

손상된 드라이브에서 데이터를 복구할 때에는 GNU `ddrescue`와 같은 도구를 사용하는 것이 더 효과적이다. 1999년 10월에 작성된 C 프로그램인 `dd_rescue`는 두 가지 블록 크기를 지원하여 큰 크기로 읽기가 실패하면 더 작은 크기로 전환하여 가능한 많은 데이터를 복구한다. 2003년에는 `dd_rescue` 사용을 자동화하는 `dd_rhelp` 스크립트가 개발되었다.

2004년, GNU는 `dd`와는 별개인 ddrescue 유틸리티를 개발했다. 이 유틸리티는 더 정교한 동적 블록 크기 알고리즘을 사용하며, `dd_rescue`와 `dd_rhelp` 개발자들도 자체 구현보다 우수하다고 평가한다. GNU `ddrescue`는 `addrescue`, `gddrescue` (데비안 패키지 이름), `gnu_ddrescue` (openSUSE 패키지 이름) 등 다양한 이름으로 불리기도 한다. `savehd7`이라는 또 다른 오픈 소스 프로그램도 있지만, 자체 프로그래밍 언어 인터프리터 설치가 필요하다.

4.6. 드라이브 성능 벤치마크

다음 명령어로 쓰기 성능을 측정할 수 있다.


dd if=/dev/zero bs=1M count=1024 of=testfile


다음 명령어로 읽기 성능을 측정할 수 있다.


dd if=testfile of=/dev/null bs=1M

4.7. 기타 용도

커널 랜덤 드라이버를 이용하여 랜덤 데이터로 이루어진 100바이트 크기의 파일을 만들 수 있다.

: `dd if=/dev/urandom of=myrandom bs=100 count=1`

파일의 내용을 대문자로 바꿀 수 있다.

: `dd if=filename of=filename1 conv=ucase`

5. 진행 상황 표시

기본적으로 `dd`는 진행 상황을 표시하지 않는다. GNU `dd`는 `status=progress` 옵션을 사용하여 진행 상황을 표시할 수 있다. 또는, `kill -USR1 [dd 프로세스 ID]` 명령을 사용하여 진행 상황을 확인할 수 있다.

실행 중인 GNU `dd` 프로세스에 `USR1` 신호를 보내면 (BSD 시스템에서는 `INFO` 신호) `dd`가 현재 전송된 블록 수를 출력한다.

다음 명령어를 사용하면 전송이 완료될 때까지 10초마다 진행 상황을 확인할 수 있다. 여기서 `dd-pid`는 `dd`의 프로세스 ID로 바꿔야 한다.

`while kill -USR1 dd-pid ; do sleep 10 ; done`

6. 파생 도구

`dcfldd`는 GNU `dd`의 포크로, 당시 미국 국방부 컴퓨터 포렌식 연구소에서 근무하던 닉 하버에 의해 개발된 향상된 버전이다. `dd`에 비해 `dcfldd`는 여러 개의 출력 파일을 지원하고, 동시에 여러 개의 체크섬 계산을 지원하며, 파일 일치를 위한 검증 모드를 제공하고, 작업의 진행률을 백분율로 표시할 수 있다. 2024년 2월 현재, 마지막 릴리스는 2023년 4월에 나온 1.9.1 버전이다.