일반적으로 리눅스에서 block device의 data를 backup or data를 block device에 저장할때 주로 많이 사용이 되어지며, 본인이 원하는 image file을 생성시 사용된다.
사용법은 입력과 출력을 정하고 본인이 원하는 옵션을 넣어 복사를 진행한다. 그리고 복사되는 시간을 알려준다.
1.1 dd의 기본사용법
dd의 기본사용법 아래와 같은 방법으로 사용
$ dd if=(input file) of=(output file) bs=(block size) skip=(input offset) seek=(output offset) conv=(conversion) $ dd if=test1 | cat // 파이프 사용 stdout $ cat test1 | dd of=test2 // 파이프 사용 stdin
bs는 2의 지수이며, 일반적으로 512단위로 사용 (ie, 512, 1024, 2048, 4096, 8192, 16384)
1.2 dd의 세부옵션
주요 옵션은 다음과 같으며, 자세한 정보를 알고 싶으면, $man dd 로 알아보자.
OPERAND | DESCRIPTION |
---|---|
bs=BYTES | read and write up to BYTES bytes at a time (한번에 사용가능 Block Size 설정 in/out) |
conv=CONVS | convert the file as per the comma separated symbol list (옵션은 아래 참조) |
count=N | copy only N input blocks (default: 512 , 상위 bs 변경가능) |
ibs=BYTES | read up to BYTES bytes at a time (default: 512) 상위 bs의 input 세부설정 |
if=FILE | read from FILE instead of stdin (Input File) |
iflag=FLAGS | read as per the comma separated symbol list |
obs=BYTES | write BYTES bytes at a time (default: 512) 상위 bs의 output 세부설정 |
of=FILE | write to FILE instead of stdout (Onput File) |
oflag=FLAGS | write as per the comma separated symbol list |
seek=N | skip N obs-sized blocks at start of output (output 의 offset 기능 ,단위는 상위 bs,obs) |
skip=N | skip N ibs-sized blocks at start of input (input 의 offset 기능 ,단위는 상위 bs,ibs) |
- N은 Block의 갯수
- bs/ibs/obs는 Block의 크기 결정 (default:512)
- N/BYTES 에 사용되는 suffix
N/BYTE의 suffix 단위 | Bytes |
---|---|
c | 1 |
w | 2 |
b | 512 |
K | 1024 |
kB | 1000 |
M | 1024*1024 |
MB | 1000*1000 |
G | 1024*1024*1024 |
xM | 1000*1000*1000 |
- conv 옵션
CONVS | DESCRIPTION |
---|---|
nocreat | do not create the output file |
notrunc | do not truncate the output file (output file를 크기 줄이지 않고 유지) |
noerror | continue after read errors |
fdatasync | physically write output file data before finishing |
- iflag/oflag 옵션
FLAG | DESCRIPTION |
---|---|
dsync | use synchronized I/O for data |
sync | dsync기능과 metadata도 포함 (MBR) |
noerror | continue after read errors |
count_bytes | treat 'count=N' as a byte count (iflag only) |
skip_bytes | treat 'skip=N' as a byte count (iflag only) |
seek_bytes | treat 'seek=N' as a byte count (oflag only) |
1.3 MBR의 구성
Master Boot Record 약자이며 MBR 은 1 Sector (512 Byte)에 존재하며, 구조는 wiki를 보면 설명이 자세히 나온다.
이는 fdisk 와 parted 방식으로 사용할 경우 각각의 MBR이 조금씩 다른것으로 파악됨
- Classical generic MBR구성 (fdisk 사용할 경우)
- 446 bytes bootstrap
- 064 bytes Partition table(16bytes x 4)
- 002 bytes Signature (0x55 0xAA)
https://en.wikipedia.org/wiki/Master_boot_record
https://ko.wikipedia.org/wiki/%EB%A7%88%EC%8A%A4%ED%84%B0_%EB%B6%80%ED%8A%B8_%EB%A0%88%EC%BD%94%EB%93%9C
GPT (parted 기반구성)
https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface
1.4. dd의 기본사용법
https://ko.wikipedia.org/wiki//dev/random
https://www.ibm.com/support/knowledgecenter/en/ssw_aix_72/com.ibm.aix.files/mem.htm
1.4. dd의 기본사용법
- 자주사용하는 장치 FILE
- /dev/zero : 0값
- /dev/random : random 값
- /dev/urandom : random 값
- /dev/null : remove
- /dev/sdx(a,b,c,d) : SATA Device (1st,2nd,3st,4st)
- /dev/sda(1,2,3,4) : SATA Partition (1st,2nd,3st,4st)
- /dev/mmcblkx(0,1,2) : SD Card Device (1st,2nd,3st,4st)
- /dev/mmcblkxp(0,1,2) : SD Card Partition (1st,2nd,3st,4st)
- /dev/mem : memory map I/O ( offset: virtual address)
- /dev/loop(0,12,3): loop device
https://ko.wikipedia.org/wiki//dev/random
https://www.ibm.com/support/knowledgecenter/en/ssw_aix_72/com.ibm.aix.files/mem.htm
- losetup 기본 사용법
간단하게 loop device를 이용하여 image를 만들고자 할때 많이 사용하여, 이와 함께 dd /fdisk/ mount를 이용하여 세부구성한다.
//losetup은 attach 를 한 후 반드시 사용 후 detach $ sudo losetup /dev/loop0 ./data.img //attach device ( data.img는 /dev/loop0를 통해 접근가능) $ sudo losetup -a //현재 연결된 loop device 확인 .... // fdisk or dd or mount를 이용하여 /dev/loop0으로 접근하여 data.img를 구성 $ sudo losetup -d /dev/loop0 //detach device ( data.img 와 /dev/loop0 연결끊음) //losetup은 attach 를 하지만 offset를 정해서 사용 $ sudo losetup -o0 /dev/loop0 ./data.img //attach device (offset 0 byte에 연결) .... $ sudo losetup -d /dev/loop0 //detach device $ sudo losetup -e des /dev/loop0 ./data.img //attach device 와 encrytion 함 .... $ sudo losetup -d /dev/loop0
https://www.computerhope.com/unix/losetup.htm
http://bochs.sourceforge.net/doc/docbook/user/loop-device-usage.html
http://bochs.sourceforge.net/doc/docbook/user/loop-device-usage.html
- 일반적인 장치 복사 및 Backup
$ dd if=/dev/sda of=/dev/sdb bs=4096 conv=noerror,sync //SDA 장치 전부 $ dd if=/dev/mmcblk0 of=/dev/mmcblk1 bs=4096 conv=noerror,sync //mmcblk0 장치전부 //한번에 4096 byte씩 input 에서 읽어서 output 전송 , 물론 output은 input보다 작으면 안된다. $ dd if=/dev/sda1 of=sda1.img // sda 1st partition , Backup $ dd if=sda.img of=/dev/sda // sda에 sda.img write
- 압축이미지 생성 및 복구
$ dd if=/dev/sda | gzip -c > sda.img.gz $ md5sum sda.img.gz > sda.img.gz.md5sum //Backup 압축 이미지 생성 $ gzip -dc sda.img.gz | dd of=/dev/sda //Backup Image로 복구
- MBR Delete, Backup , Restore
$ dd if=/dev/zero of=file1 bs=512 count=1 conv=notrunc // file의 길이를 줄이지 않고, 앞에 512byte만 삭제 $ dd if=/dev/sda of=sda.img bs=512 count=1 //Backup MBR $ dd if=sda.img of=/dev/sda bs=512 count=1 //Restore MBR $ dd if=/dev/sda of=/tmp/sdambr2.img bs=446 count=1 //Backup only boot data of MBR , Remove partition table
1.5 dd 와 losetup 같이 File Image 생성
- data.img 생성 과 data.img 구성방법
//1. 빈 500MB data.img Image 생성 $ dd if=/dev/zero of=data.img bs=1k count=500k .... 524288000 바이트 (524 MB) 복사됨, 1.91343 초, 274 MB/초 // 0으로 채우며, 한번에 1024byte 씩 500*1024 반복하여 Image 생성 (500*1024*1024) //2. 새로 생성된 data.img 파티션 설정 $ fdisk ./data.img // fdisk를 사용하여 Partition 설정 Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-1023999, default 2048): 204800 Last sector, +sectors or +size{K,M,G} (204800-1023999, default 1023999): //Enter Command (m for help): w The partition table has been altered! //상위 204800x512 ~ 1023999x512 Partition 생성완료 $ fdisk -l ./data.img // fdisk를 사용하여 Partition 생성확인 Disk ./data.img: 500 MiB, 524288000 bytes, 1024000 sectors 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: dos Disk identifier: 0x5591d382 Device Boot Start End Sectors Size Id Type ./data.img1 204800 1023999 819200 400M 83 Linux //3. EXT4 FS 포맷 (204800x512 ~ 1023999x512) 상위주소 확인 $ sudo losetup -o $((512 * 204800)) /dev/loop0 data.img $ sudo mkfs -t ext4 /dev/loop0 $ sudo losetup -d /dev/loop0 //4. data.img 내부의 EXT4 mount 후 내부 Filesystem 확인 $ mkdir tmp1 $ sudo mount -o loop,offset=$((512 * 204800)) data.img ./tmp1 //loop device 사용 or $ sudo mount -o ro,offset=$((512*204800)) data.img ./tmp1 // read only $ ls ./tmp1/ lost+found $ umount tmp1 //5. MBR을 제외한 부분 1*512 ~ 512*204800 각 Image 복사 default bs 는 512 bytes $ sudo losetup -o0 /dev/loop0 ./data.img //attach device (0 byte에 연결) $ dd if=tmp1 of=data.img seek=1 //seek=01 , tmp1 파일을 data.img 01 x 512 byte 부터 복사 $ dd if=tmp2 of=data.img seek=31 //seek=31 , tmp2 파일을 data.img 31 x 512 byte 부터 복사 $ dd if=tmp3 of=data.img seek=63 //seek=31 , tmp2 파일을 data.img 63 x 512 byte 부터 복사 $ sudo losetup -d /dev/loop0 //detach device
- 상위 data.img 구성 (fdisk사용시만)
- 0~512 byte : MBR ( Partition 정보)
- 01 x 512 ~ 31 x 512 : tmp1
- 31 x 512 ~ 63 x 512 : tmp2
- 63 x 512 ~ 31 x 512 : tmp3
GPT의 경우 parted 사용하며, 이부분은 Partition 구성이 다르므로 생략
dd 사용예제
https://ahyuo79.blogspot.com/2014/08/tmp.html
https://ahyuo79.blogspot.com/2014/08/odroid-build2.html
dd 명령어 관련내용
http://wiki.linuxquestions.org/wiki/Some_dd_examples
https://linoxide.com/linux-command/linux-dd-command-create-1gb-file/
http://forum.falinux.com/zbxe/index.php?document_srl=561988&mid=lecture_tip
https://en.wikipedia.org/wiki/Dd_(Unix)
https://linoxide.com/linux-command/linux-dd-command-create-1gb-file/
2. hexdump/hd 기본사용법
dd와 함께 data를 검증하기 위해서 사용해보자
- hd/hexdump 옵션
- -s offset
- -n length
- -v display all input data.
- hexdump 옵션
- -C hex와 ascii 값도 출력
$ hd -s 512 -n 1024 -v data.img // 512byte 부터 길이 1024 bytes 만 보기 00000200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000230 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| ........ $ hd -n 512 -v data.img // 앞에 512 byte만 보기 $ hd -v data.img // 전체보기 $ hd data.img | less // 전체를 보지만 less로 위치이동가능 (g 와 line 입력)