Libvirt有两种控制方式,命令行和图形界面
图形界面:
通过执行名virt-manager,启动libvirt的图形界面,在图形界面下可以一步一步的创建虚拟机,管理虚拟机,还可以直接控制虚拟机的桌面。
命令行:
virsh list #显示本地活动虚拟机
virsh list –all #显示本地所有的虚拟机(活动的+不活动的)
virsh define ubuntu.xml #通过配置文件定义一个虚拟机(这个虚拟机还不是活动的)
virsh start ubuntu #启动名字为ubuntu的非活动虚拟机
virsh create ubuntu.xml #创建虚拟机(创建后,虚拟机立即执行,成为活动主机)
virsh suspend ubuntu #暂停虚拟机
virsh resume ubuntu #启动暂停的虚拟机
virsh shutdown ubuntu #正常关闭虚拟机
virsh destroy ubuntu #强制关闭虚拟机
virsh dominfo ubuntu #显示虚拟机的基本信息
virsh domname 2 #显示id号为2的虚拟机名
virsh domid ubuntu #显示虚拟机id号
virsh domuuid ubuntu #显示虚拟机的uuid
virsh domstate ubuntu #显示虚拟机的当前状态
virsh dumpxml ubuntu #显示虚拟机的当前配置文件(可能和定义虚拟机时的配置不同,因为当虚拟机启动时,需要给虚拟机分配id号、uuid、vnc端口号等等)
virsh setmem ubuntu 512000 #给不活动虚拟机设置内存大小
virsh setvcpus ubuntu 4 #给不活动虚拟机设置cpu个数
virsh edit ubuntu #编辑配置文件(一般是在刚定义完虚拟机之后)
表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 | 修改虚拟处理器的数量 |
libvirt还提供了一个shell:virsh,直接执行名virsh即可获得一个特殊的shell:virsh,在这个virsh里面可以执行上面的命令(去掉前面的virsh)与本地libvirt交互,还可以通过命令connect命令连接远程libvirt,与之交互,例如:connect xen+ssh://root@10.4.122.11。另外可以只执行一条远程libvirt命令:virsh –c xen+ssh://root@10.4.122.11 list --all
ubuntu.xml配置文件举例:
<domain type='xen'> //域类型
<name>ubuntu</name> //虚拟机的名字
<memory>1048576</memory> //虚拟机的最大内存
<currentMemory>524288</currentMemory> //虚拟机当前的内存
<vcpu>2</vcpu> //该虚拟机的cpu数
<os>
<type>hvm</type> //hvm表示全虚拟化
<loader>/usr/lib/xen/boot/hvmloader</loader> //全虚拟化的守护进程所在的位置
<boot dev='hd'/> //hd表示从硬盘启动
</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/lib64/xen/bin/qemu-dm</emulator> //二进制模拟器设备的完整路径。
<disk type='file' device='disk'> //disk是用来描述磁盘的主要容器
<driver name='file'/>
<source file='/opt/awcloud/ubuntu/ubuntu.img'/> //指定磁盘上文件的绝对路径
<target dev='hda' bus='ide'/>
</disk>
<disk type='file' device='disk'>
<driver name='file'/>
<source file='/opt/awcloud/ubuntu/sdb.img'/>
<target dev='hdb' bus='ide'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='file'/>
<source file='/opt/awcloud/forest/ubuntu-10.04.3-desktop-i386.iso'/>
<target dev='hdc' bus='ide'/>
<readonly/>
</disk>
<serial type='pty'> //定义串口
<target port='0'/>
</serial>
<console type='pty'> //console用来代表交互性的控制台
<target port='0'/>
</console>
<interface type='bridge'> //桥接设备
<mac address='00:16:36:1e:1d:04'/> //MAC地址
<source bridge='virbr0'/>
</interface>
<graphics type='vnc' autoport='yes' keymap='en-us'/> //图形类型
</devices>
</domain>
注:
生成一个4G大小的空文件:dd if=/dev/zero of=./disk bs=1024 count=`expr 4 \* 1024 \* 1024`
修改虚拟机的启动设备:<boot dev='hd'/>从硬盘启动;<boot dev='cdrom'/>从CD启动
网络参数:
如ubuntu.xml配置文件,kvm虚拟机和xen虚拟机都只需要按照下面的模板进行配置,MAC地址是必须的,bridage的名字可能在不同的主机上是不一样,可能是virbr0,也可能是br0,但类型一定要是桥接模式就可以了
<interface type='bridge'>
<mac address='00:16:36:1e:1d:04'/>
<source bridge='virbr0'/>
</interface>
KVM虚拟机迁移:
迁移命令:virsh migrate –live<id or name> qemu+ssh://<dstip>/system tcp://<dstip>:49152
迁移完之后,本地机器可能仍是定义状态,要执行virsh undefine <name>清除。
注意:/dev/zero是一个输入设备,用来初始化文件。
/dev/null是个无底洞,可以向它输出任何数据,它通吃并且不会撑着。
实例:
1、使用ssh登入服务器:ssh 193.169=8.195.248
2、创建磁盘: qemu-img create -f qcow2 rhel6.5x64.img 15G
3、生成xml: virsh dumpxml rhel6.5x64 > rhelxml
4、编辑xml: vimrhelxml
a\修改name:rhel6.5x64
b\修改type: type=qcow2
c\修改mac地址: 改成不一样的就可以:比如: a1->a2;
d\修改两个source地址: iso img
e\去除uid那一行
5、定义xml:virsh define rhelxml
6、开启rhel6.5x64:virsh start rhel6.5x64
另外一些查看命令:
virsh list --all:查看所有的虚拟机的信息
virsh vncdispaly ID;
vnc viewer address:oprt
1、直接通过virt-manager安装、管理虚拟机(略)
2、通过命令行安装guest虚拟机
qemu-img create -f qcow2 /images/centos6.3-x86_64.img 10G
chown qemu:qemu /images/centos6.3-x86_64.img
virt-install --name centos6.3 --ram=1024 --arch=x86_64 --vcpus=1 --check-cpu --os-type=linux --os-variant='rhel6' -c /tmp/CentOS-6.3-x86_64-minimal.iso --disk path=/images/centos6.3-x86_64.img,device=disk,bus=virtio,size=10,format=qcow2 --bridge=br100 --noautoconsole --vnc --vncport=5902 --vnclisten=0.0.0.0
二、利用virsh对虚拟机管理
2、开关机
virsh start centos6.3 #开机
virsh create /etc/libvirt/qemu/centos6.3.xml #直接通过主机配置文档启动主机
virsh shutdown centos6.3 #关机
virsh destroy centos6.3 #强制关闭电源
virsh list --all #查看虚拟机状态
3、添加删除虚拟机
virsh define /etc/libvirt/qemu/node5.xml #根据主机配置文档添加虚拟机
virsh list --all #node5已经添加
virsh undefine node5 #移除虚拟机
ls /etc/libvirt/qemu
virsh list --all #node5已经被移除
4、使用已存在的虚拟机配置文档安裝新的虚拟机
qemu-img create -f qcow2 /virhost/kvm_node/node6.img 20G#为新建虚拟机生产磁盘镜像文件
virsh list
virsh dumpxml node4 >/etc/libvirt/qemu/node6.xml#导出虚拟机node6的硬件配置信息为/etc/libvirt/qemu/node6.xml
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的冲突
<source file='/virhost/node4.img'/> #指定新虚拟机的硬盘文件
virsh define /etc/libvirt/qemu/node6.xml #使用虚拟描述文档建立虚拟机,
可用virsh edit node6修改node6的配置文件
virsh start node6#启动虚拟机
5 为虚拟机开启vnc
virsh edit node4 #编辑node4的配置文件;不建议直接通过vim node4.xml修改。
<graphics type='vnc' port='-1' listen='127.0.0.1' keymap='en-us'/>
#port='-1' :port自动分配,监听回环网络(virt-manager管理需要listen='127.0.0.1'),无密码
改为
<graphics type='vnc' port='5904' listen='0.0.0.0' keymap='en-us' passwd='xiaobai'/>
#固定vnc管理端口5904,不自动分配,vnc密码xiaobai,监听所有网络
远程vnc访问地址:192.168.32.40:5904
三、存储池和存储卷的管理
1.创建 KVM主机存储池
virsh pool-define-as vmware_pool --type dir --target /virhost/vmware#定义存储池vmware_pool或
virsh pool-create-as --name vmware_pool --type dir --target /virhost/vmware
#创建存储池vmware_pool,类型为文件目录,/virhost/vmware,与pool-define-as结果一样
2).创建基于文件系统的存储池
virsh pool-define-as --name vmware_pool --type fs --source-dev /dev/vg_target/LogVol02 --source-format ext4 --target /virhost/vmware
或
virsh pool-create-as --name vmware_pool --type fs --source-dev /dev/vg_target/LogVol02 --source-format ext4 --target /virhost/vmware
3).查看存储池信息
virsh pool-info vmware_pool #查看存储域(池)
4).启动存储池
virsh pool-start vmware_pool #启动存储池
virsh pool-list
5)销毁存储域,取消存储池
virsh pool-destroy vmware_pool #销毁存储池
virsh pool-list --all
virsh pool-undefine vmware_pool #取消存储池的定义
virsh pool-list --all
2.创建了存储池后,就可以创建一个卷,这个卷是用来做虚拟机的硬盘
virsh vol-create-as --pool vmware_pool --name node6.img --capacity 10G --allocation 1G --format qcow2#创建卷 node6.img,所在存储池为vmware_pool,容量10G,初始分配1G,文件格式类型qcow2
virsh vol-info /virhost/vmware/node6.img #查看卷信息名称: node6.img类型:文件容量: 10.00 GB分配: 136.00 KB
3.在存储卷上安装虚拟主机
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
game over!
待续。。。。。
安装虚拟机
从 6 系列开始 RedHat 推荐使用 virt-install/virsh 系列工具操作 kvm,而不是直接使用 qemu-kvm,所以 qemu-kvm 被移到一个不起眼的地方 /usr/libexec/:
# qemu-kvm
-bash: qemu-kvm: command not found
# ls /usr/libexec/qemu-kvm
/usr/libexec/qemu-kvm
VPSee 采用 RedHat 推荐的方式(virt-install)安装虚拟机,这里以安装 Ubuntu-11.10-server-amd64.iso 为例:
# virt-install \
--name ubuntu \
--ram 512 \
--vcpus=1 \
--disk path=/root/ubuntu.img,size=10 \
--accelerate \
--cdrom /root/ubuntu-11.10-server-amd64.iso \
--graphics vnc
开始安装,创建硬盘 ubuntu.img 后就报错,用的是 root 帐号居然还 Permission denied?!
Starting install...
Creating storage file ubuntu.img | 10.0 GB 00:00
ERROR internal error Process exited while reading console log output: char device redirected to /dev/pts/1
qemu-kvm: -drive file=/root/ubuntu.img,if=none,id=drive-ide0-0-0,format=raw,cache=none: could not open disk image /root/ubuntu.img: Permission denied
Domain installation does not appear to have been successful.
If it was, you can restart your domain by running:
virsh --connect qemu:///system start ubuntu
otherwise, please restart your installation.
修改 qemu.conf 配置,把下面几个地方的注释去掉,然后把 dynamic_ownership 的值改成0,禁止 libvirtd 动态修改文件的归属:
# vi /etc/libvirt/qemu.conf
...
user = "root"
group = "root"
dynamic_ownership = 0
...
重启 libvirtd 服务再用上面的 virt-install 命令安装就应该可以了。这个时候 vnc 默认绑定的是本机 127.0.0.1,如果其他机器想用 vnc 客户端访问这台 kvm 服务器正在安装的 ubuntu 的话需要把 vnc 绑定到服务器的 IP 地址或者绑定到全局 0.0.0.0. 修改 qemu.conf 文件取消 vnc_listen 一行前面的注释,记得重启 libvirtd:
# vi /etc/libvirt/qemu.conf
...
vnc_listen = "0.0.0.0"