把上面的参数串在一起就是安装 KVM 虚拟机的命令,见清单 2 。
清单 3. 安装客户机的命令
使用文件作为客户机存储,从光盘启动,使用默认的网络配置: linux-gwsa:~ # qemu-kvm -m 4096 -smp 4 -hda /home/kvm.img \n -cdrom /mnt/SLES10SP2.iso -boot d 使用硬盘分区作为客户机存储,从光盘启动,设置 TAP 网络,通过 VNC 远程安装: linux-gwsa:~ # qemu-kvm -m 4096 -smp 4 -hda /dev/sdb1 -net nic, model=e1000, \n macaddr=00:16:3e:51:fb:ce -net tap -cdrom /mnt/SLES10SP2.iso -boot d -vnc 9.123.99.34:3 |
安装第一台客户机
在 xWindow 中输入清单 3 中的命令,或者通过 VNC 远程连接,显示图 2 中的客户机安装界面:
图 2. 客户机启动界面
选择 3 从光盘启动,进入大家熟悉的 Linux 安装步骤。本例中添加了网络安装的参数,这样将从网络安装客户机。
图 3. 引导安装 Linux 系统
图 4. 网络下载安装文件
从网络下载了安装程序后进入 YAST 安装界面,余下的步骤和在物理机上安装 SLES 一样。
第二台客户机的安装以第一台稍有不同,主要是网络上的设置和资源的分配。下节中将详细介绍客户机的网络设置。
启动 KVM 虚拟机
客户机安装完成后,需要为其设置网络接口,以便和主机网络,客户机之间的网络通信。事实上,如果要在安装时使用网络通信,需要提前设置客户机的网络连接。
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) 。 |