一:创建两个ceph pool
ceph osd pool create os_base_image 256 256 //用来存储制作好的基础镜像
ceph osd pool create cow_os_image 256 256 //这个pool是用来存储guest machine的镜像的COW
rbd -p os_base_image import /var/lib/libvirt/images/centos6-base centos6-base --image-format 2 //导入我们制作好的镜像
rbd --pool os_base_image snap create --snap centos6-base-snap centos6-base //创建snapshot
rbd --pool os_base_image snap protect --image centos6-base --snap centos6-base-snap //保护snapshot
创建用户
http://docs.ceph.org.cn/rbd/libvirt/
ceph auth get-or-create client.libvirt mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=kvm'
ceph auth get-or-create client.libvirtd mon 'allow r' old 'allow cl_refix _children'
二:定义存储池
参考资料:https://libvirt.org/storage.html
[root@idc02-dockerzone-10112314 ~]# cat ceph-pool.xml
<pool type="rbd">
<name>kvm</name>
<source>
<name>ceph-kvm-pool</name>
<host name='10.2.4.133' port='6789'/>
<host name='10.2.4.134' port='6789'/>
<host name='10.2.4.135' port='6789'/>
<auth username='admin' type='ceph'>
<secret uuid='51d1e5d6-9cbf-4a59-ba45-eb2a1965abda'/>
</auth>
</source>
</pool>
开始着手定义kvm存储池
virsh pool-define ceph-pool.xml
virsh pool-build kvm
virsh pool-start kvm
virsh pool-autostart kvm
virsh pool-list --all
三:domain XML定义
(
`rbd clone os_base_image/centos6-base@centos6-base-snap cow_os_image/2_2_2_2 //创建一个COW镜像`
rbd info cow_os_image/2_2_2_2
)
XML disk部分文件定义如下:
<disk type='network' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<auth username='admin'>
<secret type='ceph' uuid='51d1e5d6-9cbf-4a59-ba45-eb2a1965abda'/>
</auth>
<source protocol='rbd' name='cow_os_image/2_2_2_2'>
<host name='10.2.4.133' port='6789'/>
<host name='10.2.4.134' port='6789'/>
<host name='10.2.4.135' port='6789'/>
</source>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>
<disk type='network' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<auth username='admin'>
<secret type='ceph' uuid='51d1e5d6-9cbf-4a59-ba45-eb2a1965abda'/>
</auth>
<source protocol='rbd' name='kvm/2_2_2_2'>
<host name='10.2.4.133' port='6789'/>
<host name='10.2.4.134' port='6789'/>
<host name='10.2.4.135' port='6789'/>
</source>
<target dev='vdb' bus='virtio'/>
<iotune>
<read_iops_sec>2000</read_iops_sec>
<write_iops_sec>2000</write_iops_sec>
</iotune>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>
四:需要修改的代码
现在我们需要修改create volume方法(示意代码)
import libvirt "github.com/rgbkrk/libvirt-go"
import "github.com/contiv/librbd"
import "fmt"
import "strings"
fun CreateVolume(Name string, Size string) (string, int, error) {
conn, err := libvirt.NewVirConnection("qemu:///system")
pool, err := conn.LookupStoragePoolByName("kvm")
if err != nil {
return "", 0, err
}
volXML := `<volume>
<name>NAME</name>
<capacity unit='vm_disk_unit'>vm_disk_size</capacity>
<target>
<permissions>
<mode>0600</mode>
<owner>0</owner>
<group>6</group>
</permissions>
</target>
`` </volume>```
volxml := strings.Replace(volXML, "NAME", Name, -1)
volxml = strings.Replace(volxml, "vm_disk_size", Size, -1)
volxml = strings.Replace(volxml, "vm_disk_unit", "GiB", -1)
fmt.Println(volxml)
vol, err3 := pool.StorageVolCreateXML(volxml, 0)
if err3 != nil {
return "", 0, err3
}
volpath, err4 := vol.GetPath()
voltype, _ := vol.GetInfo()
ty := voltype.GetType()
return volpath, ty, err4
}
volpath, int, err := CreateVolume("2_2_2_2", "10")
替换原来创建qcow2的代码:
https://github.com/noahdesu/go-ceph
http://godoc.org/github.com/noahdesu/go-ceph
http://godoc.org/github.com/noahdesu/go-ceph/rados
http://godoc.org/github.com/noahdesu/go-ceph/rbd#Image.Clone
import (
"fmt"
"github.com/noahdesu/go-ceph/rados"
"github.com/noahdesu/go-ceph/rbd"
)
fun CreateCOWImage(Name string) {
conn, _ := rados.NewConn()
if err := conn.ReadConfigFile("/etc/ceph/ceph.conf"); err != nil {
fmt.Printf("Rbd read config failed: %v",err)
return
}
if err := conn.Connect(); err != nil {
fmt.Printf("Rbd connect failed: %v",err)
return
}
ioctx,_ := conn.OpenIOContext("os_base_image")
centos6_base_image := rbd.GetImage(ioctx, "centos6-base")
centos6_base_image.Open()
ioctx1,_ := conn.OpenIOContext("kvm")
centos6_base_image.Clone("centos6-base-snap", ioctx1, "2_2_2_2", rbd.RbdFeatureLayering)
}