데비안에서 User Mode Linux 사용하기 - 한빛출판네트워크
데비안에서 User Mode Linux 사용하기
사용자 모드 리눅스(User Mode Linux, UML)는 리눅스 커널을 하나의 프로세스로 실행하는 것을 말합니다. 그렇지만 UML은 단순히 프로그램을 실행하는 것과는 다릅니다. VMware 같은 가상 머신 소프트웨어를 이용해서 리눅스를 실행하는 것과 같습니다. 차이점은 VMware 같은 에뮬레이션 환경이 아닌 하나의 프로세스로 실행한다는 점이 다릅니다. 프로세스로 실행하면 얻을 수 있는 장점은 무엇인가요? 커널 자체를 테스트하는 것을 쉽게 할 수 있고, 커널 자체를 디버깅할 수 있습니다. 커널 디버거들은 지금까지 여러가지가 있었습니다. kgdb 같은 것들도 있었지만 두대의 PC가 필요하고 시리얼 통신으로 연결을 설정해야 하는 작업 같은 게 필요했습니다. gdb를 사용해서 UML을 실행할 수 있고 원하는 함수에 중단점을 설정할 수 있으며 상태를 손쉽게 추적할 수 있습니다.
UML은 가상 머신을 실행하는 것과 같습니다. 따라서 첫번째는 UML로 리눅스 커널을 빌드하는 작업이 필요하고, 두번째는 가상 머신이 사용하는 가상 하드 디스크처럼 UML에서 사용할 가상 하드 디스크 이미지를 만들어야 합니다. 이를 루트 파일 시스템이라 부릅니다. 임베디드 환경에서 사용하는 것과 같습니다.
"UML을 사용하는데 왜 하필이면 데비안이죠?" 라고 물을 수 있습니다. 첫째는 데비안에서는 UML을 빌드할 필요가 없습니다. 패키지 형태로 설치해서 사용할 수 있습니다. 여기서는 커널 소스에서 빌드하는 방법도 다룹니다. 둘째는 데비안에서 루트 파일 시스템을 빌드할 수 있기 때문입니다. 페도라 코어를 사용하고 있다면 만들어진 루트 파일 시스템을 인터넷에서 찾아봐야 합니다.
UML은 오픈소스 프로젝트로 시작했으며 커널 2.4까지는 커널 패치 형태로 존재했으고 커널 2.6에는 완전히 포함되었습니다. 따라서 여기서는 현재 커널 2.6.20을 사용합니다.
커널 2.4에 대한 패치는 http://user-mode-linux.sourceforge.net에서 찾아볼 수 있습니다. 현재 인터넷에 나와 있는 문서들은 커널 2.4.x를 기준으로 되어 있어서 오래된 것들이고, 커널 2.6에 맞게 된 내용들은 거의 없어보입니다.
커널 2.6.20을 다운로드 받아서 압축을 푼 후에 다음 명령을 실행합니다. ARCH 옵션은 커널의 아키텍처를 설정하는 것이며 UM은 User Mode를 의미합니다.
환경 설정을 하게 되면 UML 전용의 메뉴들을 볼 수 있고, 설정할 수 있습니다. 일반적인 커널 설정 화면과는 차이점이 있습니다.
설정이 끝난후에 빌드 과정은
명령으로 빌드하면 되고 빌드 후에는 커널 소스 디렉터리에 linux 라는 실행 파일이 생성됩니다. UML은 리눅스 커널을 프로세스로 실행하는 것이므로 이는 당연합니다.
만약, 예전에 커널을 빌드했던 곳에서 UML 빌드를 하게 되면 asm 디렉터리의 헤더 파일 내용이 하나도 맞지 않으므로 빌드 에러가 발생합니다. 반드시 커널 소스를 새로운 디렉터리에 풀고 그곳에서 환경 설정 및 빌드를 합니다.
모듈 빌드도 마찬가지로
명령으로 하면 됩니다.
그런데 임베디드 환경을 보면 커널 이미지를 받고 해당 커널 이미지를 띄우기 위한 루트 파일 시스템을 임베디드 보드에 올리는 작업을 합니다. UML이 리눅스 커널을 프로세스로 실행하는 것이지만 하나의 커널이기 때문에 VMware에서 사용하는 가상 하드 디스크처럼 root_fs이 필요합니다. root_fs이 없다면 만들거나 인터넷에서 필요한 것을 다운로드 해야합니다. root_fs이 페도라 코어 5용으로 공개된 것이 있는데 압축해서 125M나 됩니다.
그러니까 이 이후부터는 흔히 말하는 삽질의 연속이 됩니다.
데비안의 장점은 패키지로 편하게 설치할 수 있고, 이런 삽질을 하지 않아도 된다는 점입니다. 이제 "데비안스럽게" 시작해봅시다. 물론 앞에서 커널을 받아서 빌드한 실행 파일 linux는 계속 사용해도 되고 안해도 됩니다. 그건 여러분 마음입니다.
이제 소스 빌드없이 데비안에서 UML을 사용하는 방법을 소개합니다.
1. UML을 설치한다.
데비안을 사용하고 있다면 커널 소스 코드를 받지 않고 직접 UML을 설치하는 것도 가능합니다.
명령을 실행하면 설치가 되며, /usr/bin/linux -> /usr/bin/linux.uml 파일이 설치되어 실행됩니다. 미리 빌드된 데비안의 UML을 쓰거나 앞서 커널 빌드에서 만든 linux를 사용해도 됩니다. 선택은 자유입니다.
커널을 수정했거나 커널을 디버깅하고 싶다면 직접 빌드한 리눅스를 쓰는 것이 좋습니다. 앞에서 빌드 과정을 소개한 것도 이 때문입니다.
2. root fs 만들기
dd if=/dev/zero of=/mnt/root_fs bs=1024K count=500
count 값을 500으로 설정했으니 500M의 공간이 만들어집니다. 루트 파일 시스템으로 사용할 이미지 파일을 만들었으니 원하는 파일 시스템으로 포맷을 합니다. 여기서는 EXT3 파일 시스템으로 포맷합니다
mkfs -t ext3 /mnt/root_fs
경고가 나타나지만 Y만 선택하면 됩니다.
이미지 파일을 하나의 디렉터리로 마운트하기 위해 다음 작업을 합니다.
mkdir /mnt/um
mount -o loop /mnt/root_fs /mnt/um
-o loop는 루프백 디바이스로 마운트하라는 것으로 ISO 파일이나 하드 디스크 이미지를 마운트하기 위해 종종 사용합니다. 다음은 완전히 부팅되는 데비안 이미지를 만드는 것인데, 데비안에서는 이를 위해 편리한 명령을 제공합니다.
명령으로 데비안 부트스크랩 패키지를 설치하고
debootstrap --arch i386 etch /mnt/um http://ftp.kr.debian.org/debian
명령을 실행하면 데비안 미니 설치 과정에서 보았던 최소 설치된 데비안이 부팅되는 이미지가 생성됩니다. etch 라는 코드명을 사용한 것은 현재 testing 배포판을 사용하기 때문이고, 자신이 사용하는 배포판의 종류에 따라 sid, sarge를 설정할 수도 있고, 우분투 Breezy 사용자라면 breezy도 가능합니다. 물론 우분투 사용자는 다운로드 소스를 우분투리눅스로 변경해야합니다. 해당 URL은 /etc/apt/sources.list에 있는 것을 사용하면 되니, 정확한 주소는 자신의 시스템에 있는 sources.list 파일을 참고하면 됩니다. 이제 부트스트랩 이미지가 만들어졌으면 몇가지 수정을 해줘야합니다. 부트스트랩 이미지는 말 그대로 설치 작업을 위한 이미지라서 설정 정보가 하나도 들어있지 않습니다.. 먼저 /mnt/um/etc/fstab 파일을 만들어서 마운트 정보를 추가합니다.
/mnt/um/etc/hostname 파일도 수정해서 다른 호스트이름을 부여해야 합니다. 제 경우엔 호스트 PC의 이름이 curl이므로
curl-uml0
로 이름을 수정했습니다. /mnt/um/etc/hosts 파일에는 다음 내용을 추가
/mnt/um/etc/securetty 파일에는 다음을 추가
/mnt/um/dev 디렉터리로 이동해서 UML에서 사용할 디바이스 명을 생성합니다.
cd /mnt/um/dev
/mnt/um/etc/inittab 파일의 끝 부분을 다음과 같이 수정합니다.
실행레벨 2~6까지는 모두 주석처리하는 것이고, 첫번째는 tty1로 되어 있는 것을 tty0로 수정하는 것이 전부입니다. 여기까지 진행했으면 다음은 root 비밀번호를 설정합니다.
cd /mnt/um
chroot 명령을 실행하면 현재 사용중인 시스템 정보가 아니라 /mnt/um을 루트 디렉터리로하는 시스템 정보를 사용하게 됩니다.
명령으로 root 계정의 비밀번호를 설정합니다. chroot 명령을 실행한 다음이므로 현재 시스템이 아닌 /mnt/um을 루트 디렉터리로 하는 시스템에서의 root 비밀번호 설정이니 안심해도 됩니다.
명령으로 일반 사용자 계정을 추가합니다. UML에서는 root 사용자 로그인이 바로 안되니 일반 사용자 계정으로 로그인하고, su 명령으로 root가 되어야 합니다.
여기까지 했으면 UML을 사용할 준비는 끝났습니다.
명령으로 디렉터리 위치를 변경하고
umount /mnt/um
명령으로 마운트를 해제하고 앞에서 apt-get install user-mode-linux 명령으로 설치했던 /urs/bin/linux를 실행해서 UML을 시작할 수 있습니다.
linux ubd0=/mnt/root_fs
메모리 크기를 설정하고 싶다면
linux ubd0=/mnt/root_fs mem=128M
과 같이 실행하면 됩니다. 데비안의 linux 대신에 앞에서 빌드한 linux를 이용하고 싶다면
/usr/src/linux-2.6.20/linux ubd0=/mnt/root_fs mem=128M
이와 같이 실행하면 됩니다. 실행하면 실제 리눅스를 부팅하는 화면이 나타나고, 실제 리눅스 로그인 화면까지 나타나는 것을 볼 수 있습니다. 모니터링은 호스트와 게스트 사이에 특별한 소켓이 생성되는데, uml_mconsole에서 이 소켓명을 적어주는 것으로 통신할 수 있습니다. uml_mconsole은 UML 커널의 시작, 중지 등을 제어할 수 있고, uml_switch는 UML 간의 네트워크 스위치를 만드는 작업을 수행합니다. 가상 네트워크 구축을 위해 활용할 수 있습니다. 커널 디버깅을 하려면
명령을 실행하고
gdb>r udb0=/mnt/root_fs mem=96M
명령을 실행하면 됩니다.
아니면, DDD나 Insight를 사용해서 디버깅하는 것도 가능합니다. 커널을 직접 빌드하는 경우에 디버깅이 가능하게 하려면 다음 옵션을 선택하면 됩니다.
->Compile the kernel with frame pointers - Enable
->Show command line arguments on the host in TT mode - Disable
이 두가지만 설정하면 됩니다.
이전 글 : 커널에서 CPU 정보 처리하기
다음 글 : JavaFX 스크립트 소개(1)