KVM
当今机架,刀片服务器都非常强大,通常在使用时候也无法尽量用光物理内存,CPU
可利用该物理(宿主)主机上安装新的虚拟机,虚拟出新的物理主机环境
当前环境 RHEL6,具备本地 ISO 镜像,网络也共享 ISO 镜像中文件数据(http)
本地已配置 yum 源
检查是否满足使用 KVM 条件, 利用下面方法检测一下 CPU 指令集
INTEL CPU 需满足具备 VMX 指令集,ADM CPU 满足具备 SVM 指令集,如下演示
egrep '(vmx|svm)' --color=always /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid
注: 当 CPU 不满足 KVM 条件,则无任何返回值
安装软件包(最小化安装)
yum install virt-manager libvirt libvirt-python python-virtinst libvirt-client openssh-askpass
另外一种选择,安装软件包组
yum groupinstall -y "Virtualization" "Virtualization Client" "Virtualization Platform" "Virtualization Tools"
可用命令提示
virt-manager (GUI 下 kvm 管理器) libvirt (提供 libvirted 服务) virt-viewer (文本下 kvm 管理器) kvm virt-install (文本下提供 kvm 安装的工具) libvirt-python (包含 python 程序接口) libvirt-client(virsh 命令)
启动 KVM 服务方法
/etc/init.d/libvirtd start
利用下面命令检测 KVM 是否能够正常使用
virsh -c qemu:///system list Id 名称 状态 ----------------------------------------------------
如当前有 KVM 虚拟机在运行,那么可以通过上述命令查询看到虚拟机命名
配置 kvm 必须的桥接模式
当前网络架构如下
[互联网/内联网] -- bond0 [ 物理主机 (数据包转发) [虚拟机eth0] --桥接-- br0 ] (bond1)
解释
物理主机具有 4 个物理网卡
lspci | grep Ether | awk -F: '{print $3}' Broadcom Corporation NetXtreme BCM5719 Gigabit Ethernet PCIe (rev 01) Broadcom Corporation NetXtreme BCM5719 Gigabit Ethernet PCIe (rev 01) Broadcom Corporation NetXtreme BCM5719 Gigabit Ethernet PCIe (rev 01) Broadcom Corporation NetXtreme BCM5719 Gigabit Ethernet PCIe (rev 01) 当前利用 eth0, eth1 建立 bond0 双网卡绑定单 IP 技术 当前利用 eth2, eth3 建立 bond1 双网卡绑定单 IP 技术
参考上面架构图,我们可以理解为, 虚拟机具有网卡 eth0, 而且虚拟机在物理机器的内部
而虚拟机的网卡eth0 是无法与物理机的网卡 bond1,bond0 进行直接连接
因此,需在物理主机中虚拟一个网络接口 br0 (bridge连接模式)
或者利用数据包转发的方式,利用 nat 模式把数据中转到虚拟机中 (不描述)
可以理解为,假设虚拟机要访问互联网时,网络出口连接先后顺序后,参考
虚拟机eth0 -内核层-> 物理 br0 -内核层-> 物理 bond1 -tcp-> 物理 bond0 -tcp层-> 互联网
配置 br0 方法
[root@minia ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond1 DEVICE=bond1 ONBOOT=yes #IPADDR=10.1.1.27 [需要注释部分] #NETMASK=255.255.255.0 [需要注释部分] BONDING_MASTER="yes" BOOTPROTO=none IPV6INIT=no BRIDGE=br0 [新增加部分] [root@minia ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 TYPE=Bridge [注意大小写] BOOTPROTO=static IPADDR=10.1.1.27 [原 bond1 地址被配置到 br0 中] NETMASK=255.255.255.0 ONBOOT=yes
重启网络后监看 IP 地址是否配置成功
[root@minia ~]# ifconfig br0 br0 Link encap:Ethernet HWaddr D8:9D:67:17:66:96 inet addr:10.1.1.27 Bcast:10.1.1.255 Mask:255.255.255.0 inet6 addr: fe80::da9d:67ff:fe17:6696/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:14782840 errors:0 dropped:0 overruns:0 frame:0 TX packets:12491905 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4787651971 (4.4 GiB) TX bytes:6824441386 (6.3 GiB) [root@minia ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.d89d67176696 no bond1 virbr0 8000.525400d72d1f yes virbr0-nic
如使用 IPV6, 需要修改
/etc/sysctl.conf net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0
如使用防火墙规则,需增加 iptables 规则定义
iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
完成配置后重启一下 KVM 服务
service libvirtd restart
安装虚拟机
虚拟机文件存放位置: /vm/proxy1
iso 文件存放位置: /backup/iso/CentOS-6.4-x86_64-bin-DVD1.iso
如需本地安装,可参考下面命令
virt-install --name=centOS6-proxy1 --disk path=/vm/proxy1/root.img,size=30 --vnc --vcpus=2 --ram=4096 --network bridge=br0 --os-type=linux --os-variant=rhel6 --cdrom=/backup/iso/CentOS-6.4-x86_64-bin-DVD1.iso开始安装...... 创建存储文件 root.img | 30 GB 00:00 创建域...... | 0 B 00:00 无法打开显示: Run 'virt-viewer --help' to see a full list of available command line options 域安装仍在进行。您可以重新连接 到控制台以便完成安装进程。
通过提示,利用 virt-manager 工具即可完成整个安装过程(忽略)
如需远程管理对方 kvm 虚拟机,可利用下面命令进行连接(22222 SSH 端口)
virt-manager -c qemu+ssh://root@some_machine:22222/system
注,有可能会提示错误,参考错误提示详细信息
原因1. /usr/local/libexec/ssh-askpass 文件无法获得
解决方法
yum install -y openssh-askpass cp /usr/libexec/openssh/ssh-askpass /usr/local/libexec/ssh-askpass
网络安装
pxe 网络安装
virt-install --hvm --connect qemu:///system --network bridge=br0 --pxe --name pxe10 --ram=2046 --vcpus=2 --os-type=linux --os-variant=rhel6 --disk path==/vm/proxy2/root.img,size=30 --name=kvm-proxy2
pxe + kickstart 网络安装方法
virt-install --name=kvm-proxy3 --disk path===/vm/proxy2/root.img,size=30 --graphics=vnc --vcpus=2 --ram=2048 --network bridge=br0 --os-type=linux --os-variant=rhel6 --location=nfs:10.1.1.1:/share/rhel6.1 --extra-args "ks=ftp://cs:[email protected]/my.cfg"
KVM 管理工具
kvm 内核模块 <- qemu 管理工具 (可用性低)
qemu 是开源虚拟化软件, 虚拟不同 CPU 架构, 可以 x86 虚拟 power cpu
libvirt, virsh, virt-manager (redhat 的辅助工具)
libvirt api 提供管理接口工具
virt-manager 调用 libvirt 工具
libvirt 接口
virsh 命令行工具
virt-manager 图形工具
RHEV-M (redhat 专用收费软件)
支持三种虚拟设备
Emulated software devices 仿真设备 -> 南北桥, USB, PS/2 ISA PCI
Para-virtualized devices -> 时钟, 网络, 串口,
Physically shared devices --> 光纤设备
迁移
在线
离线 静态迁移
在线
共享存储的动态迁移
动态迁移(Live Migration):也叫在线迁移(Online Migration)
运行状态中进行迁移
不影响在线用户使用, 未保证迁移过程中虚拟服务可用, 需短暂停机
迁移前, 服务在源主机运行, 迁移后, 源主机与目标主机需进行短暂切换
迁移对用户透明(不知情) 但对硬件要求高
迁移需要使用共享存储, 迁移过程只在内存中进行
共享存储动态迁移, 减少 DOWN 机时间
迁移方法:
由于源,目标主机都可以访问镜像, 只需要复制 xml 配置文件
使用 nfs 服务, 打开 virt-manager
# Target Path:共享存储在本地的映射目录。本文中这个目录在源主机和目的主机上必须一致。
# Format:选择存储类型。这里必须是 nfs。
# Host Name:输入共享存储服务器,也就是 NFS 服务器的 IP 地址或 hostname。
# Source Path:NFS 服务器上输出的共享目录
点完成后, 自动进行挂载
在目标机中激活
virsh define /etc/libvirt/qemu/xxx.xml <- 主机镜像路径必须正确
在源主机的 virt-manager 窗口中,右键点击等待迁移的虚拟机,选择“Migrate ”。
* New host:选择目的主机的 hostname。
* Address:填入目的主机的 IP 地址。
* Port and Bandwith:指定连接目的主机的端口和传输带宽,本文中没有设定,使用默认设置。
块迁移 - 使用本地存储
迁移频率低, 对迁移时间没有要求, 廉价, 稳定性不如 SAN 存储
迁移方法
直接从源主机拷贝镜像文件和 XML 配置文件到目的主机中
保存虚拟机的运行状态
如果希望保存目标主机状态, 需要对虚拟机以暂停方法进行关闭
离线
也叫做常规迁移、离线迁移(Offline Migration)。
关机或暂停 情况下迁移
迁移虚拟机镜像和相应的配置文件到另外一台物理主机上
主: 暂停, 复制 从: 重建配置, 恢复执行
缺点: 需要停机
先启动源主机
在目标主机中 创建文件, 大小与原设备一致
虚拟虚拟化
virt-v2v 工具, 支持 VMware ESX
最小需求
6G 空间
2G 内存
支持虚拟化 64 位 CPU --> grep -E 'svm|vmx' /proc/cpuinfo
最多 64 个 CPU
file:///E:/training/linux/ULA/html/Virtualization/sect-Virtualization-Tips_and_tricks-Verifying_virtualization_extensions.html
http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm2/index.html
################## 动态迁移 ##########################
## rhel 6.1 中, 利用 virt-manager 进行迁移时候必须打开高级选项, 输入连接性中地址 ##
[ station10 ] [ station20 ] <- sdb -> /vm
| |
|---------------------------|
|
[ station19 ]
iscsi 存储
文件位置 /dev/sdb -> /vm/kvm/rhel5.img
配置 /etc/libvirtd/qemu/net5.xml
步骤
1. station10 利用 virt-manager 连接 /vm/kvm/rhel5.img
建立 guest -> net5 并启动
步骤
2. 复制 station10 /etc/libvirtd/qemu/net5.xml --> station20 相同位置
[root@station10 /]# virsh list
Id
名称 状态
----------------------------------
2 net5 running
[root@station20 ~]# virsh list
Id 名称 状态
----------------------------------
(空)
station10 启动后安装 -> yum install -y firefox wireshark
步骤3 动态迁移.
先利用 ssh, ftp 等工具登录到 net5 主机中 (测试是否断开了链接)
virsh migrate --live net5 qemu+ssh://10.1.1.20/system
同步过程中
[root@station20 ~]# virsh list
Id 名称 状态
----------------------------------
2 net5 暂停
命令执行成功后
[root@station10 /]# virsh list
Id 名称 状态
----------------------------------
(空)
[root@station20 ~]# virsh list
Id 名称 状态
----------------------------------
2 net5 running
ssh, ftp 链接没有被断开
安装过的资料仍然存在
[root@localhost ~]# rpm -qa | grep -E 'wireshark|firefox'
firefox-3.0.18-1.el5_4
wireshark-1.0.8-1.el5_3.1
如果要利用 virt-manager 进行迁移:
(环境, station20 中没有建立任何虚拟机)
建立链接后,双击主界面中新增加链接 (iscsi 配置,有 bug)
\-> 存储
\-> + (增加)
名称: net5
类型: iscsi 目标
\-> 目标路径: /vm
格式:
主机名 10.1.1.19
源路径: iqn.2011-03.com.cluster.station20:kvm
rm -rf /etc/livbirtd/qemu/net5.xml
在 station10 主界面中点 add-connection
程序管理: qemu-kvm
connection to remote host: ssh
user: root <- 建立 ssh 密钥
主机名: 10.1.1.20
建立链接后,双击主界面中新增加链接 (iscsi 配置,有 bug)
\-> 存储
\-> + (增加)
名称: net5
类型: iscsi 目标
\-> 目标路径: /vm
格式:
主机名 10.1.1.19
源路径: iqn.2011-03.com.cluster.station20:kvm
完成后, 自动建立 iscsi 链接
存储池建立具有故障, 无法继续操作
建立链接后,
双击主界面中新增加链接 (nfs配置)
\-> 存储
\-> + (增加)
名称: rhel-net
类型: netfs:网络导出的目录
\-> 目标路径: /net/kvm <- 必须与源主机一致 (station10=20 )
格式: nfs
主机名 10.1.1.19
源路径: /vm/kvm
点完成后, station20 会自动挂载
存储页面增加一新标签,并能够查询使用情况
新建卷
\-> 名称 [net-rhel5].img <- 必须区别源卷
格式 qcow2
最大容量: 1000 mb
分配 0 mb
完成后, 直接点虚拟机中迁移按钮则可以
################## 动态迁移 ##########################
para 虚拟设备
para-virtual
1. 增强了 I/O 性能
2. 推荐在 I/O 负载大的应用程序中使用 PARA 虚拟化
3. 使用 PARA 虚拟化, 必须使用驱动, 默认 rhel4.7 rhel5.4, rhel6.0 都具备该功能
4. windows 客户端必须手动装载驱动
模块由软件包 virtio 提供, 并包括
virtio-net 网络驱动
virtio-blk 存储驱动 (无法支持软驱)
虚拟时钟 -> grep constant_tsc /proc/cpuinfo 检测 CPU 是否支持
rhel3.9 或其他底版本需要手动加载 para 模块, 参考官方文档
windows 也同样需要, 参考官档
增加新磁盘使用 para 虚拟设备
设备类型选择 virtio disk
增加新网络使用 para 虚拟设备
设备类型使用 virtio
pci 设备识别
virsh nodedev-list --tree
virsh nodedev-list | grep pci <- 只获得 pci 设备 (利用 lspci -n 获得对应设备信息)
如 pci_0000_00_1a_7 该设备
$ printf %x 0
0
$ printf %x 26
1a
$ printf %x 7
7
对应变量值为
bus='0x00'
slot='0x1a'
function='0x7'
#
# virsh edit win2k3
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x00' slot='0x1a' function='0x7'/>
</source>
</hostdev>
selinux 允许使用该 pic
setsebool -P virt_use_sysfs 1
virsh start win2k3 启动该设备
而利用 virt-manager 可以直接增加 物理硬件设备
如果新安装时需要使用硬件设备
virsh nodedev-list --tree
virsh nodedev-list | grep pci
irt-install \
-n hostdev-test -r 1024 --vcpus 2 \
--os-variant fedora11 -v \
-l http://download.fedoraproject.org/pub/fedora/linux/development/x86_64/os \
-x 'console=ttyS0 vnc' --nonetworks --nographics \
--disk pool=default,size=8 \
--debug --host-device=pci_8086_10bd <- --host-device=pci_8086_10bd