在进行KVM虚拟化管理时,virsh的学习曲线非常陡峭。但是另一种可选方式virt-manager的缺陷还很明显。
virt-manager需要在系统内运行,这会浪费资源并为别有目的的人提供额外的进攻点。virt-manager的另一大缺点是需要通过图形工作站运行远程接入的方式,才能对服务器上的虚拟机进行管理。
而virsh则可以通过命令行执行各种各样的管理任务。本文例举了一些最重要的virsh命令。
1. 查看虚拟系统的名称、CPU占用情况和内存占用情况
在virt-manager中选择要管理的虚拟系统,然后单击“细节”按钮,打开“虚拟系统状态”窗口,在这里可以查看虚拟系统的名称、CPU占用情况和内存占用情况 。如图-1 。
图-1查看虚拟系统的名称、CPU占用情况和内存占用情况
2. 查看和修改虚拟系统内存等硬件的状态和参数
选择“硬件”选项卡,在这里可以查看和修改虚拟系统内存等硬件的状态和参数 。如图-2。
图-2查看和修改虚拟系统内存等硬件的状态和参数
3. 虚拟机保存、停止和暂停
在virt-manager中选择要管理的虚拟系统,然后单击“打开”按钮,启动虚拟系统终端。在这里可以使用暂停、运行、关闭和保存等功能,如图-3。
图-3 虚拟机保存、停止和暂停
使用字符工具xm管理Xen虚拟机的命令
显示虚拟机运行状态
xm list
使用文本方式连接虚拟系统
xm console
开启虚拟系统
xm create
关闭虚拟系统
xm shutdown
xm destroy
重新启动虚拟系统
xm reboot
将虚拟系统当前状态保存到文件中
xm save
恢复已保存的虚拟系统
xm restore
暂停虚拟系统
xm pause
恢复被暂停的虚拟系统
xm resumeXen虚拟机的故障解除
1 了解Xen 配置文件
Xen的配置文件包含下面的标准变量。这些文件里的配置项必须用引号(")括起来。这些配置文件位于 /etc/xen 目录里。 如表1 。
另外一个命令模式的 Xen 管理工具叫做virsh(Virtual Shell)。virsh 是由一个名为 libvirt的软件提供的管理工具,提供管理虚拟机更高级的能力。virsh大部分的功能与xm 一样,你可以利用 virsh 来启动、删除、控制、监控Xen 的区域,因此你也可以利用 virsh 来管理 Xen 中所有的虚拟机。
你可能会很好奇,既然已经提供了xm管理工具,为何Red Hat Enterprise Linux 还需提供virsh?
这是因为在Linux领域里,除了Xen外,还有许多种机制也提供虚拟化的功能,然而,不同的虚拟化系统的使用方法都不太相同。为了让Linux可以通过同一种方法读取与管理各种虚拟化子系统,libvirt团队(http://libvirt.org/ )便开发出了libvirt.so链接库,让软件的开发人员可以用 libvirt.so提供的API来管控所有的虚拟化系统。而virsh 就是利用 libvirt.so 链接库编写而成的管理工具。因此,不管实质上执行的是何种虚拟化子系统,你只需学会 virsh 的使用方法,就可以藉此来使用或管理各种虚拟化系统提供的虚拟机了。
本节将介绍 virsh 这个管理工具的使用方法。
1 基本语法
virsh的基本用法如下:
virsh [COMMAND] [ARGS...] |
另外需要注意的是,virsh提供两种执行模式:"直接模式(Direct Mode)"与"互动模式(Interactive Mode)"。在直接模式里,你必须在Shell中以参数、自变量的方式来执行virsh,如果在互动模式中,则virsh会提供一个提示字符串,你可以在该提示字符串后,输入要执行的命令。如果执行virsh没有指定任何参数或自变量则默认就是进入互动模式。
与xm一样,COMMAND也是 virsh提供的命令,常用的命令如表 28-5所示。
表28-5 virsh常用命令一览表
命令 |
说明 |
help |
显示该命令的说明 |
quit |
结束 virsh ,回到 Shell |
connect |
连接到指定的虚拟机服务器 |
create |
启动一个新的虚拟机 |
destroy |
删除一个虚拟机 |
start |
开启(已定义的)非启动的虚拟机 |
define |
从 XML 定义一个虚拟机 |
undefine |
取消定义的虚拟机 |
dumpxml |
转储虚拟机的设置值 |
list |
列出虚拟机 |
reboot |
重新启动虚拟机 |
save |
存储虚拟机的状态 |
restore |
回复虚拟机的状态 |
suspend |
暂停虚拟机的执行 |
resume |
继续执行该虚拟机 |
dump |
将虚拟机的内核转储到指定的文件,以便进行分析与排错 |
shutdown |
关闭虚拟机 |
setmem |
修改内存的大小 |
setmaxmem |
设置内存的最大值 |
setvcpus |
修改虚拟处理器的数量 |
而virsh命令语法的ARGS则是COMMAND 搭配的参数。不同的COMMAND可能需搭配不同的参数,至于什么COMMAND可以搭配哪些参数,我将会在对各功能的介绍中提到。
总地来说,如果ARGS需指定虚拟机,你可以使用下列的格式指定是哪一个虚拟机器。
虚拟机的名称。
虚拟机启动后的标识符。
虚拟机的 UUID。
以下就是使用 virsh 的示范。
[root@linux ~]# virsh ?① 欢迎使用 virsh - 虚拟化的互动模式终端机。 类型: 「help」以取得命令的求助画面 「quit」离开 virsh # list Id 名称 状态 ---------------------------------- 0 Domain-0 执行中 virsh # quit ② [root@linux ~]# virsh list ③ Id 名称 状态 ---------------------------------- 0 Domain-0 执行中 [root@linux ~]# |
① 以互动模式执行 virsh。
② 结束 virsh 的执行,回到默认的 Shell 下。
③ 这是以直接模式执行 virsh,结果与互动模式完全一样。
由于virsh与xm的部分功能相同,因此,本节仅介绍virsh与xm的不同之处。
2 查看Domain信息
virsh 可以查看虚拟机的相关信息,你只需在执行 virsh 时配合如表28-6所示的命令。
表28-6 查看Domain信息执行的命令
命令 |
说明 |
domid |
查看虚拟机的标识符 |
domname |
查看虚拟机的名称 |
domuuid |
查看虚拟机的 UUID |
domstate |
查看虚拟机目前的状态 |
dominfo |
查看虚拟机的信息 |
执行上述的每一个命令时,你都必须指定虚拟机的名称、标识符和UUID。以下是我使用 virsh 查看虚拟机信息的示范。
[root@linux ~]# virsh domid system1 3 ?① [root@linux ~]# virsh domname 3 system1 ② [root@linux ~]# virsh domuuid system1 8f35e0d3-f9d0-11f7-c0a5-30bd84228549 ③? [root@linux ~]# virsh dominfo system1 ④? Id: 3 名称: system1 UUID: 8f35e0d3-f9d0-11f7-c0a5-30bd84228549 操作系统类型: linux 状态: 以组绝 处理器数目: 1 处理器时间: 23.7s 最大内存: 512000 KB 已使用的内存: 511824 KB [root@linux ~]# |
① 这是 system1 虚拟机的标识符。
② 这是标识符 3 的虚拟机之名称。
③ system1 的 UUID。
④ 这则是 system1 完整的信息。
3 转储区域配置
除了上述的功能外,virsh也允许把某一个虚拟机目前的设置值存储下来。virsh把设置值存储下来的动作,称为"转储(Dump)"。
转储虚拟机设置值有什么好处?
好处很多,我至少想到两个。首先,转储虚拟机的设置值可以让你把某一个虚拟机的设置备份下来,以供日后恢复该设置配置。其次,如果要用 virsh 来启动一个虚拟机,你必须指定该虚拟机的配置文件。因此,如果你希望用virsh 来管理所有的虚拟机,那么请务必把每一个虚拟机的设置值转储下来后妥善保存。
如果要转储虚拟机的设置值,你可以执行:
virsh dumpxml DOMAIN |
其中的DOMAIN就是要转储的虚拟机。你可以使用虚拟机的名称、标识符或是UUID来指定要转储到哪一个虚拟机。以下是我使用virsh转储虚拟机的范例。
[root@linux ~]# virsh dumpxml system1 ?① <domain type='xen' id='3'> <name>system1</name> <uuid>8f35e0d3f9d011f7c0a530bd84228549</uuid> <bootloader>/usr/bin/pygrub</bootloader> <os> <type>linux</type> <kernel>/var/lib/xen/vmlinuz.39zui7</kernel> <initrd>/var/lib/xen/initrd.bTaKXX</initrd> <cmdline>ro root=LABEL=/</cmdline> </os> <memory>512000</memory> <vcpu>1</vcpu> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>restart</on_crash> <devices> <interface type='bridge'> <source bridge='xenbr0'/> <mac address='00:16:3e:1f:9a:73'/> <script path='vif-bridge'/> </interface> <disk type='block' device='disk'> <driver name='phy'/> <source dev='/dev/xmdisk/system1'/> <target dev='xvda'/> </disk> <graphics type='vnc' port='5900'/> <console tty='/dev/pts/4'/> </devices> </domain> [root@linux ~]# ls ② anaconda-ks.cfg Desktop/ install.log install.log.syslog [root@linux ~]# virsh dumpxml system1 > system1.virsh.xml ?③ [root@linux ~]# ls anaconda-ks.cfg Desktop/ install.log install.log.syslog system1.virsh.xml ?④ |
① 这是 system1 的设置数据。
② 目前这个目录下只有这几个文件。
③ 现在把 system1 转储后的设置数据转向存储于 system1.virsh.xml文件中。
④ 这就是 system1 的设置数据备份文件。
kvm虚拟机管理
一、环境
role hostname ip OS
kvm_server target 192.168.32.40/24 rhel6.0_x64
vir_guest1 node4 192.168.32.34/24 rhel5.5_i386
vir_guest2 node5 192.168.32.35/24 rhel5.5_i386
manager manager 192.168.32.33/24 rhel5.5_i386
ESXi ESXi 192.168.2.251/24 ESXi 3.5
二、安裝kvm
[root@target ~]# yum install -y qemu-kvm.x86_64 qemu-kvm-tools.x86_64 #安装kvm内核
[root@target ~]# yum install libvirt.x86_64 libvirt-cim.x86_64 libvirt-client.x86_64 libvirt-java.noarch libvirt-python.x86_64 #安装virt管理工具
[root@target ~]# modprobe kvm #加载kvm内核
[root@target ~]# modprobe kvm-intel #intel cpu加载kvm-intel内核,要支持全虚拟化,必须开启;要求cpu支持,通过bios可设置。
[root@target ~]# modprobe kvm-amd #amd cpu加载kvm-intel
[root@target ~]# modprobe -ls | grep kvm #查看内核是否开启
kernel/arch/x86/kvm/kvm.ko
kernel/arch/x86/kvm/kvm-intel.ko
kernel/arch/x86/kvm/kvm-amd.ko
[root@target ~]# modprobe -ls | grep kvm-intel
kernel/arch/x86/kvm/kvm-intel.ko
三、安装guest虚拟机
1、直接通过virt-manager安装、管理虚拟机(略)
2、通过命令行安装guest虚拟机
[root@target ~]# yum install virt-viewer #开启图形控制台安装虚拟客户机需要,
[root@target ~]# virt-install \ #安装选项可用virt-install --help查看
--name node4 \ #虚拟机名
--ram=1024 \ #分配内存大小,MB
--arch=x86_64 \ #模拟的CPU 构架
--vcpus=1 \ #配置虚拟机的vcpu 数目
--check-cpu \ #检查确定vcpu是否超过物理 CPU数目,如果超过则发出警告。
--os-type=linux \ #要安装的操作系统类型,例如:'linux'、'unix'、'windows'
--os-variant=rhel5 \ #操作系统版本,如:'fedora6', 'rhel5', 'solaris10', 'win2k'
--disk path=/virhost/node7.img,device=disk,bus=virtio,size=20,sparse=true \ #虚拟机所用磁盘或镜像文件,size大小G
--bridge=br0 \ #指定网络,采用透明网桥
--noautoconsole \ #不自动开启控制台
--pxe #网络安装
四、利用virsh对虚拟机管理
1、开关机
[root@target ~]# virsh start node4 #开机
[root@target ~]# virsh create /etc/libvirt/qemu/node4.xml #直接通过主机配置文档启动主机
[root@target ~]# virsh shutdown node4 #关机
[root@target ~]# virsh destroy node4 #强制关闭电源
[root@target ~]# virsh list --all #查看虚拟机状态
Id 名称 状态
----------------------------------
18 node4 running
- node5 关闭
- win8 关闭
2、添加删除虚拟机
[root@target ~]# virsh define /etc/libvirt/qemu/node5.xml #根据主机配置文档添加虚拟机
[root@target ~]# virsh list --all #node5已经添加
Id 名称 状态
----------------------------------
18 node4 running
- node5 关闭
- win8 关闭
[root@target ~]# virsh undefine node5 #移除虚拟机
[root@target ~]# ls /etc/libvirt/qemu
networks node4.xml win8.xml
[root@target ~]# virsh list --all #node5已经被移除
Id 名称 状态
----------------------------------
18 node4 running
- win8 关闭
3、远程管理虚拟机(qemu+ssh连接)
[root@target ~]# yum install virt-viewer
[root@target ~]# export DISPLAY=192.168.40.18:0.0
[root@target ~]# virt-viewer -c qemu///system node4 #本地管理虚拟机,system:获取system权限,注意qemu后是三个/
[root@manager ~]# virt-viewer -c qemu+ssh://[email protected]/system node4 #远程linux通过virt-viewer+ssh管理虚拟机
Xlib: extension "RANDR" missing on display "192.168.40.18:0.0".
[email protected]'s password:
[email protected]'s password:
#会弹出virt-viwer的gtk管理界面
4、使用已存在的虚拟机配置文档安裝新的虚拟机
[root@target ~]# qemu-img create -f qcow2 /virhost/kvm_node/node6.img 20G
#为新建虚拟机生产磁盘镜像文件
[root@target ~]# virsh list
Id 名称 状态
----------------------------------
18 node4 running
[root@target ~]# virsh dumpxml node4 >/etc/libvirt/qemu/node6.xml
#导出虚拟机node6的硬件配置信息为/etc/libvirt/qemu/node6.xml
[root@target ~]# vim /etc/libvirt/qemu/node6.xml
<domain type='kvm' id='20'> #修改node6的id号
<name>node6</name> #虚拟机node6的name
<uuid>4b7e91eb-6521-c2c6-cc64-c1ba72707fc7</uuid> #uuid必须修改,否则会和node4的冲突
<memory>524288</memory>
<currentMemory>524288</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='x86_64' machine='rhel5.4.0'>hvm</type>
<boot dev='network'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none'/>
<source file='/virhost/node4.img'/> #指定新虚拟机的硬盘文件
<target dev='vda' bus='virtio'/>
</disk>
<interface type='bridge'>
<mac address='54:52:00:69:d5:c7'/>
<source bridge='br0'/>
<target dev='vnet0'/>
<model type='virtio'/>
</interface>
<interface type='bridge'>
<mac address='54:52:00:69:d5:d7'/>
<source bridge='br0'/>
<target dev='vnet1'/>
<model type='virtio'/>
</interface>
<serial type='pty'>
<source path='/dev/pts/4'/>
<target port='0'/>
</serial>
<console type='pty' tty='/dev/pts/4'>
<source path='/dev/pts/4'/>
<target port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='5900' autoport='yes' keymap='en-us'/>
</devices>
</domain>
[root@target ~]# virsh define /etc/libvirt/qemu/node6.xml
#使用虚拟描述文档建立虚拟机,可用virsh edit node6修改node6的配置文件
[root@target ~]# virsh start node6
#启动虚拟机
5 为虚拟机开启vnc
[root@target ~]# virsh edit node4 #编辑node4的配置文件;不建议直接通过vim node4.xml修改。
<graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us'/>
#port='-1' autoport='yes':port自动分配,监听回环网络(virt-manager管理需要listen='127.0.0.1'),无密码
改为
<graphics type='vnc' port='5904' autoport='no' listen='0.0.0.0' keymap='en-us' passwd='xiaobai'/>
#固定vnc管理端口5904,不自动分配,vnc密码xiaobai,监听所有网络
2. 远程vnc访问地址:192.168.32.40:5904
创建lvm存储池容纳虚拟机镜像,同时远程连接物理主机进行管理。
创建lvm存储池的过程可以参考有关lvm的使用的文档。
远程连接主机需要被管理的物理主机开启远程root的功能,可以采用rsa加密提供密码的方式提高安全性,同时还可以采用限制访问ip的方法进一步保证安全。
virt-manager--->建立新的连接---->选择ssh连接方式
输入访问主机的用户和ip以及端口如:
[email protected]:168
然后输入密码就可以连接到远程的主机了。
由于使用的vnc来连接远程虚拟机的,所以可以显示图形界面,但是受网速影响较大。当然也可以采用RedHat开源的Spice技术来得到虚拟化桌面的效果,后者可以尝试。
五、存储池和存储卷的管理
1.创建 KVM主机存储池
1).创建基于文件夹(目录)的存储池
[root@target virhost]# virsh pool-define-as vmware_pool --type dir --target /virhost/vmware
#定义存储池vmware_pool
或
[root@target virhost]# virsh pool-create-as --name vmware_pool --type dir --target /virhost/vmware
#创建存储池vmware_pool,类型为文件目录,/virhost/vmware,与pool-define-as结果一样
2).创建基于文件系统的存储池
[root@target virhost]#virsh pool-define-as --name vmware_pool --type fs --source-dev /dev/vg_target/LogVol02 --source-format ext4 --target /virhost/vmware
或
[root@target virhost]#virsh pool-create-as --name vmware_pool --type fs --source-dev /dev/vg_target/LogVol02 --source-format ext4 --target /virhost/vmware
3).查看存储池信息
[root@target virhost]# virsh pool-info vmware_pool #查看存储域(池)信息
名称: vmware_pool
UUID: 2e9ff708-241f-fd7b-3b57-25df273a55db
状态: running
Persistent: no
自动启动: no
容量: 98.40 GB
分配: 18.39 GB
可用: 80.01 GB
4).启动存储池
[root@target virhost]# virsh pool-start vmware_pool #启动存储池
[root@target virhost]# virsh pool-list
名称 状态 自动开始
-----------------------------------------
default 活动 yes
virhost 活动 yes
vmware_pool 活动 no
5)销毁存储域,取消存储池
[root@target virhost]# virsh pool-destroy vmware_pool #销毁存储池
[root@target virhost]# virsh pool-list --all
名称 状态 自动开始
-----------------------------------------
default 活动 yes
virhost 活动 yes
vmware_pool 不活跃 no
[root@target virhost]# virsh pool-undefine vmware_pool #取消存储池的定义
[root@target virhost]# virsh pool-list --all
名称 状态 自动开始
-----------------------------------------
default 活动 yes
virhost 活动 yes
2.创建了存储池后,就可以创建一个卷,这个卷是用来做虚拟机的硬盘
[root@target virhost]# virsh vol-create-as --pool vmware_pool --name node6.img --capacity 10G --allocation 1G --format qcow2
#创建卷 node6.img,所在存储池为vmware_pool,容量10G,初始分配1G,文件格式类型qcow2
[root@target virhost]# virsh vol-info /virhost/vmware/node6.img #查看卷信息
名称: node6.img
类型: 文件
容量: 10.00 GB
分配: 136.00 KB
3.在存储卷上安装虚拟主机
[root@target virhost]#virt-install --connect qemu:///system \
-n node7 \
-r 512 \
-f /virhost/vmware/node7.img \
--vnc \
--os-type=linux \
--os-variant=rhel6 \
--vcpus=1 \
--network bridge=br0 \
-c /mnt/rhel-server-6.0-x86_64-dvd.iso
六、虚拟机的迁移(vmware 2 kvm)
1.安装软件
[root@target ~]# yum install -y virt-v2v.x86_64
[root@target ~]# rpm -ivh libguestfs-winsupport-1.0-7.el6.x86_64.rpm virtio-win-1.2.0-1.el6.noarch.rpm
#虚拟机为windows时需要libguestfs-winsupport 包来支持 NTFS 文件系统和 virtio-win 包来支持 Windows para-virtualized 存储和网络设备驱动
2.创建 KVM 主机存储域(略)
virt-v2v 在迁移虚拟机的过程中,需要拷贝被迁移虚拟机到 KVM 主机预先定义的存储池中。
3.创建 KVM 主机网络接口(略)
虚拟机在迁移之后将连接 KVM 主机网络, 因此主机必须有一个与之相匹配的网络接口,比如说网桥。
4.在 KVM 主机上创建或修改 $HOME/.netrc 文件,添加 VMware ESXi 服务器的用户名和密码。
[root@target ~]# cat ~/.netrc
machine 192.168.2.251 login root password xxxxxx
[root@target ~]# chmod 0600 ~/.netrc
5.Vmware ESXi到KVM的迁移
[root@target ~]# virt-v2v -ic esx://192.168.2.251/?no_verify=1 -op virhost -b br0 ipserver
** HEAD https://192.168.2.251/folder/tserver21/RHEL4.6-flat.vmdk?dcPath=ha-datacenter&dsName=ESX35-bak%3Astorage1 ==> 401 Unauthorized
** HEAD https://192.168.2.251/folder/tserver21/RHEL4.6-flat.vmdk?dcPath=ha-datacenter&dsName=ESX35-bak%3Astorage1 ==> 200 OK
** GET https://192.168.2.251/folder/tserver21/RHEL4.6-flat.vmdk?dcPath=ha-datacenter&dsName=ESX35-bak%3Astorage1 ==> 200 OK (2084s)
unknown filesystem /dev/hda
unknown filesystem /dev/fd0
virt-v2v: Installation failed because the following files referenced in the configuration file are required, but missing: rhel/4/kernel-smp-2.6.9-89.EL.i686.rpm
virt-v2v: 非 virtio 驱动程序配置的 tserver21
#所有选项可通过配置文件/etc/virt-v2v.conf来指定
#-op:指定用于转换后的存储域(pool),virhost
#-b:指定网络为网桥br0
#-ic:指定要转换的源地址
[root@target kvm_node]# virsh list --all
Id 名称 状态
----------------------------------
1 node4 running
- node5 关闭
- tserver21 关闭
- win8 关闭
[root@target kvm_node]# virsh start tserver21
6.KVM到KVM迁移
[root@target kvm_node]# virt-v2v -ic qemu+ssh://192.168.32.179/system -op virhost -b br0 node6
[email protected]'s password:
[email protected]'s password:
unknown filesystem label SWAP-vda3
virt-v2v: The connected hypervisor does not support a machine type of rhel5.4.0. It will be set to the current default.
virt-v2v: virtio 驱动程序配置的 node6
[root@target kvm_node]# virsh list --all
Id 名称 状态
----------------------------------
1 node4 running
- node5 关闭
- node6 关闭
- tserver21 关闭
- win8 关闭
[root@target kvm_node]# virsh start node6