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/image_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 /images/vm2/test.qcow2 10G
# qemu-img resize /images/vm2/test.qcow2 +10G 增到10G
Image resized.
# qemu-img info /images/vm2/test.qcow2
image: /images/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 image
compat6 VMDK version 6 image
# qemu-img convert -O vmdk -o adapter_type=lsilogic /images/vm2/test.qcow2 /images/vm2/test.vmdk
轉換成VMware的vmdk格式
# qemu-img info /images/vm2/test.vmdk
image: /images/vm2/test.vmdk
file format: vmdk
virtual size: 20G (21474836480 bytes)
disk size: 16K
創建快照
# qemu-img snapshot -l /images/vm1/rhel6.qcow2 創建之前查看是否有快照;建議不要同名
# qemu-img snapshot -c rhel6-1.snap /images/vm1/rhel6.qcow2
# qemu-img snapshot -l /images/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 image 查看快照列表
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=/images/vm2/centos.img,size=120 --network bridge=br0,model=virtio --pxe --force
用virt-manager查看,如果有亂碼安裝一下包
#yum install dejavu-lgc-sans-fonts
如果鍵盤不一致
open-->deftails-->dispiay VNC-->keymap=en-us
源碼安裝qemu
1,創建橋
修改/etc/network/interfaces,直接用下面的替換。
a) 靜態ip模式
auto lo
iface lo inet loopback
auto eth0
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 &