客户机安装完成后,需要为其设置网络接口,以便和主机网络,客户机之间的网络通信。事实上,如果要在安装时使用网络通信,需要提前设置客户机的网络连接。
KVM 客户机网络连接有两种方式:
用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整。 虚拟网桥(Virtual Bridge):这种方式要比用户网络复杂一些,但是设置好后客户机与互联网,客户机与主机之间的通信都很容易。本文选用了虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。
本例中 IBM System x3500 有两块千兆以太网卡,一块网卡连接外网的 9.123.99.x 网段,一块网卡连接内网 192.168.0.x 网段。本例采用虚拟网桥的连接方式使客户机能够同时自由访问两个网段。
图 5. IBM System x3500 的网络结构
清单 4. 配置 eth0 设备
编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 文件 注释 BOOTPROTO 增加 BRIDGE=switch
清单 5. 配置网桥 br0
创建 /etc/sysconfig/network-scripts/ifcfg-br0 文件,内容如下: linux-gwsa:~ # cat /etc/sysconfig/network/ifcfg-br0 DEVICE=br0 TYPE=Bridge BOOTPROTO=dhcp ONBOOT=yes 重新启动网络,激活网桥: /etc/init.d/network restart
网桥 br0 应该获得 IP 地址(静态或 DHCP),同时物理的 eth0 必须不配置 IP 地址。重新启动网络后,主机的网络设备列表如清单 6 所示:
清单 6. 主机的网络设备列表
linux-gwsa:~ # ifconfig br0 Link encap:Ethernet HWaddr 00:1A:64:48:87:B6 inet addr:192.168.0.13 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::21a:64ff:fe48:87b6/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:669843 errors:0 dropped:0 overruns:0 frame:0 TX packets:344910 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:113618306 (108.3 Mb) TX bytes:495318687 (472.3 Mb) eth0 Link encap:Ethernet HWaddr 00:1A:64:48:87:B6 inet6 addr: fe80::21a:64ff:fe48:87b6/64 Scope:Link UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:11681269 errors:0 dropped:0 overruns:0 frame:0 TX packets:5505473 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:16627242146 (15856.9 Mb) TX bytes:485265358 (462.7 Mb) Interrupt:16 eth1 Link encap:Ethernet HWaddr 00:1A:64:48:87:B7 inet addr:9.123.99.193 Bcast:9.123.99.255 Mask:255.255.255.0 inet6 addr: fe80::21a:64ff:fe48:87b7/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:5481826 errors:0 dropped:0 overruns:0 frame:0 TX packets:5453113 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:5100133488 (4863.8 Mb) TX bytes:4753271194 (4533.0 Mb) Interrupt:17 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:187412 errors:0 dropped:0 overruns:0 frame:0 TX packets:187412 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:801868898 (764.7 Mb) TX bytes:801868898 (764.7 Mb) linux-gwsa:~ # brctl show bridge name bridge id STP enabled interfaces br0 8000.001a644887b6 no eth0
此外,需要一个包含如下内容的 qemu-ifup 脚本,作为客户机的网络配置脚本。/etc/qemu-ifup是默认的客户机网络配置文件,如果使用其他名字或拷贝到其他位置,请用script=file参数指定。
清单 7. 客户机网络配置脚本
linux-gwsa:~ # cat /etc/qemu-ifup #!/bin/sh echo 'config qemu network with bridge for ' $* bridge=br0 # Exit if $bridge is not a bridge. Exit with 0 status # so qemu-dm process is not terminated. No networking in # vm is bad but not catastrophic. The vm could still run # cpu and disk IO workloads. # Include an useful error message in qemu-dm log file. if [ ! -e "/sys/class/net/${bridge}/bridge" ] then echo "WARNING! ${bridge} is not a bridge. qemu-ifup exiting. \n VM may not have a functioning networking stack." exit 0 fi ifconfig $1 0.0.0.0 up brctl addif $bridge $1 || true
主机上如果有多台客户机使用网络,每个客户机必须有不同的 MAC 地址,所以需要在网络参数中为每个客户机指定不同的 MAC 地址。以下脚本可以自动生成 MAC 地址(执行 Python 脚本需要系统安装了 python 解释器)。
清单 8. 生成 MAC 地址的代码
linux-gwsa:~ # cat macgen.py #!/usr/bin/python # macgen.py script to generate a MAC address for Red Hat Virtualization guests # import random # def randomMAC(): mac = [ 0x00, 0x16, 0x3e, random.randint(0x00, 0x7f), random.randint(0x00, 0xff), random.randint(0x00, 0xff) ] return ':'.join(map(lambda x: "%02x" % x, mac)) # print randomMAC() 生成 MAC 地址的示例: linux-gwsa:~ # ./macgen.py 00:16:3e:51:fb:ce
清单 9. 启动客户机的命令
linux-gwsa:~ # qemu-kvm -m 8192 -smp 4 -hda /dev/sdb1 -net \n nic,model=e1000,macaddr=00:16:3e:51:fb:ce -net tap 参数说明 -net nic,model=e1000,macaddr=00:16:3e:51:fb:ce 设置虚拟网卡类型为 e1000,设置 MAC 地址。 -net tap 使用 tap 网络模式,默认的配置脚本是 /etc//etc/qemu-ifup ( 见 qemu-kvm 的 manpage) 。
在 xWindow 中运行启动客户机的命令后,选择从硬盘启动。看到如图 6 的 grub 选项。
图 6. 启动已安装的客户机
登陆客户机的 xWindow,测试网络连接状况。从图 7 看出,客户机获得了 IP 地址 192.168.0.158,识别了 qemu-kvm 虚拟的千兆网卡 Intel e1000 网络模块。为了测试网络速度,从外网的一台机器上用 scp 下载文件,下载速度平均为 5.1 MB/s 。
图 7. 客户机的网络状态
启动一台客户机后,主机上多出了一个 tap0 虚拟网络设备,这就是 qemu-kvm 为客户机虚拟的 TAP 网络设备。查看网桥可以看出 tap0 加入了网桥 br0 。客户机就是通过网桥访问的外网。
清单 10. 主机的网络设备列表 1
linux-gwsa:~ # ifconfig tap0 tap0 Link encap:Ethernet HWaddr EA:FC:99:17:F3:A5 inet6 addr: fe80::e8fc:99ff:fe17:f3a5/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:220322 errors:0 dropped:0 overruns:0 frame:0 TX packets:342093 errors:0 dropped:0 overruns:11 carrier:0 collisions:0 txqueuelen:500 RX bytes:21559069 (20.5 Mb) TX bytes:479156726 (456.9 Mb) linux-gwsa:~ # brctl show bridge name bridge id STP enabled interfaces br0 8000.001a644887b6 no eth0 tap0