Dd
dd - convert and copy a file.
dd는 파일을 변환하고 복사하는 것이 주 목적인 유닉스 및 유닉스 계열 운영 체제용 명령 줄 유틸리티이다.
유닉스에서 하드웨어와 특수 장치 파일용 장치 드라이버는 파일 시스템에서 마치 일반 파일처럼 나타난다. dd는 기능이 개별 드라이버에서 구현되어 있는 경우 이러한 파일들을 읽거나 기록하는 것이 가능하다. 그러므로 dd는 하드 드라이브의 부팅 섹터를 백업하는 등의 일과 고정된 크기의 랜덤 데이터를 취득하기 위해 사용할 수 있다. dd 프로그램은 복사 시 데이터에 변환을 수행할 수도 있는데, 여기에는 바이트 순서 스와핑, ASCII↔EBCDIC 텍스트 인코딩 변환을 포함할 수 있다.
dd라는 이름은 IBM의 작업 제어 언어(JCL)에서 발견되는 DD 문과 관련되며 여기에서 DD는 "Data Description"을 가리킨다. 이 명령의 문법은 다른 유닉스 명령보다 JCL 문과 유사하다.
원래 ASCII와 EBCDIC 간의 변환을 위해 고안된 dd는 버전 5 유닉스에 처음 등장하였다. dd 명령어는 SUS의 일부인 IEEE 표준 1003.1-2008에 규정되어 있다.
용도
- 데이터 전송
- 마스터 부트 레코드 백업 및 복원
- 데이터 수정
- 디스크 완전 소거
- 데이터 복구
- 드라이브 성능 벤치마크
- 랜덤 데이터로 파일 생성
- 파일을 대문자로 변환
Flags
-
bs=BYTES - 한번에 읽어들일 바이트수와 출력할 바이트수 두가지 다를 같은수치로 지정합니다. bs로 지정하게되면 ibs와 obs는 무시하죠.
-
count=N - 복사할 블록수를 지정합니다.
-
if=FILE - Read from FILE instead of stdin
-
of=FILE - Write to FILE instead of stdout
Zero fill
로우 포맷시 사용할 수 있다.
Bootable USB
in MacOSX
USB 디스크는 /dev/disk2에 위치한다고 가정한다.
$ diskutil list
$ diskutil unmountDisk /dev/disk2
## disk 가 아닌, rdisk를 사용한다.
$ sudo dd if=image.iso of=/dev/rdisk2 bs=1m
$ diskutil eject /dev/disk2
in Ubuntu
| WARNING |
| 파티션 번호를 붙이면 안된다. 예를 들면 sdb1가 아닌 sdb를 사용해야 한다. |
Example
윈도우환경에서 FreeBSD 설치를 위한 USB 미디어 제작방법에 대하여 설명한다.
설치이미지를 USB에 부팅가능하도록 담아주는 프로그램으로서 dd.exe를 http://www.chrysocome.net/dd 에서 다운받고, USB드라이브명 확인한다.
실제 이미지를 USB메모리에 쓸때는 하드디스크 볼륨번호로 지정을 합니다.
usb-creator 와 비슷하게 만들기
usb-creator를 사용하여 iso 파일로 부팅 디스크 만들었을 때 해당 디스크를 sudo fdisk -l 으로 확인하면 다음과 같이 출력됨:
Disk /dev/sda: 14.32 GiB, 15376318464 bytes, 30031872 sectors
Disk model: Cruzer Fit
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 389FBC94-38B6-4D1A-8964-87488DB3D5A5
Device Start End Sectors Size Type
/dev/sda1 64 9291427 9291364 4.4G Microsoft basic data
/dev/sda2 9291428 9301499 10072 4.9M EFI System
/dev/sda3 9301500 9302099 600 300K Microsoft basic data
/dev/sda4 9306112 30031808 20725697 9.9G Linux filesystem
usb-creator가 만드는 파티션 구조를 분석하면 이렇습니다:
| 파티션 | 크기 | 타입 | 용도 |
| sda1 | 4.4G | Microsoft basic data | ISO 이미지 (casper/filesystem) |
| sda2 | 4.9M | EFI System | UEFI 부트로더 |
| sda3 | 300K | Microsoft basic data | UEFI 부트 카탈로그 |
| sda4 | 9.9G | Linux filesystem | writable (casper-rw, 영속 저장소) |
dd로 부팅이 안 되는 이유
dd는 ISO의 하이브리드 MBR 구조를 그대로 쓰는데, 일부 UEFI 펌웨어에서 이를 제대로 인식하지 못합니다. usb-creator는 GPT 파티션 테이블을 별도로 구성하고 EFI System Partition을 명시적으로 분리하기 때문에 UEFI 호환성이 높습니다.
수동으로 동일한 구조 만들기
mount, umount, mkfs(mkfs.ext4, mkfs.vfat), wipefs, sgdisk, partprobe, sync 명령을 사용한다.
#!/bin/bash
USB=/dev/sdb # USB 디바이스 (lsblk로 확인!)
ISO=ubuntu-24.04-desktop-amd64.iso
# 1. ISO를 loop 마운트하고 EFI 이미지 추출
sudo mkdir -p /mnt/iso
sudo mount -o loop "$ISO" /mnt/iso
# ISO 크기 확인 (섹터 단위)
ISO_SIZE=$(stat -c%s "$ISO")
ISO_SECTORS=$((ISO_SIZE / 512))
# 2. USB 초기화 및 GPT 파티션 생성
sudo wipefs -a "$USB"
sudo sgdisk --zap-all "$USB"
# 파티션 1: ISO 데이터 (Microsoft basic data)
sudo sgdisk -n 1:64:+4500M -t 1:0700 "$USB"
# 파티션 2: EFI System Partition
sudo sgdisk -n 2:0:+5M -t 2:EF00 "$USB"
# 파티션 3: 부트 카탈로그 (Microsoft basic data)
sudo sgdisk -n 3:0:+300K -t 3:0700 "$USB"
# 파티션 4: writable 영속 저장소 (나머지 공간)
sudo sgdisk -n 4:0:0 -t 4:8300 "$USB"
sudo partprobe "$USB"
sleep 2
# 3. 파티션 1: ISO 내용 복사
sudo mkfs.vfat -F 32 "${USB}1"
sudo mkdir -p /mnt/usb
sudo mount "${USB}1" /mnt/usb
sudo cp -a /mnt/iso/. /mnt/usb/
sudo umount /mnt/usb
# 4. 파티션 2: EFI 부트 파일 복사
sudo mkfs.vfat -F 12 "${USB}2"
sudo mount "${USB}2" /mnt/usb
sudo mkdir -p /mnt/usb/EFI/BOOT
sudo cp /mnt/iso/EFI/BOOT/* /mnt/usb/EFI/BOOT/
sudo umount /mnt/usb
# 5. 파티션 4: ext4 writable 영역 (casper-rw)
sudo mkfs.ext4 -L casper-rw "${USB}4"
# 6. 정리
sudo umount /mnt/iso
sudo sync
echo "완료. USB 부팅 가능 디스크 생성됨."
요약하면, USB 디스크 작업의 각 단계를 담당하는 명령을 사용합니다:
더 간단한 방법: ISO에 EFI 수정 후 dd
dd를 쓰되 EFI 호환성만 보장하려면 isohybrid 명령을 사용하면 된다:
# isohybrid로 UEFI 부팅 지원 추가 후 dd
sudo apt install syslinux-utils
sudo isohybrid --uefi ubuntu-24.04-desktop-amd64.iso
sudo dd bs=4M if=ubuntu-24.04-desktop-amd64.iso of=/dev/sdb status=progress oflag=sync
이 방법이 안 되면 위의 수동 파티션 방식을 사용하시면 됩니다. BIOS가 UEFI Only인지 Legacy도 지원하는지 확인해 봐야 한다.
표준 입출력 Pipe 속도 테스트
dd명령을 사용한 방법은 Standard streams#표준 입출력 Pipe 속도 테스트 항목 참조.
Troubleshooting
USB 부팅 안된다면 일반적인 조치 방법
Dd#USB 부팅 안된다면 일반적인 조치 방법 항목 참조.
See also
Favorite site
- Wikipedia (en) dd (Unix)에 대한 설명
- [추천] Wikipedia (ko) dd (Unix)에 대한 설명
- dd for windows
- 우분투 설치용 USB 메모리 만들기 1
References
-
How_to_create_bootable_USB_memory_stick.pdf ↩