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 같은 전용 도구가 일반적으로 더 적합합니다.

관련 글과 공식 문서

같은 카테고리의 다른 글
Linux / 명령어 / reboot - 시스템 안전하게 재시작

Linux / 명령어 / reboot - 시스템 안전하게 재시작

Linux reboot 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / ss - 열린 포트와 소켓 연결 상태 확인

Linux / 명령어 / ss - 열린 포트와 소켓 연결 상태 확인

Linux ss 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / resolvectl - systemd DNS 설정과 이름 조회 상태 확인

Linux / 명령어 / resolvectl - systemd DNS 설정과 이름 조회 상태 확인

Linux resolvectl 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / ln - 하드 링크와 심볼릭 링크 생성

Linux / 명령어 / ln - 하드 링크와 심볼릭 링크 생성

Linux ln 명령어로 하드 링크와 심볼릭 링크를 만드는 방법을 설명합니다. 두 링크의 차이, 상대 경로, 깨진 링크와 기존 링크 교체 시 주의점도 정리합니다.

Linux / 명령어 / history - 명령어 실행 기록 확인

Linux / 명령어 / history - 명령어 실행 기록 확인

Bash history 명령어로 이전 명령을 조회·검색·재실행·삭제하는 방법을 설명합니다. ~/.bash_history, HISTCONTROL, HISTTIMEFORMAT, histappend와 여러 터미널 기록 동기화 방법도 함께 정리합니다.

Linux / 명령어 / tr - 표준 입력의 문자 치환과 삭제

Linux / 명령어 / tr - 표준 입력의 문자 치환과 삭제

Linux tr 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / w - 로그인 사용자와 실행 중인 작업 확인

Linux / 명령어 / w - 로그인 사용자와 실행 중인 작업 확인

Linux w 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / pwd - 현재 작업 디렉터리 경로 확인

Linux / 명령어 / pwd - 현재 작업 디렉터리 경로 확인

Linux pwd 명령어로 현재 작업 디렉터리를 확인하는 방법을 설명합니다. 논리적 경로와 물리적 경로, 셸 내장 명령과 PWD 변수의 차이도 함께 알아봅니다.

Linux 강좌 / 텍스트 검색과 가공 - grep, sort, uniq, cut, wc

Linux 강좌 / 텍스트 검색과 가공 - grep, sort, uniq, cut, wc

grep, sort, uniq, cut, wc로 텍스트를 찾고 정렬·중복 제거·필드 추출·개수 세기를 실습합니다. 명령 결과와 흔한 해석 오류도 설명합니다.

Linux / 명령어

Linux / 명령어

리눅스에서 자주 사용하는 명령어를 파일, 텍스트, 권한, 프로세스, 시스템, 디스크, 네트워크와 패키지 관리 작업별로 정리했습니다. 링크가 있는 명령어는 자세한 사용법과 예제를 확인할 수 있습니다.