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 / 명령어 / screen - 터미널 세션 유지와 관리

Linux / 명령어 / screen - 터미널 세션 유지와 관리

Linux screen 명령어로 원격 터미널 세션을 분리하고 다시 연결하는 방법을 설명합니다. 세션·창 관리, 로그 기록, 문제 해결과 nohup·tmux·systemd의 차이를 정리합니다.

Linux / 명령어 / man - 명령어 매뉴얼 확인

Linux / 명령어 / man - 명령어 매뉴얼 확인

man 명령어로 리눅스 매뉴얼을 읽고 검색하는 방법을 설명합니다. 매뉴얼 섹션, 화면 이동, 키워드 검색, 셸 내장 명령 확인과 문서가 없을 때의 해결 방법을 함께 정리합니다.

Linux / 명령어 / traceroute - 목적지까지 라우터 경로 추적

Linux / 명령어 / traceroute - 목적지까지 라우터 경로 추적

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

Linux / 명령어 / rsync - 파일·디렉터리의 변경분 동기화

Linux / 명령어 / rsync - 파일·디렉터리의 변경분 동기화

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

Linux / 명령어 / xz - 파일을 xz 형식으로 압축하기

Linux / 명령어 / xz - 파일을 xz 형식으로 압축하기

Linux xz 명령어의 용도와 기본 문법을 알아봅니다. 파일 처리 예제, 주요 옵션과 원본 보존·덮어쓰기 주의점을 설명합니다.

Linux 강좌 / 파일 내용 읽기 - cat, less, more, head, tail

Linux 강좌 / 파일 내용 읽기 - cat, less, more, head, tail

cat, less, more, head, tail로 리눅스 파일 내용을 읽는 방법을 비교합니다. 짧은 파일과 긴 파일, 앞·뒤 일부를 확인할 때의 선택 기준과 실습 결과를 설명합니다.

Linux / 명령어 / sort - 텍스트 행 정렬

Linux / 명령어 / sort - 텍스트 행 정렬

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

Linux 강좌 / PID와 PPID 이해하기 - 프로세스 확인과 관리

Linux 강좌 / PID와 PPID 이해하기 - 프로세스 확인과 관리

PID와 PPID의 의미와 부모·자식 프로세스의 관계를 설명합니다. ps와 pgrep으로 확인하고, 직접 만든 실습 프로세스를 안전하게 종료하는 방법을 익힙니다.

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

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

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

웹 서버용 리눅스 추천: Ubuntu, Debian, Rocky Linux 선택 기준

웹 서버용 리눅스 추천: Ubuntu, Debian, Rocky Linux 선택 기준

웹 서버용 Linux 배포판을 지원 기간, 패키지 생태계, 보안 정책과 운영 환경 기준으로 비교합니다. Ubuntu Server, Debian, Rocky Linux·AlmaLinux와 Amazon Linux 중 상황에 맞는 선택법을 정리합니다.