Chistory

리눅스 명령어 1. dd 본문

개발 & CS/Linux

리눅스 명령어 1. dd

Chistory 2019. 12. 3. 00:12

그동안 실무 하면서 배운 각종 리눅스 유틸리티(명령어)에 대한 간략한 사용법, 응용방안에 대해 정리하고자 한다. 

가장 먼저 설명할 유틸리티는 dd이다. 

리눅스 환경에서 디스크, 파일시스템 등을 다룰 일이 생길 때, 한 번쯤은 접하게 되는 명령어가 바로 dd이다. 

리눅스 에서는 각종 디바이스들을 파일로써 다룬다. 이는 /dev 디렉토리에서 확인할 수 있다. 텍스트 터미널을 의미하는 /dev/tty, sata 디바이스를 의미하는 /dev/sdx, 파일로 존재하는 파일시스템을 연결하기 위한 루프백 디바이스 /dev/loop 등 다양한 파일들을 확인할 수 있다. 그리고 재밌게도, 다들 하나의 파일 로써 작동하기 때문에, cat 등의 파일을 출력할 수 있는 바이너리로 해당 파일들을 출력해보면, 무언가 의미있는 데이터들이 보이기도 한다.

dd는 파일들을 뭉텅이로 읽고 쓰게 해준다. 파일의 헤더, 디스크의 레이블, 파일시스템의 inode 정보까지도 전부 통째로 읽고 쓰는게 가능하다. 

예를들어,  MBR 레이블을 사용하는 디스크에 대고, 파티션 정보를 백업 / 복원 하고싶을 경우 다음과 같은 명령어로 할 수 있다.

dd if=/dev/sda of=sdambr.img bs=512 count=2

이 때, 파티션이 존재한다면 /dev/sda1 등의 파티션을 의미하는 파일들이 있을텐데, 그 파일이 아닌 /dev/sda 라는 숫자가 없는 파일을 if 옵션에 지정해야 한다. of는 출력 결과로, 파일시스템의 파일이나, 또 다른 디바이스를 지정할 수 있다. bs는 블록 사이즈로, 몇 키로바이트씩 읽어낼 것인지 지정하고, count는 그 카운트다.

이렇게 간단한 사용법을 알아냈으니, 간단하게 디스크 이미지를 뜨는 방법을 알아보자. 

먼저 다음명령어로 이미지를 만들 디스크의 정보를 가져와보자

$sudo fdisk -l
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 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: gpt
Disk identifier: ADBB86DA-BE1D-43DF-B6BA-55A6D3142FD5

Device     Start      End  Sectors Size Type
/dev/sda1   2048     4095     2048   1M BIOS boot
/dev/sda2   4096 41940991 41936896  20G Linux filesystem

위를 보면, 20 GiB 의 sda를 통째로 백업하고 싶을 수 있을 것이다.

현재 작업 디렉토리가 sda 가 아닌, 다른 디바이스의 파일시스템에 현재 위치해 있다고 할 때, 다음 명령어를 사용할 수 있다. 

$dd if=/dev/sda of=sda.img bs=512 count=41940991 status=progress

위 fdisk 정보를 보면 , 2번째 파티션이 끝나는 부분에 최종 파일시스템의 파티션 섹터가 끝나는 부분을 알 수 있다. 또한 Sector Size 정보를 보면 512bytes 라는 것 역시 알 수 있다. 

이제 dd 명령어를 보면,  bs 인자는 원하는 파일시스템의 Sector size, count는 그 개수라고 인식하면 정확하게 이미지를 제작할 수 있다. 

또한 status=progress 옵션을 주면, 실시간으로 얼만큼의 데이터가 복사되었는지 속도와 함께 확인 가능하다. 

이를 이용하면 time 등의 명령어와 함께 응용하여 파일시스템의 읽기, 쓰기 속도 측정도 가능하다. 

또한, /dev/zero, /dev/random 등의 값을 if 옵션으로 주고, of를 임의의 파일로 주면 무한정 큰 더미 데이터를 생성할 수 도 있다. 

반대로 img 파일을 if 옵션에 두고, of에 /dev/sdb 등의 블록디바이스를 지정하면, 파일시스템을 그대로 옮기는 것 역시 가능하다. 

$dd if=sda.img of=/dev/sdb bs=512 count=41940991 status=progress

다만, 이 때에는 of 에 지정되는 디바이스가 sda.img 의 크기보다 큰지 역시 확인해야 할 것 이다. 

또 이렇게 갓 덤프를 뜬 img는, 그 자체가 파일시스템으로써 또 리눅스 시스템에 마운트가 가능하다. 이를 loop 디바이스 라고 한다.  이를 이용하면, 이미지 파일 생성에 대한 부분을 상당수 자동화 할 수 있다. 기반이 되는 펌웨어 img 파일을 제작한 후, loop로 마운트 하여 내부를 수정하고, 실제 블록디바이스에 dd로 복사하여 새로운 펌웨어를 만드는 등 다양하게 활용이 가능하다. 

사실 이러한 파일 시스템, 파일체계는 운영체제 과목에서 자세히 다루고는 있지만, 이렇게 직접 부딪혀봐야 이해가 가는 부분이 있다. 윈도우에서는 D드라이브 안에 또 다른 드라이브를 마운트 한 다는 개념 자체가 생소하기 때문에, 처음부터 이해하기 어려운 것이다. 

다음 명령어로, img 파일을 바로 파일시스템에 마운트 하는 방법을 알아본 후, 이만 글을 마치려 한다. 

mount -o loop sda.img /home/mountpoint

'개발 & CS > Linux' 카테고리의 다른 글

프록시 솔루션간단 비교..  (0) 2020.01.03
haproxy libssl 에러  (0) 2020.01.03
리눅스 명령어 3. 파일명 일괄변경?  (1) 2019.12.16
리눅스 명령어 2. test와 if  (0) 2019.12.05
쉘스크립트  (0) 2019.09.16
Comments