一:创建两个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)

}

results matching ""

    No results matching ""