openstack將本地實例遷移至ceph存儲中


需求:

最近在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM