이번에은 간단하고 짧고 그러나 의외로 많이 쓰일 만한 내용을 알려드리려 합니다.


사실 별로 중요한 내용은 아닙니다. 어쩌면 평생 쓸 일이 없을 지도 모릅니다. 하지만 *nix계열을 사용한다면 이 명령 하나만큼은 정말 강력하게 쓰게 될 겁니다.


dd


네 dd 입니다. 리눅스, 유닉스, OSX, 심지어 Win32, Win64용으로도 포팅해서 쓰는 dd입니다.

dd는 정말 강력한 프로그램입니다. 그리고 SSD시대에 도래하면서 그 효용성은 더욱 좋아졌습니다. 그런데 어떤분은 이러실 겁니다. 그래서 dd가 뭔데?


Windows용으로 제일 유명한 dd계열은 Win32 Disk Imager가 있습니다. IMG파일을 USB에 입힐 때 쓰는 바로 그 프로그램입니다. 사실 이 놈은 dd가 쓰는 구동을 Windows용으로 컨버팅한 것입니다. dd 그 자체를 포팅한 것도 있지만 Windows는 cmd가 편하지가 않아서 (사실 터미널이 편하다는 것도 무리이기는 합니다...) GUI로 만들어 낸 것이지요.


Windows에서 IMG나 ISO입히는 것으로 제일 유명한 Win32 Disk Imager. 대다수 책들이 이놈을 설명한다.

dd는 본래 명령줄 프로그램입니다. 하지만 명령체계는 단순합니다.


dd if=~~ of=~~ bs=~~


이겁니다. if는 입력 of는 출력 bs는 한번에 얼마나 이미지를 입힐지.


이렇게 생각하시는 분들이 있을 겁니다. 장치에서 파일이나 파일에서 장치로 입히는 것은 어떻게 하는 거지? 뭐 이런식으로요. 그런데 *nix들은 장치조차 파일로 취급합니다. 무슨이야기냐면 /dev/안에 폴더를 보면 수많은 0바이트 파일들이 있는데 이 파일들이 실은 그 장치와의 인터페이스 입니다. 


요것들이 사실은 전부 시스템에 연결된 장치 그 자체다. 이는 Linux인 안드로이드와 BSD인 iOS도 동일

이 파일에 내용을 써넣는 것으로 장치에 신호를 보내는 것이고 이 파일의 내용을 읽는 것으로 장치에서 신호를 읽어오는 겁니다.


예를 들어 /dev/video0는 사실 컴퓨터에 연결된 웹캠인데요. 여기서 /dev/video0의 파일내용을 읽어들이면 Linux4video2 형태로 만들어진 이미지 하나가 튀어나옵니다. 또 /dev/ttyS0는 장치에 연결된 시리얼 포트입니다. (Windows 기준으로 COM1)여기서 파일 내용을 쭉 읽어들이면 시리얼통신으로 들어오는 모든 신호를 읽어들이는 겁니다. 반대로 파일에 내용을 써넣으면 시리얼통신으로 내보내는 것이고요. 비슷한 것으로 /dev/ram 이라던가 여러가지가 있습니다.


참고로 내부 HDD는 /dev/sdXY(X는 순서대로 a, b,c 순서로 되어있습니다.Y는 파티션 번호입니다. 즉 숫자입니다. )이고 CD같은 광드라이브는 /dev/srY(마찬가지로 숫자입니다.)입니다.

그냥 위의 장치를 그대로 dd로 파일로 떠버리면 이미지가 되는 겁니다.


즉, CD드라이브가 /dev/sr0이고 ~/CD.iso파일로 읽어내고 싶다면


dd if=/dev/sr0 of=~/CD.iso


이거면 홈폴더에 CD.iso파일이 생기면서 이미지가 떠지는 겁니다. 그냥은 속도가 굉장히 느리고 답답하므로


dd if=/dev/sr0 of=~/CD.iso bs=4M


이렇게 해주시면 한번에 4Mb씩 쓰므로 속도가 꽤 빨라집니다. 이미지를 떴으니 이걸 다시 CD-R이나 CD-RW 혹은 DVD-R등으로 구우려면 그냥 iso파일을 브라세로 같은 프로그램으로 구워버리면 됩니다. 그냥 인터넷등지에서 흔히 보시는 iso파일이 이렇게 뜨는 겁니다. (물론 Windows에서 Nero나 Easy CD Creator같은 것으로 뜰 수도 있기는 합니다.)


USB메모리나 HDD등도 마찬가지입니다. 물론 이미지 파일은 읽고 있는 디스크에 만들면 안되겠지요.


dd if=/dev/sdb of=~/HDD.img bs=4M


이렇게 하면 홈폴더에 HDD.img라는 디스크를 통짜로 복제한 이미지가 떠집니다.

디스크가 아닌 파티션을 복제하려면 /dev/sdb대신 /dev/sdb1 처럼 뒤에 숫자를 붙이시면 됩니다.


dd if=/dev/sdb1 of=/dev/sdc2 bs=4M


이렇게 하시면 /dev/sdb의 1번 파티션의 내용을 그대로 /dev/sdc 디스크의 2번 파티션에 덮어버립니다. 다만 이 경우 /dev/sdc의 2번 파티션이 충분히 크지 않으면 3번 파티션까지 밀어버립니다. 강력한 만큼 따로 안전장치가 없기 때문에 주의하셔야 합니다.


반대로

dd if=~/USB.img of=/dev/sdb bs=4M

이렇게 해주시면 /dev/sdb에 그대로 디스크 이미지를 덮습니다. Win32 disk Imager가 하는 것과 동일하지요. 하는 짓이 예전에 많이 봤던 Norton Ghost를 닮았네요.

사실 *nix에서 Ghost가 따로 없는 대신 이 dd를 참 많이 이용합니다. 온라인게임에서 악명높은 백섭할 때 보통 이용한다고 합니다. 명령 한줄이면 쭉 되니까요. 해킹피해나 서버가 맛이 갔을 경우 dd로 처리하는 경우가 많습니다. 요즘은 btrfs나 BSD의 JFS의 스냅샷 기능을 쓰는 경우도 많지만 예전에는 dd를 써서 처리했다고 합니다. 사실 그 만큼 강력합니다.


어떠신가요? 명령어 한 줄의 위력이 대단하지 않나요? 이런 강력한 명령어 덕에 가상화같은 최신 기술도 사용하고 지금의 클라우드 컴퓨팅도 가능해진 것이랍니다. ISO를 뜨는 법을 물어보시는 분들이 가끔 있는데 dd가 바로 그 답입니다.


P.S

이런 강력한 명령어를 GUI로 구현하는 프로젝트도 당연히 있습니다. 

https://sourceforge.net/projects/ddgui/


여기인데요. Windows도 지원하고 꽤 지원범위가 넓습니다. 그런데....저는 이제 명령어가 익숙해서 안 건드리게 되네요. CMD나 터미널과 아직 어색하신 분들이라면 참고하세요.

,