需求:

最近在openstack上线了ceph存储,创建虚拟机和云硬盘都基于ceph卷进行存储和创建,但是之前openstack用的是本地存储,创建的所有实例都在本地文件中,当实例重启之后,openstack nova 自动会将libvirt.xml(实例的配置文件)渲染为使用ceph 卷磁盘.所以,就无法启动实例,因为此时实例中是没有disk的

  • 基于本地存储的实例

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>
  • 基于ceph存储的实例

<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里面究竟是什么?

  • 导出ceph中的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系统的文件

用同样的方法,查看本地实例disk中是否和ceph的disk一样


[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中,是可行的

操作步骤:

生成数据盘

  • 查看实例的磁盘信息:

[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转换为raw


[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

将磁盘导入ceph中


#查看本实例的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

最后重启启动实例即可

期间遇到的种种问题:

由于ceph版本和python-rdb库和ceph服务器的版本不一致,导致启动失败:


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服务器版本即可解决

附ceph 源:


[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

openstack将本地实例迁移至ceph存储中的更多相关文章

  1. 深度长文:深入理解Ceph存储架构

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 本文是一篇Ceph存储架构技术文章,内容深入到每个存储特 ...

  2. Oracle 11g Rac 用rman实现把本地数据文件迁移到ASM共享存储中

    在Oracle Rac环境中,数据文件都是要存放在ASM共享存储上的,这样两个节点才能同时访问.而当你在某一节点下把数据文件创建在本地磁盘的时候,那么在另一节点上要访问该数据文件的时候就会报错,因为找 ...

  3. OpenStack 虚拟机冷/热迁移功能实践与流程分析

    目录 文章目录 目录 前文列表 虚拟机迁移的应用场景 需要迁移的虚拟机数据类型 虚拟机迁移的存储场景 文件存储 块存储 非共享存储 迁移的类型 迁移的方式 执行虚拟机冷迁移 冷迁移日志分析 执行虚拟机 ...

  4. Ceph 存储集群4-高级运维:

    一.高级运维 高级集群操作主要包括用 ceph 服务管理脚本启动.停止.重启集群,和集群健康状态检查.监控和操作集群. 操纵集群 运行 Ceph 每次用命令启动.重启.停止Ceph 守护进程(或整个集 ...

  5. 002.RHCS-配置Ceph存储集群

    一 前期准备 [kiosk@foundation0 ~]$ ssh ceph@serverc #登录Ceph集群节点 [ceph@serverc ~]$ ceph health #确保集群状态正常 H ...

  6. Ceph 存储集群5-数据归置

    一.数据归置概览 Ceph 通过 RADOS 集群动态地存储.复制和重新均衡数据对象.很多不同用户因不同目的把对象存储在不同的存储池里,而它们都坐落于无数的 OSD 之上,所以 Ceph 的运营需要些 ...

  7. Ceph 存储集群1-配置:硬盘和文件系统、配置 Ceph、网络选项、认证选项和监控器选项

    所有 Ceph 部署都始于 Ceph 存储集群.基于 RADOS 的 Ceph 对象存储集群包括两类守护进程: 1.对象存储守护进程( OSD )把存储节点上的数据存储为对象: 2.Ceph 监视器( ...

  8. OpenStack 虚拟机冷/热迁移的实现原理与代码分析

    目录 文章目录 目录 前文列表 冷迁移代码分析(基于 Newton) Nova 冷迁移实现原理 热迁移代码分析 Nova 热迁移实现原理 向 libvirtd 发出 Live Migration 指令 ...

  9. Ceph 存储集群2-配置:心跳选项、OSD选项、存储池、归置组和 CRUSH 选项

    一.心跳选项 完成基本配置后就可以部署.运行 Ceph 了.执行 ceph health 或 ceph -s 命令时,监视器会报告 Ceph 存储集群的当前状态.监视器通过让各 OSD 自己报告.并接 ...

随机推荐

  1. Json转list,两种包,两种方式

    1.使用fastjson 对于json串大小写没什么要求,测试的时候,我把javaBean属性设置成和json串一样的大小写,代码如下: package com.myTest.json.test1; ...

  2. 4G模块ME3760_V2 端口映射

    /dev/ttyUSB0      ECM        // ECM 口 /dev/ttyUSB1      /             //ECM口 /dev/ttyUSB2      AT    ...

  3. java方法——重载2

    什么是Java方法重载 方法重载的定义 1 对于同一个类,如果这个类里面有两个或者多个重名的方法,但是方法的参数个数.类型.顺序至少有一个不一样,这时候局构成方法重载. END 方法重载示例 1 pu ...

  4. iOS边练边学--UIScrollView的属性简单使用,代理的简单介绍以及内容缩放

    一.什么是UIScrollView *移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也是相当有限 *当展示的内容较多,超出一个屏幕时,用户可通过滚动收拾来查看屏幕以外的内容 *普通的UI ...

  5. 看板与Scrum:哪个更适合你的团队?

    敏捷是理想型指标和原则,看板和Scrum是帮助团队坚持敏捷原则并完成工作的基本框架.本文详细介绍了在Scrum和看板之间做出选择时要考虑的关键因素,以及如果我们无法做出决定时该怎么办. Scrum和看 ...

  6. 统一建模语言 UML

    目录 统一建模语言 UML UML定义了5类10种模型图 一用例图用于建立需求模型 二静态图主要描述系统的静态表示和关系包括类图包图对象图 三行为图描述系统动态模型和对象组成的交换关系包括状态图和活动 ...

  7. e662. 取的图像的色彩模型

    // This method returns the color model of an image public static ColorModel getColorModel(Image imag ...

  8. (转)MFC鼠标单击消息拦截双击消息

    如果LButtonDown和LButtonDblClk同时有实现的话 总会实现单击消息,在网上找解决方法,思想是在单击消息实现中取时间,计算两次单击事件的时间差 来回尝试修改,最后成这个样子,还算简单 ...

  9. 查看CentOS的网络带宽出口

    检查维护系统的时候,经常会要查看服务器的网络端口是多大的,所以需要用到Linux的一个命令. 如何查看CentOS的网络带宽出口多大?可以用下面的命令来查看. # ethtool eth0 前面是命令 ...

  10. mac Virtualbox Ubuntu 设置共享目录

    如果要用VirtualBox自带的共享文件夹功能,必须先安装Guest Additions.安装方法:置顶的菜单条->devices->Install Guest Additions.点击 ...