Host: Ubuntu 16.04
QEMU v5.1.0
Guest: Ubuntu 16.04
~/workspace$ wget https://download.qemu.org/qemu-5.1.0.tar.xz
~/workspace$ tar xvJf qemu-5.1.0.tar.xz
~/workspace$ mkdir build && cd build
~/workspace/build$ ../qemu-5.1.0/configure --enable-kvm --target-list=x86_64-softmmu
其中,配置选项--enable-kvm
表示让QEMU支持kvm;
选项--target-list=<架构名>
表示准备编译哪一种CPU架构的QEMU,‘x86_64-softmmu’表示目标为x86 64位的CPU;
选项--enable-debug
用来使能debug QEMU;
在配置QEMU时,若运行
~/workspace/build$ ../qemu-5.1.0/configure
不带任何选项的话会很慢,因为它会配置所有支持的CPU架构,且编译时也会把所有配置了的架构都编译一遍。
~/workspace/build$ make -j4
此时QEMU编译完成,并在‘build/x86_64-softmmu/’ 目录下生成了可执行文件qemu-system-x86_64
。
若要将QEMU安装到host系统环境中,还需要执行
make install
命令。
首先使用qemu-img
创建一个虚拟机镜像文件;然后利用guest操作系统的ISO文件将guest OS安装到虚拟机镜像文件中。
参考命令如下:
~/workspace$ ./build/qemu-img create -f qcow2 test.qcow2 16G
~/workspace$ ./build/x86_64-softmmu/qemu-system-x86_64 -m 2G -drive format=qcow2,file=test.qcow2 -cdrom ubuntu16.04-Desktop-x86_64.iso
第一个命令qemu-img
创建了一个大小为16G、格式为qcow2的虚拟机镜像文件“test.qcow2”,其中选项-f
用于指定镜像文件的格式;
第二个命令则是通过"ubuntu16.04-Desktop-x86_64.iso"文件启动并安装guest操作系统(即Ubuntu16.04);其中选项
-m
用于指定内存大小,
-drive
用于指定镜像文件(可理解为硬盘),
-cdrom
用于指定要载入的外部文件。
~/workspace$ ./build/x86_64-softmmu/qemu-system-x86_64 -m 2G -drive format=qcow2,file=test.qcow2
终端会显示“VNC server running on 127.0.0.1:5900”,
此时打开系统软件“Remmina Remote Desktop Client”即可连接QEMU虚拟机的UI进入Guest OS桌面环境。
在启动QEMU虚拟机时,还可以添加选项-enable-kvm
来启用kvm模式:
~/workspace$ ./build/x86_64-softmmu/qemu-system-x86_64 -enable-kvm -m 2G -drive format=qcow2,file=test.qcow2
若主机是AMD
的CPU,使用该命令可能会报如下错误:
qemu-system-x86_64: error: failed to set MSR 0xe1 to 0x0
qemu-system-x86_64: ~/workspace/qemu-5.1.0/target/i386/kvm.c:2713: kvm_buf_set_msrs: Assertion `ret == cpu->kvm_msr_buf->nmsrs' failed.
Aborted (Core Dump)
解决办法 [1]:
创建配置文件/etc/modprobe.d/qemu-system-x86.conf
后重启主机,具体命令如下:
$ sudo tee /etc/modprobe.d/qemu-system-x86.conf << EOF
>options kvm ignore_msrs=1
>EOF
$ sudo reboot
首先通过上面的VNC连接模式进入虚拟机,然后修改Guest OS中的grub启动配置,具体为/etc/default/grub
文件中的GRUB_CMDLINE_LINUX=""
这一行[2]:
$ sudo vim /etc/default/grub
将 GRUB_CMDLINE_LINUX="" 修改为 GRUB_CMDLINE_LINUX="console=ttyS0"
然后保存并退出
$ sudo update-grub
记得修改完后要运行sudo update-grub
命令更新grub来使得上述修改生效。
此时关闭Guest OS虚拟机,运行QEMU启动命令(带上选项-nographic
)来启动即可在当前终端下显示并登陆Guest OS:
~/workspace$ ./build/x86_64-softmmu/qemu-system-x86_64 -nographic -enable-kvm -m 2G -drive format=qcow2,file=test.qcow2
Ubuntu 16.04.6 LTS test-PC ttyS0
test-PC login: test
Password:
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.15.0-45-generic x86_64)
387 packages can be updated.
332 updates are security updates. ...
test@test-PC:~$
这里有一个不足:所有类型的文件没有颜色高亮的区分,比如
ls /
显示的文件夹和文件是相同颜色。
解决terminal下Guest OS中的不同类型文件没有颜色高亮,办法就是在Guest OS中启用SSH server,然后在Host中ssh连接Guest。
首先,确保Guest OS中安装好ssh server。
test@test-PC:~$ dpkg -l openssh-server
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-============-============-=================================
un openssh-server <none> <none> (no description available)
test@test-PC:~$ sudo apt-get install openssh-server
然后,在Host中另外开启一个终端并ssh连接Guest:
test@ubuntu:~/workspace$ ssh -p 2222 localhost
The authenticity of host '[localhost]:2222 ([127.0.0.1]:2222)' can't be establi.
ECDSA key fingerprint is SHA256:o/93oB5KHutDf3D2BEvKUjMlkaZSwGe7+zles3e5VL8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:2222' (ECDSA) to the list of known host.
test@localhost's password:
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.15.0-45-generic x86_64)
先按ctrl + a 放开后,再按下 x。
这个在运行启动虚拟机的命令后发生卡死现象时特别有用!!
How to start qemu directly in the console (not in curses or SDL)
QEMU Standard Options (master branch version)