QEMU를 이용해 커널 이미지 바꿔서 부팅해보기
전가상화를 지원하는 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 값이 내 아이디로 들어간 것으로 보아 커널이 바뀐 것을 확인할 수 있었다.