dd 명령어의 활용

dd 명령어를 사용하여 0xFF로 채워진 빈 데이터 블럭을 생성하려면 다음의 명령어를 사용하면 된다.

$ dd if=/dev/zero ibs=64k count=16 | tr "\000" "\377" > empty_block.dat

위의 명령어는 64K 단위로 /dev/zero 디바이스에서 데이터를 읽어 16개의 블럭을 생성하는데, 이것을 tr 명령어로 8진수 0x00의 값을 0xFF로 변경한 데이터를 리다이렉션 시켜 empty_block.dat을 생성한다. 즉, 위의 명령어 실행으로 1MB 크기의 빈 블럭이 생성된다.

dd 명령어를 사용하여 0xFF로 채워진 빈 데이터 블럭을 생성하려면 다음의 명령어를 사용하면 된다.

$ dd if=/dev/zero ibs=64k count=16 | tr "\000" "\377" > empty_block.dat

위의 명령어는 64K 단위로 데이터를 읽고 16개의 블럭을 생성하는데, 이것을 tr 명령어로 8진수 0의 값을 255로 변경하는 것을 의미한다. 이렇게 변형된 데이터를 리다이렉션 시켜 empty_block.dat을 생성한다. 위의 명령어 실행으로 1MB 크기의 빈 블럭이 생성된다.

 

dd 명령어는 여러 옵션이 존재하지만, 주로 사용하는 옵션을 정리하면 다음과 같다.

  • if = [file_path]
    입력파일 경로를 나타내며, /dev/mtd 같은 디바이스도 가능
  • of = [output_file]
    출력파일 경로를 나타내며, /dev/mtd 같은 디바이스도 가능
  • ibs = BYTES
    읽는 블럭 크기 지정
    • skip = N
      ibs로 설정한 블럭 크기만큼 이동 (읽기 파일 옵셋 변경)
  • obs = BYTES
    출력 블럭 크기 지정
    • seek = N
      obs로 설정한 블록 크기만큼 이동 (출력 파일 옵셋 변경)
  • count = N
    파일 읽고 쓰는 블럭 개수 지정
  • status = LEVEL
    진행 상태 출력 여부 옵션 e.g) none, noxfre, progress
  • conv = CONVS
    출력 파일 옵션
BYTE 설정 단위
c = 1, w = 2, b = 512

kB = 1000
MB = 1000 * 1000 
GB = 1000 * 1000 * 1000

K  = 1024
M  = 1024 * 1024
G  = 1024 * 1024 * 1024

위 옵션 이외에도 여러 옵션이 존재하지만, 위에 나열된 옵션으로도 파일 생성, 병합, 추출 등을 하는데 문제가 없을 것이다. 부족하다면 그때 찾아보도록 하자.

 

아래 일련의 dd 명령어의 사용은 1MB 크기의 bootloader는, 여러 모듈이 병합하여 생성한다. 초창기 ALi bootloader는 이해할 수 없는 구조로 매우 복잡한 구조였으며, bootloader 생성도 상당히 까다로웠다. 아래 일련의 명령어는 간단하게 표현한 것 이다.

$ dd if=/dev/zero ibs=64k count=16 | tr "\000" "\377" > bootloader.bin
$ dd if=boot_total_area.abs of=obotloader.bin ibs=64k obs=64k count=8 conv=notrunc
$ dd if=dtb.ubo of=bootloader.bin ibs=64k obs=64k seek=8 count=1 conv=notrunc
$ dd if=uboot.ubo of=bootloader.bin ibs=64k obs=64k seek=9 count=3 conv=notrunc
$ dd if=uboot.ubo of=bootloader.bin ibs=64k obs=64k seek=12 count=3 conv=notrunc
$ dd if=verify_decrypt.ubo of=bootloader.bin ibs=64k obs=64k seek=15 count=1 conv=notrunc

1MB 크기의 empty block을 생성한 후, 각 이미지 옵셋에 데이터를 기록하는 과정이며, conv=notrunc 옵션을 추가하지 않으며 기록하지 않는 영역을 0x00으로 채워지기 때문에 notrunc 옵션을 반드시 주어야 한다.