测试

虚拟化技术分类:
半虚拟化;
完全虚拟化

服务器虚拟化:
在一个宿主机上提供多个独立os。所谓虚拟化就是将某种形式的事物以另外一种形式表示出来。

虚拟化的原因:
①充分利用硬件资源
②经济性,包括电力,空间,管理
③可动态迁移
④虚拟机的故障不会影响宿主机

半虚拟化和完全虚拟化是按照cpu指令集来划分的。
 完全虚拟化提供底层物理系统的全部抽象化,且创建一个新的虚拟系统,客户机os可以再里面运行。无需对客户机os或app进行修改。即客户机意识不到虚拟环境的存在。
半虚拟化需要对运行在虚拟机器上客户机os进行修改并提供相近的性能(客户端os会意识到自己是后娘养的)

linux系统
xen是半虚拟化技术,
kvm是全虚拟化技术。
xen需要修改kernel,而kvm是以进程的方式存在的。

vmware,商业化的完全虚拟化产品。
在客户os和硬件间有一名为hypervision(超级监督)的抽象层,主要作用是资源的分配。
这个抽象层允许任何os在硬件上运行。
整个虚拟化后的环境都作为一个文件保存,保证了整个系统(客户os、vm和虚拟硬件)的可迁移性,并进行负载均衡

xen,免费开源虚拟化产品。就像xen需要对客户os进行修改一样,只有修改过的os才可以通过xen进行虚拟化。

是否支持
完全虚拟化的cpu指令:intel,vmx;amd,svm
半虚拟化的cpu指令,pae

xen
①支持硬件虚拟化
②没有特殊主机(host)概念,所有系统均为虚拟化
③第一个虚拟机(domain0)专注于配置和控制
④虚拟域(domain)
⑤虚拟机监控器(hypervisor)
⑥客户机(guest)

xen支持paravirtualization半虚拟化和full virtualization完全虚拟化

客户机(guest)的识别
①域名(domain-name)
②唯一标识(domain-id)
③UUID

基于xen的os,有多个层,最底层和最高特权层是xen程序本身。
xen可以管理多个客户机os,每个os都能在一个安全的虚拟机中实现,包括启动xen的初始os。
在xen中,domain由xen控制。每个客户os可以管理它自身的应用。
这种管理包括每个程序在规定时间内的响应到执行,是通过xen调度到虚拟机中实现。

用于启动xen的os,就是domain0,在引导os时自动创建。
domain0是专用的客户机,拥有创建新域并管理它们的虚拟设备的管理能力。
domain0处理物理硬件,如网卡和硬盘控制器。
domain0也处理管理性的任务,如暂停、恢复或移植客户机域到其他虚拟机里

hypervisor是一个虚拟化平台,允许多个os在单一主机里的完全虚拟化环境里同时运行。
guest是主机或主os之外的运行在虚拟机上的os。
运行hypervisor的domain0系统,会比不运行hypervisor时有不大于5%的资源损失,这些资源主要用于各虚拟机之间的协调。
hyperviosr包含在domain0的内核中,随os启动运行

xen虚拟化系统中,每个客户机的内存都来自于主机的物理内存。
对于半虚拟化的客户机,可以设置初始内存和虚拟机的最大值,也可在运行时增加/删除虚拟机的物理内存,只要不超过所指定的最大值。这个过程称为ballooning

可以用很多虚拟cpu(vcpu)来配置每个客户机。
hypervisor(虚拟机监控器)按照物理cpu的负载来调度这些vcpu。
还可以授予某个客户机任何数量的虚拟磁盘。客户机把这些磁盘视为硬盘或cd-rom设备,但cd-rom设备仅支持完全虚拟化客户机。
每个虚拟磁盘都以块设备或主机上的常规文件方式提供给客户机用

virtual networking interface可以设置并运行在虚拟客户机上,这些网络接口用永久的虚拟mac地址配置。
新安装的客户机会缺省安装vnic,它的mac地址从一个有着16,000,000的储备池里随机选取。
大量配置客户机的应用也可以手工分配mac地址来确保唯一性。

xen中的每个客户机都有一个连接至domain0的虚拟文本控制台(text console)。
可以把客户登录和控制台输出重定向到这个文本控制台。
redhat中,可以配置任何客户机来使用虚拟图形控制台(graphical console)

xen0内核就是用于启动xen的domain0 os的kernel,其中内嵌了hypervisor,而xenU内核是用来引导虚拟化os的内核

客户机的标识。
domain-name是一个对应于客户机配置文件的文本串。
domain-id是唯一的,非持久的号码,被分配给活动的域并被用来进行识别和控制。
uuid是持久的、唯一的识别符,在客户机的配置文件里进行控制。
客户机运行时,它是可见的。客户机第一次安装时被自动分配

xen中,
32位主机只运行32位半虚拟化客户机;
64位主机只运行64位半虚拟化客户机;
64位完全虚拟化主机可以运行32位、32位pae或64位客户机;
32位完全虚拟化主机可以运行32位pae和非pae完全虚拟化客户机

对于x86_64 os,rhel虚拟化系统内核不支持超过32g的内存,
如果有需要超过32g物理内存的os上引导虚拟化内核,必须在内核命令附加mem=32G参数。(grub.conf)

要保证domain0的绝对安全:
运行尽量少的服务;
开启例如selinux等安全机制;
开启firewall限制domain0的通信;
domain0对普通用户要做限制

xen节点控制守护进程
1.在domain0中运行
2.提供管理配置接口
3.包含类http协议接口
4.客户(guest)域控制台

运行在domain0的xend节点控制守护进程,为xen的hypervisor提供管理接口。xm程序集将传递命令和参数给xend,传递的方式有两种
unix消息方式
http协议方式
xend节点控制守护进程没有正常启动,则无法查看和监控所含有的虚拟域
没有启动的原因可能是:
选择了错误的启动内核;
domain0没有正确初始化;
没有配置xend服务随domain0所在系统一起启动
chkconfig xend on

xend配置文件:
# vim /etc/xen/xend-config.sxp
console-limit《==决定控制台服务器的内存缓冲限制,以域为基础进行分配。
min-mem    《==给domain0保留的最小内存数量,为0则值不变化
dom0 cpus    《==给dom0使用的cpu数量,为0则使用所有,最少1个cpu
enable-dump    《==崩溃时是否转储
external-migration-tool    《==指定用于处理外部设备移植的脚本或应用程序(脚本必须位于/etc/xen/scripts/external-device-migrate)
logfile        《==日志文件位置
loglevel    《==日志级别
network-script    《==指定启动网络环境的脚本(必须位于/etc/xen/scripts下)
xend-http-server    《==是否启动http stream数据包管理服务器(缺省为no)
xend-unix-server    《==启动unix域套接字服务器(套接字服务器是一个通信终点,处理底层的网络连接并接受或拒绝转入的连接)
xend-relocation-server    《==启用用于跨机器移植的relocation服务器
xend-unix-path    《==指定xend-unix-server命令输出数据的位置(/var/lib/xend/xend-socket)
xend-port    《==指定http管理服务器使用的端口(缺省为8000)
xend-relocation-port    《==指定relocation服务器所使用的端口(缺省为8002)
xend-relocation-address    《==指定虚拟机允许系统转移的地址
xend-address    《==指定域套接字服务器绑定的地址

xm命令行结构
○ xm command [switches] [arguments] [variables]
○ xm help
常用xm命令
○ list
○ create
○ pause/unpause
○ destroy
○ shutdown
○ migrate
○ save
○ restore
○ reboot

xm工具传递命令道xen控制虚拟机监控器(hypersivor),多数xm指令对大多数域是异步执行的。在xm命令输入以后提示将立即返回,即使命令不能完成或需延后执行。
一些操作例如启动和关闭guest域,可能的延时在30秒或更长时间。

[root@station105 ~]# xm list
Name                                      ID Mem(MiB) VCPUs State   Time(s)
Domain-0                                   0      474     1 r-----    178.0
vm1                                        1      255     1 -b----     49.0

[root@station105 ~]# xm list --label
Name                              ID Mem(MiB) VCPUs State   Time(s) Label   
Domain-0                           0      474     1 r-----    179.1  INACTIVE
vm1                                1      256     1 -b----     49.1  INACTIVE

name        《==虚拟机名称
domid    《==虚拟机运行时的domain id
memeory    《==分配给虚拟机的内存
vcpus        《==分配给虚拟机的cpu数
state    
    r    《==runing域运行标记
    b    《==block域阻塞标识(当vcpu在等待外部事件的发生时,域就会被阻塞)
    p    《==pause 域挂起标识
    s    《==shutdown 域关闭标识
    c    《==crashed 域崩溃标识
cputime    《==虚拟域使用的cpu时间

xm create -c domain_name    《==启动一个虚拟域,-c参数在其启动同时连接其域控制终端
domain_name需和放置在/etc/xen目录下的域控制文件名一致。连接后将打开pygrab启动界面,如果是半虚拟化系统,要确认选择带xen的内核启动项。

xm pause vm1    《==挂起,不接受任何终端或服务消息,内存中的数据加电情况下不丢失
xm unpause vm1    《==从挂起状态下恢复
xm destory vm1    《==相当于直接关电源
xm shutdown    《==相当于shutdown -h now
xm migrate    《==将当前指定的虚拟域从本地物理主机上移植到另一个物理主机上
-l    
-p    
-r    

将本地运行的(live状态)虚拟域vm1移植到物理主机192.168.0.2上,远端端口是8002
xm migrate vm1 192.168.0.2 -p 8002 -l    《==前提是192.168.0.2上已经运行了支持移植特性的xen,同时它已经阿凯了用于接收移植数据包的xen配置选项(xend-relocation相关配置)
xm save    《==将虚拟域当前状态挂起到domain0的一个磁盘文件中,然后等待restore
xm save vm1 /var/lib/xen/dump/vm1
xm restore /var/lib/xen/dump/vm1

虚拟域控制文件
1.虚拟域配置文件 /etc/xen/domain_name
2.虚拟域磁盘虚拟文件 /var/lib/xen/images/domain_name.img
虚拟域控制文件默认放置的目录是/etc/xen,使用xen create时,xen会查找对应的虚拟域配置文件,然后启动虚拟域。在虚拟域配置文件中定义了如何启动配置虚拟设备,例如虚拟磁盘和虚拟网络设备。

虚拟块设备:
1.导出虚拟块设备是安装虚拟域的前提
2.虚拟块设备的名称必须唯一
3.三种到处虚拟块设备类型
    本地文件
    本地真实块设备
    本地逻辑卷设备
在虚拟域的配置文件中,disk用于定义爱设备(VBD)。例如
disk = [ "tap:aio:/xendisk/vm0.img,xvda,w" ]
定义了本地文件/xendisk/vm0.img作为虚拟域的xvda设备以可写的方式到处给vm1

disk标签定义方式:
disk=["stanza1","stanza2",...."stanzaN"]
其中stanzaN为到处的虚拟设备,设备名必须唯一
stanzaN的结构:
设备类型+本地位置(backend_dev)+虚拟设备中设备名(frontend_dev)+导出模式
disk=["phy:sda10,hda1,w","phy:VG1/LV1,sda1,w","file://home/images/system1.img,xvda,w"]

设备类型及本地位置(backend_dev)
可以是phy:sda10或是phy:VGname/LVname,也可以是file:/dir/file.img。
phy是指设备是本地物理设备,物理设备可以是本地块设备/dev/sda10,也可以是本地逻辑卷设备/dev/VGname/LVname,file是指设备是本地的二进制逻辑文件/dir/file.img

虚拟域中设备名(frontend_dev)可以是sda1,hda1,xvda等

导出模式有两种:
r(read-only)
w(read/write)

当前xen系统支持在某个虚拟域中最多到处8个虚拟块设备(VBD)

虚拟cpu:
1.真实cpu
    domain0运行的计算机中真实的物理cpu。hypervisor控制和分配这些真实cpu给虚拟域。这样就限制了虚拟域可以占用的物理cpu资源
2.虚拟cpu
    在虚拟域中看到的cpu资源,每一个虚拟域都会至少看到一个虚拟cpu,最多看到vcpus个虚拟cpu
配置文件中cpu的选项:
cpu    《==配置虚拟域使用的特定真实cpu,0为第一个cpu,1为第二个,如未设置此项或设置为-1,代表虚拟域可以使用任意真实cpu
cpus    《==配置虚拟域使用的特定系列真实cpu,例如设置2,4或2-6,。如未配置此项则虚拟域会使用其需要的所有真实cpu
vcpus    《==配置虚拟域中虚拟cpu的个数,默认为1。如大于1的vcpus需要虚拟域中的系统支持smp
3.可变配置

网络设备:
vif(virtual interface)xen中虚拟网络设备,是由xen的相关脚本启动并控制的。
vif0.0是domain0的第一个虚拟网络设备,一般用于标记domain0并从domain0通过虚拟网络连接其他虚拟域
vif1.0虚拟域ID为1的虚拟域的第一个网络设备,vif1.1为第二个。
由于每次的虚拟域ID都不相同,所以vif设备并不一定是联系的。

virbr0,第一个虚拟桥接设备,默认所有虚拟域在创建vif设备时都会连接到这个网桥设备,
virbrN是第N个虚拟桥接设备

xenbr0是eth0的逻辑标识,如果在创建虚拟域的vif设备时配置连接xenbr0,则虚拟vif设备是共享物理设备eth0

vif设备在虚拟域的配置文件中定义:
vif = [ "mac=00:16:36:58:9c:5e,bridge=virbr1,script=vif-bridge","mac=00:16:3e:6d:f9:02,bridge=virbr0,script=vif-bridge" ]
上面配置了两个虚拟网络设备:eth0和eth1,分别桥接在网络virbr1和virbr0上。

配置新的虚拟桥接设备:需要一个网桥配置我呢间newbr.xml放在 /etc/libvirt/qemu/networks下,如希望随系统启动,则需要建立软连接到/etc/libvirt/qemu/networks/autostart下    《==服务名是libvirt

# cat /etc/libvirt/qemu/networks/newbr.xml
<network>
<name>newbr</name>
<bridge name="virbr1" />
<forward/>
<ip address="192.168.123.1" netmask="255.255.255.0">        《==定义domain0虚拟网络设备virbr1的ip地址
<dhcp>
<range start="192.168.123.2" end="192.168.123.254" />        《==定义dhcp动态分配地址池
</dhcp>
</ip>
</network>

创建虚拟域:
1.图形工具virt-manager
2.文本工具virt-install
    virt-install --prompt    《==交互式文本界面

当domain0的空闲内存小于设置的guest最大内存数时,安装程序会报错退出。(擦,最大还是最小啊)

pygrub:    《==由python语言编写
1.类似grub
2.至此回xenU域启动
3.读取虚拟域中的真是grub.conf文件    《==当XenU系统被Xen启动的时候
如不选择使用pygrub方式启动虚拟域,也可以使用直接指定外部kernel的方式
kernel="/where/is/xen/kernel/dir/vmlinuz-x.x.x-xenu"
ramdisk="/where/is/xen/kernel/dir/initrd.img"
pygrub的好处在于无需每次更新虚拟域内核的时候都在domain0中重新生成对应kernel文件和修改虚拟域配置文件,只需要像真实机一样修改本地(虚拟域)的grub.conf文件就可以了。

rhel中,pygrub已经包含在xen的rpm包中,无需额外安装。

监控虚拟域:
1.查看当前运行的虚拟域简要情况
    xm list
    非交互性程序
2.查看当前运行的虚拟域系统资源使用情况
    xentop
    交互性程序
    连续显示状态
3.连接虚拟域
    vnc
    ssh domain_ip    《==需要将虚拟域的网卡桥接到xenbr0
    xm console domain_name    《==模拟串口的方式,前提是虚拟域中已经创建并打开了xm可连接的串行接口。不同linux中定义的虚拟域串行接口可能不同。rhel中虚拟域的串行接口定义的是xvc0,其他linux系统也可能使用ttyS0
console是唯一性连接,一个xm console连接成功,其他console就无需登录。任意多的xm console对于单一虚拟域来说其实是共用一个串行口,但显示并不会同步。

从虚拟域中退出来,ctrl+]

自动启动虚拟域:(xendomains)    《==domain0中的sysV系统启动脚本,作用是在domain0系统启动后自动启动该机上指定的虚拟域或恢复上次domain0关机时保存的虚拟域状态,在domain0关闭的时候可以保存关机时正在运行的虚拟域
1.xendomains系统服务启动脚本
2.xendomains服务启动参数
3.xendomains配置文件(/etc/sysconfig/xendomains)    《=-默认xendomains在关闭和保存时虚拟域内存数据文件保存的路径位置为 /var/lib/xen/save
4.xendomains虚拟域自动启动目录(/etc/xen/auto)    《==指定那些虚拟域被xendomains控制,将虚拟域文件连接到此处
ls -s /etc/xen/system1 /etc/xen/auto/system1

暂停和恢复虚拟域:
1.virt-manager图形方式
2.通过xendomains服务
    service xendomains stop    《==将暂停所有虚拟域,默认目录为/var/lib/xen/save
3.通过xm save命令
[root@station105 ~]# xm save vm1
Error: 'xm save' requires 2 arguments.

Usage: xm save <Domain> <CheckpointFile>
[root@station105 ~]# xm restore
Error: 'xm restore' requires 1 arguments.

Usage: xm restore <CheckpointFile>

迁移虚拟域:
1.迁移虚拟域方式
    非实况迁移(unlive)
    实况迁移(live)
2.迁移前准备
    迁移服务器之间的存储共享
    迁移服务器之间的网络连通性
    迁移服务器xend服务器配置
3.迁移操作
    xm migrate domain_name host [options]

迁移的目的:满足虚拟系统的高可用性。
live(平滑方式)可保证正在运行的服务和系统不会被打断;
unlive(非平滑方式)相当于虚拟系统关闭后在新的位置启动的过程;

案例:
1.需迁移的虚拟系统XenU运行在真是服务器Xen0-A(192.168.0.1)上,将它迁移到Xen0-B(192.168.0.2)上
XenU的数据虚拟文件系统使用sharefile0(192.168.0.3)主机共享nfs文件的/xen目录。Xen0-A和Xen0-B都分别连接了sharefile0主机的/xen目录
2.Xen0-A、Xen0-B和sharefile0三台主机网络互联正常
3.sharefile0主机配置
    cat /etc/exports
    /xen Xen0-A_ip(rw,sync,no_root_squash)
    /xen Xen0-B_ip(rw,sync,no_root,squash)
    创建/xen目录,尽量单独分区,空间大于5G
    启动portmap和nfs目录
    查看nfs共享是否正确配置
    exportfs -v
4.Xen0-A主机配置和XenU虚拟系统安装
    使用带xen的kernel引导系统,并启动xend服务
    挂接sharefile0上nfs共享目录/xen到本地/xen目录上
    安装XenU虚拟系统,将虚拟系统的虚拟磁盘文件设置在/xen目录上
5.Xen0-B主机配置
    使用带xen的kernel引导系统,并启动xen服务
    挂接sharefile0上nfs共享目录到本地
6.Xen0-A和Xen0-B主机上xend配置
    配置Xen0-A主机上的/etc/xen/xend-config.sxp
    #(xend-unix-server yes)
    (xend-relocation-server yes)
    (xend-relocation-port 8002)
    (xend-relocation-address '')
    (xend-relocation-hosts-allow '')
    #(xend-relocation-hosts-allow '^localhost$
    ^localhost\\.localdomain$')
    将Xen0-A主机上的xend-config.sxp文件拷贝到Xen0-B主机,替换源文件
    重新启动Xen0-A和Xen0-B主机的xend服务
    将Xen0-A上创建的XenU虚拟系统配置文件/etc/xen/xenU拷贝到Xen0-B主机(如只是临时迁移,则无需这一步)
    
迁移:
xm migrate XenU Xen0-B_ip -l
迁移过程中通过xm list命令在Xen0-A和Xen0-B上查看XenU迁移的状态

posted @ 2013-05-31 21:19  n4mine  阅读(120)  评论(0编辑  收藏  举报