[리눅스] 알면 도움되는 dd 명령어 사용 방법과 사용 예들
dd 명령어
dd 명령어는 파일을 복사하거나 sdcard 같은 저장장치에 데이터를 쓸 수 있게 해주거나, 혹은 반대로 저장장치나 파일로부터 데이터를 복사해올 수 있게 만들어주는 유용한 명령어입니다. 그래서 블록(Block)이라는 단위를 통해서 파일의 내용을 다른 파일이나 저장 장치로 쓸 수 있습니다. 이제부터 저장장치도 파일이라고 간주하고 설명하도록 하겠습니다.
사용법 1 : 파일 전체를 복사
기본적으로 dd 명령어는 아래와 같은 input file과 output file을 가지게 됩니다. 옵션이 아무것도 없죠. 이런 경우에는 파일의 전체를 복사합니다. 아래의 명령어는 /home/image.ext4 파일을 /dev/mmcblk0p2 파일로 복사합니다.
# dd if=/home/image.ext4 of=/dev/mmcblk0p2
- if : input file의 약자로 복사할 파일을 지정합니다.
- of : output file의 약자로 출력이 될 파일을 지정합니다.
사용법2 : input의 내용을 output의 일부분으로 복사
위 명령어는 기존 output의 내용이 있던 없던 간에 무조건 input의 내용으로만 복사가 되었습니다. 하지만 output의 내용의 일부분만 input의 내용으로 복사할 경우나 추가할 경우에는 conv 옵션에 notrunc 값을 지정해야합니다. 참고로 여기서 conv는 convert의 줄임말입니다.
# dd if=size512.bin of=size1024.bin conv=notrunc
- conv=notrunc : output 파일의 내용을 자르지 않는다는 의미입니다.
사용법3 : 블록 사이즈 지정하고 원하는 바이트만큼 복사
블록사이즈는 사용자가 지정하기 나름인데 기본적으로 설정되어있는 블록 사이즈는 512바이트입니다. 블록 사이즈나 블록의 갯수를 지정하여 원하는 양의 크기대로 복사할 수 있습니다. bs 옵션은 block size의 의미로 블록의 크기를 지정하는데 사용됩니다. 만약 512바이트가 아닌 블록 사이즈가 1024바이트이길 원한다면 bs의 옵션에 1024를 지정해주면 됩니다. 그리고 그 블록을 몇개 복사할 것이냐를 지정할때는 count옵션을 사용하면 됩니다.
아래와 같은 경우는 block size가 1이며 512의 블록을 output.bin으로 복사합니다. 이럴 경우에는 단순히 512바이트 만큼 복사가 되겠네요.
# dd if=/dev/vda1 of=output.bin bs=1 count=512
- bs : block size의 의미로 블록의 크기
- count : input file의 블록을 몇개 복사할 것인지를 지정
사용법4 : input 파일의 내용을 일부 건너 뛰고 복사
input 파일에서 처음부터가 아닌 몇 블록을 건너 뛴 다음에 복사하고 싶을때는 skip 옵션을 사용하시면 됩니다.
# dd if=size1024.bin of=size512.bin bs=128 skip=1 count=1
- skip : input 파일에서 건너 뛸 블록의 갯수를 의미합니다.
위의 예에서는 블록 사이즈를 128바이트로 지정한뒤 한 블록을 건너 뛰어서 1개의 블록을 복사하는 예입니다.
블록의 갯수가 아니고 skip을 단순히 바이트 단위로 건너 뛰고 싶을 경우 iflag에 skip_bytes를 지정하면 됩니다.
# dd if=size1024.bin of=size512.bin skip=128 iflag=skip_bytes bs=128 count=1
- iflag=skip_bytes : skip을 블록 단위가 아닌 바이트 단위로 인식하여 input의 내용을 건너 뜁니다.
그래서 위의 두 예제는 같은 결과를 보여줍니다.
사용법5 : output 파일의 내용을 일부 건너 뛰어 복사
skip옵션과 마찬가지로 output 파일의 블록을 건너 뛸 수도 있습니다. seek 옵션을 사용하면 됩니다.
# dd if=size1024.bin of=size512.bin bs=128 seek=1 count=1
- seek : 건너 뛸 output 파일의 블록 갯수를 지정합니다.
위의 예에서는 블록의 크기가 128바이트이며, size1024.bin의 블록 하나를 복사합니다. 이때 seek=1을 사용해 size512.bin의 블록 하나를 건너 뛴 자리에 복사가 됩니다.
역시 seek을 블록 단위가 아닌 바이트 단위로 인식시키려면 oflag에 seek_bytes를 지정하면 됩니다.
# dd if=size1024.bin of=size512.bin bs=128 seek=128 count=1 oflag=seek_bytes
- oflag=seek_bytes : seek을 블록 단위가 아닌 바이트 단위로 변경합니다.
위 두 예제는 같은 결과를 보여줍니다.
사용법6 : 출력 파일이 존재할 때만 실행
출력 파일이 있어야만 실행해야할 경우에는 아래와 같은 명령어를 사용하면 됩니다.
# dd if=size1024.bin of=size512.bin conv=nocreat
dd: failed to open 'size512.bin': No such file or directory
- conv=nocreat : output 파일이 있을 경우에만 dd 명령어를 수행합니다.
만약 파일이 존재하지 않는다면 위의 결과와 같이 output 파일이 존재하지 않는다는 오류를 발생시키고 명령어를 수행하지 않습니다.
dd명령은 이정도만 사용하면 무난하게 리눅스에서 사용하실 수 있을 겁니다.