访问qemu虚拟机的五种姿势

安装好了一台虚拟机,当然是要访问虚拟机了。小编倾情收集了五种访问qemu虚拟机的姿势,相信总有一款适合你~

图形界面

从最简单和最直观的开始。图形界面和我们平时用的物理机基本没有什么两样。

Fedora Login

命令也超级简单,只要输入命令回车后就会直接跳出虚拟机的图形界面啦。

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软件连接你的虚拟机了~看上去和图形界面没什么两样。

VNC access

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, 有了这么多招数,到时候爱用哪个用哪个。
如果你有新的招数,也欢迎告诉我~

没有更多推荐了,返回首页