Linux / 명령어 / dd - 블록 단위 데이터 복사와 변환
dd는 입력에서 데이터를 블록 단위로 읽어 출력에 쓰면서 블록 크기와 변환 방식을 제어하는 명령입니다. 디스크 이미지 생성과 복원, 제한된 구간 복사, 데이터 형식 변환에 유용하지만 of를 잘못 지정하면 대상 디스크나 파일을 즉시 덮어쓸 수 있습니다.
이 글에서는 if와 of, bs·count·skip·seek, 진행률 표시, 오류 처리와 동기화 옵션을 설명하고 장치 작업 전 확인 절차를 강조합니다.
dd 명령어란?
dd는 기본적으로 표준 입력에서 읽어 표준 출력으로 쓰며, if=와 of=로 입력·출력을 지정합니다. 일반 명령과 달리 주요 피연산자는 이름=값 형식을 사용하며 등호 주변에 공백을 넣지 않습니다. 출력 파일은 conv=notrunc가 없으면 기본적으로 잘릴 수 있습니다.
기본 문법
dd [피연산자] ...
파일명이나 경로에 공백이 있으면 따옴표로 감싸고, 하이픈으로 시작하는 이름은 가능한 경우 -- 뒤에 지정합니다. 지원 옵션은 배포판과 GNU Coreutils 버전에 따라 다를 수 있으므로 dd --help와 man dd으로 현재 시스템의 설명을 확인하세요.
dd 기본 사용법
파일을 다른 파일로 복사하기
if는 input file, of는 output file입니다. 일반 파일 복사에는 대개 cp가 더 단순하지만 블록 제어가 필요할 때 dd를 사용합니다.
dd if=source.img of=copy.img bs=4M status=progress
고정 크기 테스트 파일 만들기
/dev/zero에서 읽어 지정한 블록 수만큼 씁니다. 희소 파일이 아니라 실제 0 데이터를 기록하므로 공간과 쓰기 부하가 발생합니다.
dd if=/dev/zero of=test.bin bs=1M count=100 status=progress
디스크 이미지를 파일로 저장하기
장치가 사용 중이면 일관되지 않은 이미지가 될 수 있습니다. 가능한 한 마운트를 해제하거나 스냅샷을 사용하고, 읽기 대상 장치를 정확히 확인하세요.
sudo dd if=/dev/sdb of=/backup/disk-sdb.img bs=16M status=progress conv=fsync
장치 대신 작은 파일로 복사 결과 확인하기
dd는 입력(if=)과 출력(of=)을 바이트 단위로 복사합니다. 장치 경로를 잘못 지정하면 데이터를 덮어쓰므로 먼저 작은 일반 파일로 동작을 이해하세요.
printf 'ABC' > source.bin dd if=source.bin of=copy.bin bs=1 status=none cmp -s source.bin copy.bin echo $?
예시 출력 0은 두 파일의 바이트 내용이 같다는 뜻입니다. status=none은 dd의 진행 요약을 숨깁니다. 장치 이미지 작업에서는 대상 크기·마운트 상태·백업을 별도로 확인해야 합니다.
주요 옵션
| 옵션 | 설명 |
|---|---|
if=FILE |
입력 파일 또는 장치를 지정합니다. |
of=FILE |
출력 파일 또는 장치를 지정합니다. |
bs=SIZE |
입력과 출력 블록 크기를 함께 지정합니다. |
count=N |
복사할 입력 블록 수를 제한합니다. |
skip=N |
입력에서 지정한 블록 수만큼 건너뜁니다. |
seek=N |
출력에서 지정한 블록 수만큼 건너뛴 위치부터 씁니다. |
status=progress |
주기적으로 전송량과 진행 정보를 표시합니다. |
conv=noerror,sync |
읽기 오류 후 계속하고 짧은 블록을 채웁니다. 복구 목적과 한계를 이해해야 합니다. |
conv=fsync |
종료 전에 출력 데이터와 메타데이터의 동기화를 요청합니다. |
iflag=fullblock |
짧은 읽기를 모아 입력 블록을 채우도록 합니다. 파이프 입력에서 중요할 수 있습니다. |
긴 옵션은 의미를 파악하기 쉽고 스크립트 검토에도 도움이 됩니다. 다만 이식성이 중요한 스크립트에서는 대상 시스템이 해당 GNU 확장 옵션을 지원하는지 먼저 확인하세요.
실전 활용 예제
장치 식별 후 이미지 복원하기
복원은 출력 장치의 기존 파티션과 데이터를 덮어씁니다. 장치 이름은 재부팅이나 연결 순서에 따라 달라질 수 있으므로 모델, 일련번호, 크기와 마운트 상태를 확인하고 대상 파일 시스템을 마운트 해제하세요.
lsblk -o NAME,SIZE,MODEL,SERIAL,FSTYPE,MOUNTPOINTS findmnt sudo dd if=/backup/disk.img of=/dev/sdc bs=16M status=progress conv=fsync
파일 일부만 추출하기
skip과 count는 지정한 입력 블록 크기를 기준으로 합니다. 바이트 단위 오프셋이 필요하면 iflag=skip_bytes,count_bytes 지원 여부를 설치된 GNU 버전에서 확인하세요.
dd if=disk.img of=segment.bin bs=1M skip=100 count=20 status=progress
복사 결과 검증하기
장치 전체를 다시 읽어 해시하면 시간과 부하가 크지만, 중요한 복제에서는 원본과 결과의 크기·파티션·체크섬을 목적에 맞게 확인해야 합니다. 출력 캐시가 저장 장치에 반영됐는지도 고려하세요.
sha256sum source.img copy.img stat -c '%s %n' source.img copy.img sync
dd와 관련 명령 비교
| 명령·방법 | 주요 역할 | 적합한 상황 |
|---|---|---|
dd |
블록 단위 복사·변환 | 디스크 이미지와 오프셋 기반 작업 |
cp |
파일 시스템 수준 일반 복사 | 일반 파일과 디렉터리 복사 |
rsync |
증분·원격 파일 동기화 | 반복 백업과 네트워크 복사 |
ddrescue |
불량 매체 복구에 특화된 재시도·맵 파일 | 읽기 오류가 있는 디스크에서 가능한 데이터 구조 |
사용할 때 주의할 점
if와 of를 바꾸면 원본을 잃을 수 있다
of는 쓰기 대상입니다. 명령을 실행하기 직전에 장치 식별 결과와 입력·출력 방향을 다시 확인하세요.
큰 bs가 항상 더 빠른 것은 아니다
장치, 커널 캐시와 작업 유형에 따라 적절한 크기가 다릅니다. 지나치게 큰 블록은 오류 복구 단위를 키우고 메모리 사용을 늘릴 수 있습니다.
불량 디스크 복구에는 전용 도구를 검토한다
conv=noerror,sync는 단순한 오류 계속 처리 기능입니다. 반복 재시도와 진행 지도 관리가 필요한 복구에는 GNU ddrescue 같은 전용 도구가 더 적합합니다.
FAQ
dd에서 if와 of는 무엇인가요?
if는 읽을 입력, of는 덮어쓸 출력입니다. 장치 작업에서는 방향을 바꾸면 치명적인 데이터 손실이 생길 수 있습니다.
진행률을 보려면 어떻게 하나요?
GNU dd에서는 status=progress를 추가합니다. 최종 통계와 실제 저장 완료 여부는 별도로 확인하세요.
USB 부팅 이미지를 쓸 때 파티션 경로를 지정하나요?
일반적인 전체 디스크 이미지는 파티션이 아니라 대상 디스크 장치 전체에 쓰는 경우가 많지만, 이미지 형식의 지침을 따라야 합니다. 장치 선택을 반드시 검증하세요.
읽기 오류가 있는 디스크도 dd로 복구할 수 있나요?
일부 데이터를 읽을 수는 있지만, 불량 영역 재시도와 중단 재개가 필요한 복구에는 GNU ddrescue 같은 전용 도구가 일반적으로 더 적합합니다.









