제공 : 한빛 네트워크
저자 : 한동훈
윈도우에서는 리눅스를 동시에 사용할 수 있습니다. VMware 같은 가상 머신이 아니라 하나의 프로세스로 리눅스를 실행하는 것이 가능합니다.
사용자 영역에서 리눅스를 실행하는 것을 사용자 모드 리눅스(UML)라 부릅니다.
사실, UML은 리눅스 환경에서 리눅스 이미지를 빌드해서 사용자 영역에서 하나의 프로세스로 실행하는 방법으로 제안된 것입니다. 이를 사용하면 디버깅하기가 쉽습니다.
커널에 문제가 있어 중단되어도 시스템의 중단이 아니라 프로세스 하나가 중단된 것에 불과합니다. 그러니까, UML을 사용하고, 그 안에서 프로그램이 실행된다면 동일한 사용자 영역이 되므로 시스템 호출에서 발생하는 부하가 사라집니다.
커널 자체를 디버깅하기 쉽다는 장점도 있습니다. 왠지 ncc와 비슷하죠?
ncc란?
ncc는 New C Compiler의 약자로 컴파일 도구라기 보다는 소스 코드 분석도구입니다. ctags, cscope가 소스 코드의 텍스트 분석을 돕는다면 ncc는 컴파일된 결과물을 이용해서 소스코드를 분석하게 해줍니다. nccnav vmlinux.nccout 명령을 실행해서 컴파일된 커널 이미지를 분석하게 해주며, 함수의 호출그래프를 이용할 수 있으며 소스 분석을 손쉽게 해줍니다. DEFINE_SPINLOCK( dcache_lock )과 같이 매크로로 선언된 변수의 경우 ctags, cscope로는 해당 변수가 선언되지 않은것으로 간주하기 때문에 분석이 안되지만 ncc에서는 컴파일된 결과를 이용하므로 dcache_lock 변수를 찾을 수 있습니다.
- User-Mode Linux
http://en.wikipedia.org/wiki/User-mode_Linux
위키백과사전에서 조금 더 자세한 항목을 볼 수 있습니다. 아마존에서는 UML의 개발자 Jeff가 쓴 User Mode Linux라는 책도 나와있습니다.(서평을 보면 찬반이 나뉘어있습니다. 이미 UML에 익숙한 사용자를 대상으로 한 것이라서 입문자가 보기엔 적합하지 않다고 합니다)
UML은 커널 패치의 형태로 제공되었었는데, 커널 2.6에서는 완전히 포함되어 있습니다.
UML 커널을 설정하고 싶다면 [make mrproper ARCH=um], 빌드는 [make bzImage ARCH=um]과 같이 사용하면 됩니다. 간단하죠?
이 UML을 활용해서 실행되는 리눅스 환경을 만든 것이 있는데, 그중에 하나가 coLinux입니다.
coLinux는 윈도우 환경에서 하나의 프로세스로 리눅스를 부팅합니다. VMware 같은 것이 호스트머신과 게스트머신을 분리하는 것이라면 coLinux는 UML이고, 하나의 윈도우 프로세스이므로 호스트PC와 모든 자원을 공유합니다.
그러니까, 리눅스 커널에서 윈도우의 리소스를 공유하는 것도 가능합니다.(리눅스 상에서야 당연한 일이구요)
http://www.colinux.org/?section=screenshots
coLinux 홈페이지의 스크린샷을 보면 Knoppix를 하나의 윈도우 프로세스로 실행하고 있는 화면을 볼 수 있습니다. 화면에 떡하니 윈도우 작업 관리자가 떠있죠. :)
조금 다른 이야기지만 앞으로의 가상화 기술은 모두 이와 비슷합니다. 사용자 영역과 커널 영역을 나눈 것처럼 호스트PC 영역과 게스트PC 영역을 나누고, 이 둘간에 인터페이스에 해당하는 하이퍼바이저를 두게 됩니다.
그런 개념으로 나왔던 제품들이 VMware ESX Server 같은 것이었고, 지금은 커널 2.6.20에 포함된 KVM(Kernel VIrtual Machine)과 응용프로그램으로 개발되고 있는 Xen이 있습니다.
KVM은 CPU에서 제공하는 가상화 기술을 이용합니다. 인텔과 AMD CPU에서 제공하는 기술이며, 이런 가상화 기술은 펜티엄4 이후의 CPU에 포함되어 있습니다. 그러니, P4 이후의 CPU에서만 사용할 수 있습니다.
Xen은 CPU 가상화기술과 관계없이 구현되는 2세대 가상화기술입니다.
http://uml.jfdi.org/uml/Wiki.jsp?page=Main
이곳을 보면 UML을 이용해서 전용서버 호스팅을 제공하는 방법도 소개되어 있습니다.
KLDP에 UML 번역이 있으니 참고하기 바랍니다.
http://wiki.kldp.org/wiki.php/UserModeLinux
IBM DeveloperWorks에도 UML 관련 글들이 있으니 참고하면 좋습니다.
다음으로 소개하는 것은 아직은 커널 패치 형태로만 제공되는 KML입니다.
KML은 Kernel Mode Linux의 약자입니다. 커널 영역에서 실행되는 프로그램을 작성하기 위해 커널 모듈을 개발해왔는데, 사용자 응용프로그램을 커널 영역에 올려서 실행해버리겠다는 것입니다.
그러니까, 시스템 호출을 완전히 제거해 버리는 겁니다.
http://web.yl.is.s.u-tokyo.ac.jp/~tosh/kml/
역시 오픈소스로 공개되어 있고, 일본에서 만들었습니다. 개발시기 때문에 2.4 후반을 기준으로 나오고, 그 이후에는 2.6 기준으로 나오고 있습니다. 최근에 업데이트된 것은 2.6.19 커널에 대한 패치를 제공합니다.
- Kernel Mode Linux
http://www.linuxjournal.com/article/6516
GPL 라이선스에 대해
커널 소스는 GPL이며, GPL 라이선스의 코드를 일부 가져다 쓰거나 수정한 경우, 해당 코드 역시 GPL 라이선스를 따라야 합니다. 위키백과사전의 GNU 항목을 인용합니다.
“만일 어떤 소프트웨어를 GPL의 규준 밑에 둘 경우, 원래의 소프트웨어를 바탕으로 발전 혹은 변경된 소프트웨어들은 다시 GPL의 규준 밑에서 자유로운 사용 및 배포가 가능하게 된다. 이와 같은 저작권의 상호 보장 방법을 저작권 증여 (Copyleft)라 부르고 있다.”
- 한글위키백과사전 GPL 中(http://ko.wikipedia.org/wiki/GPL)
KML의 개발자가 리눅스 저널에 직접 글을 쓴 것도 있습니다.
KML의 핵심아이디어는 TAS를 사용합니다. 안정성이 보장되어야하므로 형을 지원하기 위해 TAS(Typed ASsembly)를 사용합니다. 그리고, C 언어 프로그램이 반드시 사용하는 libc를 패치해서 libc를 커널 영역에 올려버립니다.
libc에 대한 패치도 제공했었는데, 지금은 그런 패치가 사라졌네요. libc 패치를 안해도 되게 된건지는 모르겠네요.
또 하나는 커널 영역과 사용자 영역의 전환에 따라 스택도 교환을 해야하는데, 커널 영역에서 실행하므로 커널 스택을 그대로 사용합니다. 그래서, 이런 부분도 수정을 합니다. 보다 자세한 것은 홈페이지를 읽어보면 될 것 같습니다.
홈페이지에 2.6.12-mm2에 대한 KML 패치가 있는데, 이게 가장 초기 구현입니다. 나머지는 버전이 올라가면서 변화하고 있네요.
꾸준히 업데이트되고 있는데, 나중에는 커널에 KML이 포함될지도 모르죠...
시스템 호출의 부하를 제거하고, 커널 영역에서 빠르게 실행되는 프로그램을 제작하고 싶다면 UML과 KML을 살펴볼 것을 권합니다. 어렵게 커널 모듈을 개발하는 것 보다는 나을 겁니다.
네트워크 관련 프로그램을 작성한다면 성능 향상이 꽤 있을 걸로 예상됩니다.
네트워크 패킷의 수신 처리는 커널 영역에서 이뤄집니다. 데이터를 커널 영역에서 처리하고, 처리가 끝나고 응용프로그램에 전달하기 위해서는 사용자 영역으로 데이터를 복사해야 하죠.
커널 영역에서 실행하면 이런 데이터 복사에 따른 부하가 사라지게되니 처리율이 올라갈 겁니다.
예를 들어, 단시간에 많은 데이터를 크롤링해서 처리해야하는 웹 크롤러가 커널 영역에서 실행된다면 어떨까요? :) 실제로, 성능향상을 이유로 커널 영역에 네트워크 관련 프로그램을 올린 사례가 있습니다. 리눅스 커널은 방화벽과 관련된 기능을 효율적으로 하기 위해 커널에 넷필터를 추가하고, 사용자 영역에서 넷필터를 조작하기 위해 iptables 명령을 추가했습니다. 윈도우의 경우 웹서버가 효율적으로 사용자 요청을 처리할 수 있도록 HTTP.SYS가 커널 영역에서 동작하게 했습니다.(HTTP.SYS는 윈도우 서버 2003에서 HTTP 요청을 커널 영역에서 처리하기 위해 만든 커널 모드 드라이버입니다. IIS 5.0 이하에서 사용되는 HTTP.SYS는 사용자 모드 드라이버로 사용자 영역에서 수행됩니다)
리눅스 커널 레벨에서 웹서버의 역할을 수행하는 kHTTPd가 있기도 합니다. 이는 커널 2.4에 포함되었으나 2.5.30 이후버전에서는 제거되었습니다.
또 하나는 지하철 같은 곳을 다니면서 보면 TV로 광고하는 것을 볼 수 있는데 가끔 오류가 뜨는 것을 볼 수 있죠.
오류가 뜨면 사람이 직접 개입해야 합니다. 대부분 윈도우 환경인데, 리눅스 환경도 가능합니다.
UML을 사용한다면 해당 프로세스만 모니터링해서 프로그램이 특정 메시지에 응답하지 않는다면 프로그램에 오류가 발생한 것으로 보고 커널을 재시작시키면 되지 않을까하는 생각도 해봅니다. 그렇다면 시스템이 중단되는 오류가 발생해도 단순히 하나의 프로세스를 재시작하면 되는 것이니...
스마트폰 같은 환경에서 GUI와 관련된 부분들을 커널 영역에 올린다면 반응속도도 꽤 빨라지지 않을까요. KML인데, ARM용으로 패치가 나와있지는 않은데, 기존 소스를 분석해서 ARM 용으로 포팅하는 것도 그렇게 어려울 것 같지는 않습니다. 어떤가요??
UML과 KML, 모두 알아두면 좋습니다.