1,查看是否支持硬件虚拟化
egrep --color=auto '(vmx|xvm)' /proc/cpuinfo
2,安装xen
yum -y install xen kernel-xen
3,title CentOS (3.7.4-1.el6xen.x86_64)
root (hd0,0)
kernel /xen.gz dom0_mem=512M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin
module /vmlinuz-3.7.4-1.el6xen.x86_64 ro root=UUID=44a2a303-b91c-46cf-9fde-fd8119b9cb1c rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD LANG=zh_CN.UTF-8 rd_NO_LVM crashkernel=auto rhgb quiet rd_NO_DM rhgb quiet
module /initramfs-3.7.4-1.el6xen.x86_64.img
4,建立映像文件
dd if=/dev/zero of=/data/xen/test1.img bs=1M oflag=direct seek=102399 count=1
5,建立桥设备
cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-br0
[root@node202 network-scripts]# cat ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="none"
#HWADDR="00:0C:29:48:E3:01"
IPV6INIT="yes"
MTU="1500"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
#UUID="8331e082-ba65-43bc-9e98-12dedf151d87"
BRIDGE=br0
[root@node202 network-scripts]# cat ifcfg-br0
DEVICE="br0"
BOOTPROTO="none"
#HWADDR="00:0C:29:48:E3:01"
IPV6INIT="yes"
MTU="1500"
NM_CONTROLLED="yes"
ONBOOT="yes"
IPADDR=192.168.100.202
NETMASK=255.255.255.0
TYPE="Bridge"
#UUID="8331e082-ba65-43bc-9e98-12dedf151d87"
6,建立一个配置文件
#vim /etc/xen/test1
kernel = "/tmp/vmlinuz"
ramdisk = "/tmp/initrd.img"
memory = 512
name = "test1"
vcpus = 1
vif = [ 'bridge=br0' ]
disk = [ 'file:/data/xen/test1.img,xvda,w' ]
7,启动虚拟机
xm create test1
安装系统
8,改配置文件重起系统
[root@node202 xen]# vim test1
memory = 512
bootloader="/usr/bin/pygrub"
vcpus=1
on_reboot = 'restart'
on_crash = 'destroy'
name = "test1"
vif = [ 'bridge=br0' ]
disk = [ 'file:/data/xen/test1.img,xvda,w' ]
------------
disk = [ "phy:sdc,xvda,w",'file:/data/xen/test1.img,xvda,w' ]
phy表示物理磁盘
vif = [ "mac=xxxxx,bridge=br0,script=vif-bridge" ]
-----------------
xm create test1
当启动虚拟机后会有一个虚拟网卡桥到本机
vif6.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF
inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:32
RX bytes:272 (272.0 b) TX bytes:1404 (1.3 KiB)
本机会有一个仅主机的虚拟网卡
virbr0 Link encap:Ethernet HWaddr 52:54:00:95:6C:DE
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:272 (272.0 b) TX bytes:0 (0.0 b)
能够拷贝之前的img文件直接启动另外一个虚拟机
完成
~
io半虚拟化设备分为前端和后端,前端在个domU上
后端在dom0上,domU有一个特殊驱动能识别前端的这个特殊的设备
如:( /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/xen-netfront.ko ),
而且在处理数据的时候只是简单的处理,而后交给后端,这样大大提升了性能
若是io是彻底虚拟化,domU看到的是一个真正的设备(虚拟的)
在发生数据时前端后端都要对数据进行处理,影响性能
区分虚拟和模拟的一个重要标准是,在模拟中虚拟机的任何cpu指令都是运行在vcpu
上的,而在虚拟中非特权指令是直接运行在物理cpu上的,只有特权指令才交给vmm
翻译执行
io的半虚拟化和cpu的半虚拟没有关系,cpu半虚拟化,io能够彻底虚拟化
可是明显半虚拟化性能好
虚拟须要cpu支持硬件虚拟化,就是cpu在生产的时候有五个ring
宿主机的kernel运行在ring -1 ,
彻底虚拟化的两种加速方式:BT HVM
xen的半虚拟化:
xen运行在硬件上直接管理cpu memory 另外运行一个特权域
管理io和其余的设备 各虚拟机知道本身运行在虚拟的环境中(由于kernel通过修改)
对特权指令的调用会发起:hyper call,而不是直接运行 非特权仍是直接在Cpu上运行
[root@localhost tmp]# yum -y install xen-4.1.2-20.el6.x86_64.rpm xen-runtime-4.1.2-20.el6.x86_64.rpm xen-libs-4.1.2-20.el6.x86_64.rpm xen-licenses-4.1.2-20.el6.x86_64.rpm xen-hypervisor-4.1.2-20.el6.x86_64.rpm kernel-xen-3.7.4-1.el6xen.x86_64.rpm kernel-xen-release-6-4.noarch.rpm bridge-utils-1.5-2.el6.x86_64.rpm kernel-xen-firmware-3.7.4-1.el6xen.x86_64.rpm
title CentOS (3.7.4-1.el6xen.x86_64)
root (hd0,0)
kernel /xen.gz dom0_mem=512M cpufreq=xen dom0_max_vcpus=1 dom0_vcpus_pin
module /vmlinuz-3.7.4-1.el6xen.x86_64 ro root=UUID=44a2a303-b91c-46cf-9fde-fd8119b9cb1c rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD LANG=zh_CN.UTF-8 rd_NO_LVM crashkernel=auto rhgb quiet rd_NO_DM rhgb quiet
module /initramfs-3.7.4-1.el6xen.x86_64.img
service xend start
xm list
xl info
xl help
xen虚拟状态:
r:
b: 阻塞
p: 暂停
s: 中止
c: 崩溃
d: dying, 正在关闭的过程当中
dd if=/dev/zero of=centos.img bs=1M oflag=direct seek=1023 count=1
# mount -o loop centos.img /mnt
xm的配置文件:
kernel:内核
ramdisk: initramfs或initrd
name: 域名称
memory: 内存大小
disk: 磁盘设备文件列表,格式disk=["disk1", "disk2",], 每一个disk都由三个参数进行定义:“backend-dev”,“frontend-dev”,“mode”
backend-dev: 有两种类型,物理设备,虚拟磁盘映像文件,格式为分别为phy:device和file:/path/to/p_w_picpath_file;
front-dev: 定义其在DomU中设备类型;虚拟磁盘映像文件对应的设备文件名称一般为xvd[a-z]
mode: 访问权限模型,r, w
vcpus: 虚拟CPU的个数;
root: 根文件系统所在的设备;
extra: 传递给内核的额外参数;selinux=0
on_reboot: 执行xm reboot命令时的操做,有destroy和restart;
on_crash: 有destroy, restart, preserve(保存崩溃时的信息以用于调试)
vif :vif = ['ip="172.16.100.11", bridge=br0']
type: 设备类型,默认为netfront
mac: 指定mac地址;
bridge: 指定桥接到的物理设备
ip: ip地址;
script: 配置此接口的脚本文件
vifname: 后端设备名称
bootloader: 引导器文件的路径,通常指的PyGrub的路径;
xm console centos6
[root@localhost network-scripts]# cat ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="none"
IPV6INIT="no"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
BRIDGE="br0"
[root@localhost network-scripts]# cat ifcfg-br0
DEVICE="br0"
BOOTPROTO="none"
IPADDR="192.168.100.26"
IPV6INIT="no"
MTU="1500"
NETMASK="255.255.255.0"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Bridge"
# brctl stp br0 on
在配置文件/etc/xen配置kernel initrd 为安装引导的 定义好vcpu memory disk
vif = [ 'dridge=br0']
disk = [ 'file://xen/vm2/centos6.img,xvda,w']
而后
xm create -c centos6
xm list
xm destory centos6
安装好后 修改/etc/xen kernel........
bootloader = "/usr/bin/pugrub"
只要写了bootloader后就不须要在写kernel initrd root extra
由于bootloader会读取虚拟磁盘上的启动引导扇区,加载kernel
样例配置文件有两种xm and xl
显示采用c/s架构vfb帧缓冲,在虚拟机启动一个图形显示请求,而后发送给dom0
在dom0安装tigervnc-server
启动vcn: vncserver :1
qemu-img -f qcow2 -o size=120G,preallocation=metadata /xen/xm1/centos6.qcow2
qemu-img info /xen/xm1/centos6.qcow2
使用了bootloader, pygrup示例:
#ramdisk="/boot/initramfs-2.6.32-358.el6.x86_64.img"
#kernel="/boot/vmlinuz-2.6.32-358.el6.x86_64"
name="linux"
vcpus=1
memory=128
disk=['file:/xen/vm2/dom2.img,xvda,w',]
bootloader="/usr/bin/pygrub"
#root="/dev/xvda2 ro"
#extra="selinux=0 init=/sbin/init"
vif=[ 'bridge=br0' ]
on_crash="destroy"
on_reboot="restart"
使用Dom0中的kernel和ramdisk引导的示例:
ramdisk="/boot/initramfs-2.6.32-358.el6.x86_64.img"
kernel="/boot/vmlinuz-2.6.32-358.el6.x86_64"
name="test"
vcpus=1
memory=128
disk=['file:/xen/vm1/test.img,xvda,w',]
root="/dev/xvda ro"
extra="selinux=0 init=/sbin/init"
自定义安装,并启用了vnc功能:
#ramdisk="/xen/isolinux/initrd.img"
#kernel="/xen/isolinux/vmlinuz"
name="rhel6"
vcpus=2
memory=512
disk=['file:/xen/vm3/rhel6.img,xvda,w',]
bootloader="/usr/bin/pygrub"
#root="/dev/xvda2 ro"
#extra="selinux=0 init=/sbin/init"
#extra="ks=http://172.16.0.1/rhel6.x86_64.cfg"
vif=[ 'bridge=br0' ]
on_crash="destroy"
on_reboot="destroy"
vfb=[ 'vnc=1,vnclisten=0.0.0.0' ]
yum -y install libvirt
service libvirtd start
yum install virt-manager
yum -y install virt-viewer
virt-install -n "centos6.4" -r 512 --vcpu=1 -l http://172.16.0.1/centos6.4/ --disk path=/xen/vm1/centos6.4.qcow --network bridge=br0 --force
----------------------------------------
kvm
# grep -Ei --color=auto "vmx|svm" /proc/cpuinfo
1,先配置好桥
2,安装包,模块
# modprobe kvm_intel
# modprobe kvm
# lsmod | grep kvm
kvm_intel 54285 0
kvm 333172 1 kvm_intel
yum -y install libvirt
service libvirtd start
yum install virt-manager
yum -y install virt-viewer qemu-kvm qemu-kvm-tools virt-install
3,create disk img
# qemu-img create -f qcow2 -o preallocation=metadata /p_w_picpaths/vm2/test.qcow2 10G
# qemu-img resize /p_w_picpaths/vm2/test.qcow2 +10G 增到10G
Image resized.
# qemu-img info /p_w_picpaths/vm2/test.qcow2
p_w_picpath: /p_w_picpaths/vm2/test.qcow2
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 1.7M
cluster_size: 65536
转换格式:
# qemu-img create -f vmdk -o ? test.vmdk #模拟查看相关的帮助信息
Supported options:
size Virtual disk size
adapter_type Virtual adapter type, can be one of ide (default), lsilogic, buslogic or legacyESX
backing_file File name of a base p_w_picpath
compat6 VMDK version 6 p_w_picpath
# qemu-img convert -O vmdk -o adapter_type=lsilogic /p_w_picpaths/vm2/test.qcow2 /p_w_picpaths/vm2/test.vmdk
转换成VMware的vmdk格式
# qemu-img info /p_w_picpaths/vm2/test.vmdk
p_w_picpath: /p_w_picpaths/vm2/test.vmdk
file format: vmdk
virtual size: 20G (21474836480 bytes)
disk size: 16K
建立快照
# qemu-img snapshot -l /p_w_picpaths/vm1/rhel6.qcow2 建立以前查看是否有快照;建议不要同名
# qemu-img snapshot -c rhel6-1.snap /p_w_picpaths/vm1/rhel6.qcow2
# qemu-img snapshot -l /p_w_picpaths/vm1/rhel6.qcow2
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
1 rhel6-1.snap 0 2014-05-25 10:51:34 00:00:00.000
Parameters to snapshot subcommand: #详细帮助
'snapshot' is the name of the snapshot to create, apply or delete
'-a' applies a snapshot (revert disk to saved state) 应用快照
'-c' creates a snapshot 建立快照
'-d' deletes a snapshot ***快照
'-l' lists all snapshots in the given p_w_picpath 查看快照列表
4,安装
为了显示方便;须要安装vnc软件
# yum -y install tigervnc tigervnc-server
#ln -sv /usr/libexec/qemu-kvm /usr/bin
#qemu-img create -f qcow2 -o size=100G,preallocation=metadata /data/test3.img
qemu-kvm -name "redhat" -m 512 -smp 1 -drive file=/data/test3.img,\
> if=virtio,index=0,media=disk,format=qcow2 \
> -drive file=/root/rhel-server-6.4-i386-dvd.iso,media=cdrom,index=1 \
> -boot order=d
使用# vncviewer :5900链接查看,若是打不开安装下面的包
#yum install xorg-x11-server-Xorg
yum -y install xorg-x11-server-Xvfb
-------------
以pxe引导安装
#须要网卡支持;因此须要写一个配置网卡接口的脚本;默认在/etc/qemu-ifup
# vim /etc/qemu-ifup
#!/bin/bash
#
switch=br0
if [ -n $1 ];then
ifconfig $1 up
sleep 1
brctl addif $switch $1
exit 0
else
echo "Error: No Specifed interface."
exit 1
fi
# chmod +x /etc/qemu-ifup
#脚本能自动调用命令中ifname=""网卡的名称
# qemu-kvm -name "test1" -m 512 -smp 1 -drive file=/data/test1.qcow2,media=disk,if=virtio,index=0,format=qcow2 -net nic,model=virtio -net tap,ifname=vnet0,downscript=no -vnc :1 -boot order=c前端
#使用qemu-kvm安装只须要安装qemu-kvm
-----pxe安装virt-install
# virt-install --name "centos6" -r 512 --vcpus 2 --disk path=/p_w_picpaths/vm2/centos.img,size=120 --network bridge=br0,model=virtio --pxe --force
用virt-manager查看,若是有乱码安装一下包
#yum install dejavu-lgc-sans-fonts
若是键盘不一致node
open-->deftails-->dispiay VNC-->keymap=en-uslinux
源码安装qemuvim
1,建立桥
后端
修改/etc/network/interfaces,直接用下面的替换。centos
a) 静态ip模式bash
auto lo网络
iface lo inet loopback架构
auto eth0app
iface eth0 inet manual
auto br0
iface br0 inet static
address 192.168.0.10
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
b) DHCP模式
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
4)重启网络
sudo /etc/init.d/networking restart
建立一个脚本
#!/bin/bash
#
switch=br0
if [ -n $1 ];then
/usr/sbin/tunctl -u `whoami` -t $1
/sbin/ip link set $1 up
# ifconfig $1 up
sleep 1
brctl addif $switch $1
exit 0
else
echo "Error: No Specifed interface."
exit 1
fi
编译安装qemu
./configure
apt-get install gcc libsdl1.2-dev zlib1g-dev libasound2-dev linux-kernel-headers pkg-config libgnutls-dev libpci-dev
安装虚拟机
qemu-system-x86_64 --enable-kvm -hda /data/kvm/test.img -cdrom /data/iso/CentOS-6.5-x86_64-mini-auto.iso -boot d -m 1024 -net nic,macaddr=66:66:66:66:66:00 -net tap,ifname=tap1,downscript=no -vnc 5900
启动虚拟机
qemu-system-x86_64 --enable-kvm -hda /data/kvm/centos6.qcow2 -boot c -m 1024 -net nic,macaddr=66:66:66:66:66:00 -net tap,ifname=tap2,downscript=no -vnc 0.0.0.0:5900
启动后重启一下虚拟机,否则网络就是有问题,不知道为何。
qemu-system-x86_64 --enable-kvm -hda /data/kvm/test.img -boot c -m 1024 -net nic,macaddr=66:66:66:66:66:00 -net tap,ifname=tap1,downscript=no -vnc 0.0.0.0:5900
qemu-system-x86_64 --enable-kvm -hda /data/kvm/test.img -boot c -m 1024 -net nic,macaddr=66:66:66:66:66:00 -net tap,ifname=tap0,downscript=no -vnc 0.0.0.0:5905
建立快照
qemu-img snapshot -c clean1 centos6-1.qcow2
查看快照
qemu-img snapshot -l centos6-1.qcow2
导出快照
qemu-img convert -f qcow2 -O qcow2 -s clean1 centos6-1.qcow2 centos6-1.qcow2.clean1
经过快照启动虚拟机
qemu-system-x86_64 --enable-kvm -hda /data/kvm/centos6-1.qcow2.clean1 -boot c -m 1024 -net nic,macaddr=66:66:66:66:66:00 -net tap,ifname=tap5,downscript=no -vnc 0.0.0.0:5910
删除快照
qemu-img snapshot -d clean1 centos6-1.qcow2
/usr/local/bin/qemu-system-x86_64 --enable-kvm -hda /data/kvm/rhel7-1.qcow2 -boot c -m 1024 -net nic,macaddr=66:66:66:66:66:00 -net tap,ifname=tap0,downscript=no &
/usr/local/bin/qemu-system-x86_64 --enable-kvm -hda /data/kvm/centos6.qcow2.141 -boot c -m 1024 -net nic,macaddr=66:66:66:66:66:01 -net tap,ifname=tap1,downscript=no &
/usr/local/bin/qemu-system-x86_64 --enable-kvm -hda /data/kvm/centos6.qcow2.142 -boot c -m 1024 -net nic,macaddr=66:66:66:66:66:02 -net tap,ifname=tap2,downscript=no &
/usr/local/bin/qemu-system-x86_64 --enable-kvm -hda /data/kvm/centos6.qcow2.143 -boot c -m 1024 -net nic,macaddr=66:66:66:66:66:03 -net tap,ifname=tap3,downscript=no &
/usr/local/bin/qemu-system-x86_64 --enable-kvm -hda /data/kvm/centos6.qcow2.144 -boot c -m 1024 -net nic,macaddr=66:66:66:66:66:04 -net tap,ifname=tap4,downscript=no &
/usr/local/bin/qemu-system-x86_64 --enable-kvm -hda /data/kvm/centos6.qcow2.145 -boot c -m 1024 -net nic,macaddr=66:66:66:66:66:05 -net tap,ifname=tap5,downscript=no &
/usr/local/bin/qemu-system-x86_64 --enable-kvm -hda /data/kvm/centos6.qcow2.146 -boot c -m 1024 -net nic,macaddr=66:66:66:66:66:06 -net tap,ifname=tap6,downscript=no &
/usr/local/bin/qemu-system-x86_64 --enable-kvm -hda /data/kvm/centos6.qcow2.147 -boot c -m 1024 -net nic,macaddr=66:66:66:66:66:07 -net tap,ifname=tap7,downscript=no &