安装好了一台虚拟机,当然是要访问虚拟机了。小编倾情收集了五种访问qemu虚拟机的姿势,相信总有一款适合你~
图形界面
从最简单和最直观的开始。图形界面和我们平时用的物理机基本没有什么两样。
命令也超级简单,只要输入命令回车后就会直接跳出虚拟机的图形界面啦。
qemu-system-x86_64 -m 4096 -smp 4 \
--enable-kvm \
-drive file=~/guest/fedora.img
就是这么简单~
vnc
图形界面呢挺好的,不过呢必须要求主机的系统上需要有相应的环境,而且你必须得登陆到主机系统上才能这么玩。如果是远端访问的话,就有难度了。
所以通常情况下,会给虚拟机开一个vnc的窗口,这样你身在十万八千里之外,只要网络能连上,就可以访问你的虚拟机啦。是不是很爽?
命令行也是超级简单的,只和图形界面的命令行多了一个命令行的选项。
qemu-system-x86_64 -m 4096 -smp 4 \
--enable-kvm \
-drive file=~/guest/fedora.img \
-vnc :5
这个-vnc :5就表明了使用的是哪个vnc的端口号。
这样你就可以通过各种vnc软件连接你的虚拟机了~看上去和图形界面没什么两样。
ssh – NAT
作为一名专业人员,更多的是用ssh登陆虚拟机的。别问为什么,因为比较cool。相对于对着屏幕点鼠标,敲敲键盘是不是更显专业,哈哈。
扯淡了,回到正题。
在生产环境中,通常使用libvirt来创建虚拟机,所以网络的环境由libvirt负责搭建。在这种情况下,通过ssh访问虚拟机相对方便。而我们想要通过qemu直接搭建环境的话,略有些复杂。但也正好理清libvirt都在后台帮我们做了些什么。
创建网桥和tap接口
你可以想象网桥是一个虚拟的交换机,而tap接口就是在这个虚拟交换机上用来和虚拟机连接的那个口。虚拟机就通过这么一个连接的方式和主机连接。
创建网桥,名字是virbr0
sudo brctl added virbr0
sudo ifconfig virbr0 192.168.122.1 net mask 255.255.255.0 up
创建tap接口,名字为tap0,并添加到网桥
sudo tunctl -t tap0
sudo ifconfig tap0 0.0.0.0 up
sudo brctl addif virbr0 tap0
让虚拟机使用tap0作为网络设备启动
好了,这就相当于给虚拟机插根网线连上我们的交换机。
命令行那是非常简单的。
qemu-system-x86_64 -m 4096 -smp 4 \
--enable-kvm \
-drive file=~/guest/fedora.img \
-netdev tap,id=tapnet,ifname=tap0,script=no \
-device rtl8139,netdev=tapnet
差别就在于最后的两行,添加了网络设备的描述。
–netdev 意思是使用哪种网络方式,这里是用的tap方式,并且指定主机上设备名为tap0, 也就是我们刚才创建的设备。
–device 意思是给虚拟机装哪个网卡,就像你自己机器上装Intel的网卡还是Mellanox的网卡是一个意思。特别之处在于这个设备使用的是tapnet,也就是上一个选项指定的网络模式。
虚拟机內配置相应的ip地址
正常情况下虚拟机內获得的ip地址不一定是准确的,所以需要配置。只要配置成和主机上的网桥在同一网段即可。
sudo ifconfig ens3 192.168.122.100 netmask 255.255.255.0 up
当然为了不用每次都配置,个人使用可以使用静态地址。企业或者生产环境使用就要架dhcp服务了。
从主机访问虚拟机的ip地址
一切准备就绪~可以从主机上通过ssh访问虚拟机啦~
ssh root@192.168.122.100
注:有时候这样会遇到connection refuse的错误提示。这是因为虚拟机內sshd的服务没有开。可以在虚拟机內执行 service sshd start,来开启sshd服务。
再注:记得把防火墙上ssh的端口打开。
ssh – Bridge
这个版本和上面的版本是非常类似的。都是在主机上创建一个网桥,把虚拟机连接到这个网桥上。但是上面使用的网桥是主机內的,这次我们要创建一个外面看得见的网桥。
这两种方式都各有什么利弊呢?
- 第一种方式对外屏蔽了虚拟机,有的时候你需要这么做,因为你不想让外界知道你这里还有一台虚拟机。这样你的工作就不受外界干扰,减少被攻击的可能。
- 另外第一种方式也适用于公网地址不够的情况。比如你的运营商只能给你固定个数的ip地址,你就没有办法让所有虚拟机都获得公网ip地址。
- 第二种方式的好处是从外界可以直接访问虚拟机,而不需要先登录到主机再访问。方便。
- 另外,虚拟机上的所有服务也可以直接从外界访问了。
究竟选择怎么样的连接方式,取决于实际情况和部署需求。
这两个方式配置上只有在创建网桥的时候有差别,其余的步骤方法是都一样的。 所以下文只描述了创建网桥的步骤,其余就不赘述。
创建和外界连通的网桥
创建外界连通的网桥可以通过配置文件,这样保证了每次重启依然有效而不需要再次手动配置。当然每个版本的配置方式稍微有点区别。这里仅列出一种实测过的方式,不同的发行版请查阅相关文档。
在Ubuntu 15.10上,创建此网桥的方式为/etc/network/interfaces上改成如下:
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports eth0
简单解释:
- br0是这次创建的对外连接的网桥名字
- eth0就是原本主机上与交换机连接的接口。在你的环境中可能会有不同,请找到你希望对外连接的那个接口。
启动虚拟机
还是按照上文中的方法,创建tap0并加入网桥后,就可以启动虚拟机了。
qemu-system-x86_64 -m 4096 -smp 4 --enable-kvm \
-drive file=~/guest/fedora.img \
-netdev tap,id=tapnet,ifname=tap0,script=no \
-device rtl8139,netdev=tapnet,mac=52:54:00:12:34:57
启动的命令行和上一个方式是一模一样的,不过这次我添加了mac地址的参数。如果不添加mac地址的参数,当有多台虚拟机的时候,网络通信就会有问题。这个问题在NAT的组网方式下同样存在,也需要注意。
console
好了,现在这个“远古”的东西要出现了。你问有了前面几种的登陆方式不好吗,干嘛还要用这个。
上面几种方式已经足以满足日常使用,但是对于一名系统级发烧友来说,还是差了那么一点火候。比如在关键的时刻,有串口的信息在调试的时候是非常重要的。说到最后其实这是一个程序员的自我修养~
命令行也是非常非常简单的。
qemu-system-x86_64 -m 4096 -smp 4 \
--enable-kvm \
-drive file=~/guest/fedora.img \
--nographic
这样就直接在当前的窗口显示串口信息了。关键的参数就是那个 – nographic。
当然还可以用这个命令。
qemu-system-x86_64 -m 4096 -smp 4 \
--enable-kvm \
-drive file=~/guest/fedora.img \
-serial telent:localhost:4321,server,nowait
这样呢,你既可以有一个图形的界面显示虚拟机,又可以通过访问localhost 4321的端口查看虚拟机的串口信息。
真是想用哪个用哪个~
虚拟机內的配置
能够访问到虚拟机内部的串口信息,除了qemu命令行本身需要稍作改动,还有重要的是虚拟机內的配置。
按照我的理解主要是配置两个方面:
- 给虚拟机内核传入串口配置的参数
- 启动虚拟机中串口的服务
具体来说,对Fedora23我参照了Serial console setup on Fedora 20中的配置。总结下来有两步:
第一步在 /etc/default/grub 文件末尾增加如下几行(注意,原文中有一处可能因为显示原因,看着和实际的不一样)
GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyUSB0"
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --partiy=no --stop=1"
第二步执行
grub2-mkconfig -o /boot/grub2/grub.cfg
使更新生效。
Well, 有了这么多招数,到时候爱用哪个用哪个。
如果你有新的招数,也欢迎告诉我~