$ dd: Copy file, convert and format

markyang92·2021년 9월 7일
0
post-thumbnail

$ dd

$ dd if=<input> of=<output> bs=<size> [count=<how many block>] \
&& sync
  • dd역할: if 로 지정된 파일을, 1번에 최대 bs 크기로 count만큼 of로 지정된 파일로 copy!!!
  • dd 명령은 && sync로 같이 쓰는게 좋음
    • I/O를 미쳐 끝내지 않고 사용자가 터미널을 빠져나가거나 할 수 있음
  • 주요 옵션
    • if=file: 입력 파일. (default: STDIN)
    • of=file: 출력 파일. (default: STDOUT)
dd option               description
bsBytes, 한번에 읽고 쓸 최대 바이트 크기 지정
default로 512
bs=1K, bs=1024, bs=1M 등으로 사용 가능
cbsBytes, 한번에 변환 작업 가능한 바이트 크기 지정
ibsBytes, 한번에 읽어드리는 입력단위 바이트 크기 지정
입력, 출력 블록 사이즈 크기가 같으면 그냥 bs 쓰면됨
obsBytes, 한번에 작성하는 출력 단위 바이트 지정
입력, 출력 블록 사이즈 크기가 같으면 그냥 bs 쓰면됨
countBlocks, 지정한 블록 수 만큼 복사
conv기호 목록에 따라 파일 변화
- ascii: EBCDIC코드를 ASCII코드로 변환
- ebcdic: ASCII코드를 EBCDIC코드로 변환
- ibm: ASCII코드를 EBCDIC코드로, EBCDIC코드를 ASCII코드로 변환
- block: cbs 단위로 변환할 때 줄바꿈 문자를 공백 문자로 변환
- unblock: cbs단위로 변환할 때 공백 문자를 줄바꿈 문자로 변환
- lcase: 영어 대문자를 소문자로 변환
- ucase: 영어 소문자를 대문자로 변환
- swab: 입력되는 두 바이트의 순서 변경
- sync: ibs크기와 obs크기가 차이날 경우 NULL 문자로 대체
- excl: 출력파일이 이미 존재하면 수행하지 않는다.
- nocreat: 출력파일이 존재해야 수행한다.
- notrunc: 출력파일이 자르지 않고 출력한다.
- noerror: 입력데이터를 읽을 때 에러가 발생하여도 계속 진행한다.
ifFile, 지정한 파일을 입력 대상으로 한다.
ofFile, 지정한 파일을 출력 대상으로 한다.
seek=numN, 지정한 단위만큼 obs 크기를 건너뛰고 출력을 시작한다.
skip=num입력파일이나, 스트림에서 num, 지정한 단위만큼 ibs 크기를 건너뛰고 입력을 시작한다.
status=progress진행사항 확인

dd 사용 예

1. 이미지 파일 -> dev copy

이미지 파일 -> 디바이스에 쓰기

$ sudo dd bs=1K if=<input> of=<devfile> && sync


e.g.,

$ sudo dd if=./Ubuntu.iso of=/dev/sdb bs=1K && sync
  • write 동안 blocking 됨
  • 사용 후, card 제거 전 $ eject 명령!
$ sudo eject /dev/sdb

2. dmesg -> test file copy

/var/log/dmesg의 내용을 읽어 /tmp/test/test 파일에 쓰는 것을 10번 반복한다.

$ ls -lh /var/log/dmesg
87K Apr 26 16:53 dmesg			# dmesg 파일
$ dd if=/var/log/dmesg of=/tmp/test/test bs=1024 count=10

3. 가상의 디스크 이미지

  • SDcard나 MMC는 저장 방식은 다를 수 있지만, 실제 사용 관점에서는 일반 하드디스크와 동일한 개념의 block device이다. (sector단위 읽고 쓰기)
  • 가상의 디스크 이미지를 만들고, 이를 SD card나 MMC에 통으로 쓰는 경우도 있다.
$ dd if=/dev/null of=test.img bs=1K seek=1M
  • bs: 1K, 1KB 단위 block size 설정. 실제 저장 장치의 block(sector)가 아니라, 한번에 read/write하는 단위
  • seek: 1M, 1M(1024K) 번째로 이동. 최종적으로 bs(1K) * seek(1M) = 1GB
  • 이렇게 생성된 파일은 sparse file 로, 실제로 해당 공간만큼 물리적인 공간에 할당하는 것이 아니라, 실제로 데이터가 있는 부분만 저장하는 방식이다.
  • 실제로 디스크에 할당된 공간은 du, ls -lh를 이용해 확인할 수 있다.
  • fdisk로 파티션할당도 가능하다.

MBR (Master Boot Record)

  • 디스크의 처음 실행을 위한 코드와 파티션 분할 정보가 들어가 있는 디스크의 첫번째 sector라고 할 수 있다.
  • 하드디스크의 섹터 크기는 512Byte이고, sector라는 개념은 하드디스크에서 읽고 쓰기를 하는 단위로 최근 SD card나 MMC에서도 대부분 논리적인 개념으로 512Byte 섹터 단위를 사용한다.
  • MBR에는 앞부분에 일반 PC에서 사용하던 것처럼 작은 실행코드가 들어갈 수 있고 (PC에서만 사용하는 것으로 임베디드에서는 의미 없음), offset 0x1be부터 16Byte 씩 4개의 파티션 정보가 들어간다.
    • 이 4개가 fdisk에서 primary partition이다.
  • SD card나 MMC의 경우 MSDOS 파티션을 사용하는 경우 마찬가지로 512Byte 단위의 섹터를 사용하고 위치를 표시하기 위해 32bit 크기로 기록된다.
    • MBR 섹터 0
    • 섹터 1... 최대 2TB 기록가능 (232 개 섹터, 약=4G=4G개)
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글