10/12/2018

dd 와 hd/hexdump 사용법

1. dd 명령어

일반적으로 리눅스에서 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)


  1. N은 Block의 갯수 
  2. bs/ibs/obs는 Block의 크기 결정 (default:512)

  • N/BYTES 에 사용되는 suffix
N/BYTE의 suffix 단위Bytes
c1
w2
b512
K1024
kB1000
M1024*1024
MB1000*1000
G1024*1024*1024
xM1000*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 사용할 경우)
  1. 446 bytes bootstrap 
  2. 064 bytes Partition table(16bytes x 4)
  3. 002 bytes Signature (0x55 0xAA)

MBR 구성
  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의 기본사용법 


  • 자주사용하는 장치 FILE
  1. /dev/zero  : 0값 
  2. /dev/random : random 값
  3. /dev/urandom : random 값
  4. /dev/null   : remove
  5. /dev/sdx(a,b,c,d)   : SATA Device   (1st,2nd,3st,4st)
  6. /dev/sda(1,2,3,4)   : SATA Partition (1st,2nd,3st,4st)
  7. /dev/mmcblkx(0,1,2) : SD Card Device   (1st,2nd,3st,4st)  
  8. /dev/mmcblkxp(0,1,2) : SD Card Partition (1st,2nd,3st,4st) 
  9. /dev/mem  : memory map I/O ( offset: virtual address)
  10. /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




  • 일반적인 장치 복사 및 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사용시만)
  1. 0~512 byte : MBR ( Partition 정보)
  2. 01 x 512 ~ 31 x 512 : tmp1
  3. 31 x 512 ~ 63 x 512 : tmp2
  4. 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 옵션
  1. -s offset
  2. -n length
  3. -v display all input data.
  • hexdump 옵션
  1. -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 입력)

댓글 없음 :