最近在openstack上线了ceph存储,建立虚拟机和云硬盘都基于ceph卷进行存储和建立,可是以前openstack用的是本地存储,建立的全部实例都在本地文件中,当实例重启以后,openstack nova 自动会将libvirt.xml(实例的配置文件)渲染为使用ceph 卷磁盘.因此,就没法启动实例,由于此时实例中是没有disk的node
disk type="file" device="disk"> <driver name="qemu" type="qcow2" cache="none"/> <source file="/var/lib/nova/instances/dc2b76cc-9c9e-4ed0-925e-4a1d7306d183/disk"/> <target bus="virtio" dev="vda"/> </disk>
<disk type="network" device="disk"> <driver type="raw" cache="writeback"/> <source protocol="rbd" name="vms/49704562-e043-47fa-affb-b4e9f1ff1359_disk"> <host name="172.16.206.16" port="6789"/> <host name="172.16.206.19" port="6789"/> <host name="172.16.206.20" port="6789"/> </source> <auth username="cinder"> <secret type="ceph" uuid="3ca66ec4-dd87-4a3d-b7f9-f62a6662489f"/> </auth> <target bus="virtio" dev="vda"/> </disk>
# 查看目前ceph中的disk [root@ceph-node02 ~]# rbd -p vms ls 35ae9849-093d-4ffc-8453-3de46ecdef86_disk #导出disk [root@ceph-node02 ~]# rbd -p vms export 35ae9849-093d-4ffc-8453-3de46ecdef86_disk vm.raw Exporting image: 100% complete...done. [root@ceph-node02 ~]# mkdir vms # 查看导出的disk的分区信息 [root@ceph-node02 ~]# fdisk -lu vm.raw 磁盘 vm.raw:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x000e6c16 设备 Boot Start End Blocks Id System vm.raw1 * 2048 411647 204800 83 Linux vm.raw2 411648 8800255 4194304 82 Linux swap / Solaris vm.raw3 8800256 41943039 16571392 83 Linux #计算偏移量,只挂载指定的分区,因为这个磁盘有多个分区,因此,若是挂载指定的分区,需计算挂载的偏移量 [root@ceph-node02 ~]# echo "8800256*512" | bc 4505731072 #挂载 [root@ceph-node02 ~]# mount -o offset=4505731072 vm.raw vms [root@ceph-node02 ~]# ls vms bin cgroup dev home lib64 media opt root sbin srv tmp var boot data etc lib lost+found mnt proc run selinux sys usr
发现,其实ceph中存储的disk里面就是linux系统的文件python
[root@compute2 backup]# fdisk -lu disk 磁盘 disk:50 MB, 50659328 字节,98944 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 #发现没有disk里没有逻辑信息,忽然想到disk里的数据是基于base来增量存储的,下面合并一下数据试试 [root@compute2 backup]# qemu-img convert -p -f qcow2 disk -O qcow2 disk-boot.img #合并disk和base [root@compute2 backup]# fdisk -lu disk-boot.img 磁盘 disk-boot.img:965 MB, 965148672 字节,1885056 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 #发现仍然没有,尝试将磁盘格式从qcow2转换为raw试试 [root@compute2 backup]# qemu-img convert -f qcow2 -O raw disk-boot.img disk-boot.raw #转换成raw格式 [root@compute2 backup]# fdisk -lu disk-boot.raw 磁盘 disk-boot.raw:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x000e6c16 设备 Boot Start End Blocks Id System disk-boot.raw1 * 2048 411647 204800 83 Linux disk-boot.raw2 411648 8800255 4194304 82 Linux swap / Solaris disk-boot.raw3 8800256 41943039 16571392 83 Linux [root@compute2 backup]# mkdir test [root@compute2 backup]# mount -o offset=4505731072 disk-boot.raw test/ [root@compute2 backup]# ls test/ bin boot cgroup dev etc home lib lib64 lost+found media mnt opt proc root run sbin selinux srv sys tmp usr var
发现一摸同样。因此,了解到这些以后,理论上,咱们把本地实例的disk导入到ceph中,是可行的linux
[root@compute2 backup]#ls console.log disk disk.info libvirt.xml [root@compute2 backup]# qemu-img info disk image: disk file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 48M cluster_size: 65536 backing file: /var/lib/nova/instances/_base/d2d88bd0b8587d35602451d91cf9f3902756caaf Format specific information: compat: 1.1 lazy refcounts: false
发现磁盘格式为qcow2,磁盘逻辑大小为20G,实际大小为48M。因为disk是基于base来增量存储数据的,。因此,disk实例大小很小,。如今须要将增量数据和base数据进行合并服务器
[root@compute2 backup]# qemu-img convert -p -f qcow2 disk -O qcow2 disk-boot.img [root@compute2 backup]# ll -h disk-boot.img -rw-r--r-- 1 root root 921M 10月 18 11:05 disk-boot.img [root@compute2 backup]# qemu-img info disk-boot.img image: disk-boot.img file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 920M cluster_size: 65536 Format specific information: compat: 1.1 lazy refcounts: false
因为ceph存储只支持raw格式,因此须要将qcow2转换为rawui
[root@compute2 backup]# qemu-img convert -f qcow2 -O raw disk-boot.img disk-boot.raw [root@compute2 backup]# ll -h disk-boot.raw -rw-r--r-- 1 root root 20G 10月 18 11:05 disk-boot.raw [root@compute2 backup]# qemu-img info disk-boot.raw image: disk-boot.raw file format: raw virtual size: 20G (21474836480 bytes) disk size: 911M
#查看本实例的ID: 49704562-e043-47fa-affb-b4e9f1ff1359,因此生成的disk 为vms/49704562-e043-47fa-affb-b4e9f1ff1359_disk #将disk文件copy到ceph服务器上 #导入: [root@ceph-node02 ~]# rbd -p vms import disk-boot.raw --image 49704562-e043-47fa-affb-b4e9f1ff1359_disk 查看: [root@ceph-node02 ~]# rbd -p vms ls 49704562-e043-47fa-affb-b4e9f1ff1359_disk
最后重启启动实例便可url
## 因为ceph版本和python-rdb库和ceph服务器的版本不一致,致使启动失败:spa
libvirtError: internal error: early end of file from monitor: possible problem: 2016-10-17 18:01:24.682 15412 ERROR oslo_messaging.rpc.dispatcher 2016-10-17T10:01:24.051680Z qemu-kvm: -drive file=rbd:test_vms/c9f4dc2b-82c7-49d9-aca9-57c36c765f53_disk:id=test_cinder:key=AQDrw/1XGO34MBAAitTih7agTaNISDG2dYZ90w==:auth_supported=cephx;none:mon_host=172.16.206.16:6789;172.16.206.19:6789;172.16.206.20:6789,if=none,id=drive-virtio-disk0,format=raw,cache=writeback: error reading header from c9f4dc2b-82c7-49d9-aca9-57c36c765f53_disk
解决办法:将本地ceph 和python-rdb的版本升级到ceph服务器版本便可解决3d
附ceph 源:code
[ceph] name=ceph baseurl=http://download.ceph.com/rpm-jewel/el7/x86_64/ gpgcheck=0 enabled=1 [ceph-deploy] name=ceph-deploy baseurl=http://download.ceph.com/rpm-jewel/el7/noarch/ gpgcheck=0 enabled=1