网上关于如何使用qemu启动虚拟机的文章多了去了,但都是启动ubuntu,fedora, windows之类现有的系统,如何启动一个新的系统呢?比如YunOS,或者自己编译的LFS,或者其它不常见的系统,这是文本主要研究内容。
开发环境ubuntu14.04,qemu版本2.6,guest os为YunOS yunhal,x86,kernel-4.4.27。
一、编译qemu
在实现自定义virtio设备之前,qemu都可以从官网上下载编译好的。建议使用qemu-2.5以及之上的版本,因为有virtio gpu,guest os可以使用host os中的物理gpu,画图效果会好很多,具体在第七章说明。
如何编译:http://www.cse.unsw.edu.au/~plinich/build_qemu_on_macosx.html
因为我的机器已经有了zlib,glib之类的依赖,所以我这边是直接下载qemu代码,然后编译的:
# 下载qemu代码会很慢...
git clone git://git.qemu-project.org/qemu.git
# 使用2.6版本代码
git checkout remotes/origin/stable-2.6
# target为x86和x86_64,不需要arm
./configure --prefix=~/qemu --target-list="i386-softmmu x86_64-softmmu"
make
make install如果configure失败,慢慢安装各种依赖吧。
二、系统镜像
既然我们需要启动系统的镜像,那么首先需要了解一下系统的镜像。
常见启动命令
1、qemu-system-i386 -hda disk.img
bootloader,kernel,ramdisk,rootfs什么的都在一个文件里面,这个文件是磁盘的镜像,比如virtualbox的vdi文件,或者iso文件。
2、qemu-system-i386 -kernel bzImage -hda system.img
kernel和rootfs是独立的文件,而且没有ramdisk,不要在意bootloader,因为qemu可以直接启动kernel了,还要bootloader干啥
3、qemu-system-i386 -kernel bzImage -initrd ramdisk.img-hda system.img
kernel、ramdisk、rootfs都是独立的文件,有ramdisk
常见问题
1、只有boot.img和system.img,kernel和ramdisk从哪得到呢
如果boot.img-ramdisk.gz大小为0,说明没有ramdisk,如果不为0,可以解压ramdisk:
cp boot.img-ramdisk.gz ramdisk.img
mkdir ramdisk && cd ramdisk
gunzip -c ../ramdisk.img | cpio -ivmd
打包ramdisk:
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../ramdisk.img
另外需要注意boot.img-cmdline文件,是bootloader传给内核的参数,YunOS yunhal的boot.img-cmdline为:
$ cat boot.img-cmdline
loglevel=5 androidboot.hardware=cht_hr firmware_class.path=/system/etc/firmware bootboost=1 \
pm_suspend_debug=1 memmap=4M$0x5c400000 intel_pstate=disable vga=current i915.modeset=1 \
drm.vblankoffdelay=1 i915.fastboot=1 thermal.off=1 console=ttyS0,115200n8 \
pstore.backend=ramoops enforcing=0 androidboot.selinux=permissive