전가상화를 지원하는 QEMU는 게스트 커널을 수정하지 않고 띄울수 있다는 장점이 있지만 virtio 같은 최적화 옵션을 사용하려면 커널의 일부 수정이 필요하다. 기존에 게스트 이미지에 내장된 커널을 수정하는 방법으로 가장 쉽게 떠올릴 수 있는 것은 게스트를 띄운 다음 이 안에서 커널 코드를 수정하고 빌드하는 것인데 답답한 게스트의 성능때문에 오래 걸리고 답답하다.


QEMU에서는 이런 점을 고려해서 파라미터를 이용해 사용할 커널 이미지를 지정할 수 있도록 만들었다. 개발자는 호스트 PC 환경에서 게스트에서 사용할 커널 이미지를 빌드한 후 스크립트에 -kernel 파라미터로 지정하면 된다. 


#!/bin/bash
DISK_PATH=.

qemu-system-x86_64 \
        -cpu host \
        -smp 8 \
        -enable-kvm -m 2048 \
        -kernel ./bzImage \
        -append "root=/dev/vda1 console=ttyS0" \
        -drive file=${DISK_PATH}/ubuntu.qcow2,cache=none,if=virtio \
        -display gtk \


위 스크립트에서 -append라는 옵션이 보이는데 이건 커널의 커맨드라인(cmdline)으로 들어갈 스트링을 지정할 수 있는 파라미터다. 새로 빌드한 커널에는 CONFIG_VIRTIO_BLK 옵션을 넣었기 때문에 커널에서 마운트할 디바이스의 이름(/dev/vda1)를 이곳에 기입했고 console로 시리얼 값을 보기 위해 ttyS0 옵션을 넣었다. 이게 없으면 따로 커널 코드에 넣지 않는 이상 마운트하다가 죽는다.


위의 올린 스크립트를 이용해 실행해보니 부팅이 정상적으로 된다. VIRTIO_BLK 옵션이 들어가서 그런지 예전보다 부팅이 조금 빨라진 것 같았다. 그래도 커널이 정상적으로 바뀌었는지 'uname -r' 명령어로 확인해봤다. Makefile에 넣은 EXTRAVERSION 값이 내 아이디로 들어간 것으로 보아 커널이 바뀐 것을 확인할 수 있었다.




'컴퓨터공부 > 가상화기술' 카테고리의 다른 글

Virtio Block 성능 세부 분석  (0) 2019.05.20
Virtio Block 성능 벤치마크  (0) 2018.12.23
QEMU를 이용해 커널 이미지 바꿔서 부팅해보기  (0) 2018.12.20
kvm ioeventfd  (0) 2018.08.11
kvm irqfd  (0) 2018.08.11
vhost  (0) 2018.07.08

커널은 크게 커널 내에 넣는 feature의 양에 따라 모놀리식(Monolithic) 커널과 마이크로(Micro) 커널로 나눌 수 있다.



위 구조를 이해 할 때 통념을 좀 깨야 할 필요가 있었다. 

나는 너무도 당연히 kernel이 device driver나 File system을 관리 한다고 생각했는데 꼭 그런 것 만은 아니었다.


모놀리식 커널은 리눅스로 OS를 배운 학부생에게 가장 익숙한 OS이다. Application을 제외한 모든 system 관련 기능들(VFS, IPC, Filesystem 등등)을 커널이 관리하며 각 영역들은 단계적으로 나뉘어 있다. 생각해보면 리눅스 프로세스 하나를 만들 때 VFS에서 제공하는 fopen 라이브러리를 이용해 다른 파일 시스템에 쉽게 접근이 가능했고, IPC를 이용해 다른 프로세스에게 메시지를 전달 하는 것도 척척 해낼 수 있었는데 위 모든것은 커널의 system call을 이용해 했던 방식 들이었다. 커널이 모든 시스템 서비스들을 관리 했기 때문에 개발자는 커널이 제공하는 함수만 사용해서 쉽게 할 수 있었다. * 대표적인 예로는 Unix, Linux가 있다.


하지만 마이크로 커널은 마이크로라는 접두어에서도 의미하듯 핵심적인 기능(스케줄링, 메모리 관리 등등)만 커널에 담고 나머지는 제외해 가볍게 만든 커널이다. 기존에 모놀리식 커널이 갖고 있던 시스템 기능들(VFS, IPC, Device driver)은 커널위의 서버의 형태로 존재한다(위 개념을 받아들이는게 좀 충격이었다). 이러한 방식이 장점의 장점은 하나의 서비스가 죽더라도 커널 전체가 panic되지는 않다는 점이다. 예를들어 Device Driver 하나가 죽더라도 전체 커널이 죽는 일은 없다. 리얼 타임성이 중요한 임베디드 시스템에서 주로 사용된다. * 대표적으로 MacOS X, Windows NT가 있다.


(마이크로에서 특이한 점은 File system이나 Driver가 유저 스페이스에 들어간다는 점!)



각 구조마다 장 단점이 있다.


모놀리식 커널

  • 장점 : 각 Component간의 커뮤니케이션이 효율적이다.
  • 단점 : 디바이스 드라이버를 추가/삭제 하려면 커널을 재빌드 해야 한다. 또한 하나가 죽으면 전체 시스템이 죽는다.
마이크로 커널
  • 장점 : 서버를 추가하는 방식이기 때문에 기능을 추가하기 쉽고, 시스템이 견고하며 리얼타임성이 높다
  • 단점 : 시스템 기능들이 서버의 형태로 존재하기 때문에 커뮤니케이션 오버헤드가 있다.

위 두가지를 짬뽕한 구조가 모듈형 커널이라 한다. 쉽게 모듈의 형태로 쉽게 시스템 기능을 추가 할 수 있는 방식인데 윈도우가 가장 대표적이다. 다음에는 모듈형 커널에 대해서 공부해봐야겠다.

  1. 동서방불패 2017.08.02 14:41  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다.