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 &