openstack之存储


OpenStack提供两种块存储: ephemeral storage和volumes storage.

ephemeral storage 具有和实例相同的生命周期,重启实例并不会影响ephemeral storage中存储的内容,但终结实例的时候ephemeral storage也会随之被释放掉,所有的实例又会有一个ephemeral storage,但其大小可以设置为0。volumes storage是一种独立的虚拟块设备,不依赖于实例,volumes一次只能连接到一个实例,但是可以像USB设备那样,从一个实例上卸载,再连接到另一个实例,其中的数据会一直保存着。

ephemeral storage

ephemeral storage和实例是一一对应的,它的空间大小由实例的flavor模板定义。其中的数据在实例的生命周期中是一直存在的,重启实例或者openstack服务器都不会擦除其中的数据。通常情况下,实例的root文件系统是存储在ephemeral storage中的,这可能让不熟悉云计算的人感到不习惯。除了作为root文件系统的ephemeral storage之外,实例还可以有一个额外的ephemeral storage。这个额外的ephemeral storage的大小同样是可以配置的。在实例中,这块额外的ephemeral storage是以原始的块设备形式提供的,没有分区和创建文件系统。云上的操作系统镜像可以发现、格式化并挂载这个设备。例如,安装有cloud-in的Ubuntu cloud镜像中,这个设备会被格式化为ext3格式并挂载到/mnt目录下。

Volume Storage

Volume Storage是独立于任何实例的,它也是一个没有分区和文件系统的原始的块设备。Volume Storage必须被附加到一个实例上才能被分区、格式化并使用。分区并创建文件系统之后,volume Storage就像一个外置的磁盘一样,可以被附加到某一个实例下,也可以从一个实例上卸载并附件到另一个实例上。

Volume Storage也可以被用作启动设备、将root文件系统放在Volume Storage中,这样,一个实例看起来就像是非云平台上的虚拟机一样、可以永久地存在。

一个Volume Storage不能同时附加到多个实例中,如果需要能够并发访问的文件系统,可以使用NFS、CIFS或者分布式的文件系统。



Openstack nova的存储、ephemeral以及虚拟机实例的备份与恢复  

2012-07-28 11:02:49|  分类: 云计算 |  标签:openstack  nova  ephemeral  存储  qemu-img   |举报 |字号 订阅


一个例子:
# ll -h
-rw-r--r--. 1 root root 204M Feb 29 19:21 f16-x86_64-openstack-sda.qcow2

# qemu-img info f16-x86_64-openstack-sda.qcow2     
image: f16-x86_64-openstack-sda.qcow2
file format: qcow2
virtual size: 9.8G (10486808576 bytes)
disk size: 204M
cluster_size: 65536
可以看到204M就是文件大小。

# nova flavor-list
+----+-----------+-----------+------+-----------+------+-------+-------------+
| ID |    Name   | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor |
+----+-----------+-----------+------+-----------+------+-------+-------------+
| 2  | m1.small  | 2048      |   10    |   20         |      | 1     | 1.0         |
+----+-----------+-----------+------+-----------+------+-------+-------------+
small类型持久硬盘为10GB,临时硬盘为20GB。

把上面的虚拟机以small方式启动起来。
# file /var/lib/nova/instances/instance-0000001e/disk
/var/lib/nova/instances/instance-0000001e/disk: QEMU QCOW Image (v2), has backing file (path /var/lib/nova/instances/_base/4fc90f26a53998d2a785ca85d95fab5d9), 10737418240 bytes
这个disk对应10GB的backing file,在../../_base目录下。

# file /var/lib/nova/instances/instance-0000001e/disk.local 
/var/lib/nova/instances/instance-0000001e/disk.local: QEMU QCOW Image (v2), has backing file (path /var/lib/nova/instances/_base/ephemeral_0_20_None), 21474836480 bytes
这个disk.local对应20GB的backing file,在../../_base目录下。

# ll -h /var/lib/nova/instances/_base/           
total 9.1G
-rw-r--r--. 1 nova nova   9.8G  Jul 20 17:23 4fc90f26a53998d2a785ca85d95fab5d9063bf78
-rw-r--r--. 1 nova qemu    10G  Jul 20 17:23 4fc90f26a53998d2a785ca85d95fab5d9063bf78_10
-rw-r--r--. 1 nova nova   204M  Jul 18 11:43 4fc90f26a53998d2a785ca85d95fab5d9063bf78.part
-rw-r--r--. 1 qemu qemu    20G  Jul 18 11:43 ephemeral_0_20_None
这里10G对应small里面的10G,20G对应small里面的20G,204M对应文件大小,9.8GB对应虚拟磁盘大小。

进入虚拟机里面,查看硬盘配置:
# fdisk -l
WARNING: GPT (GUID Partition Table) detected on '/dev/vda'! The util fdisk doesn't support GPT. Use GNU Parted.
Disk /dev/vda:   10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
   Device Boot      Start         End      Blocks   Id  System
/dev/vda1               1    20482047    10241023+  ee  GPT

Disk /dev/vdb:   21.5 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/vdb doesn't contain a valid partition table
这里的10GB对应small的10GB,20GB对应small的20GB。

虚拟机里面查看文家系统:
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs          9.2G  713M  8.4G   8% /
devtmpfs        995M     0  995M   0% /dev
tmpfs          1003M     0 1003M   0% /dev/shm
tmpfs          1003M   40M  963M   4% /run
/dev/vda2       9.2G  713M  8.4G   8% /
tmpfs          1003M   40M  963M   4% /run
tmpfs          1003M     0 1003M   0% /sys/fs/cgroup
tmpfs          1003M     0 1003M   0% /media




    在 nova 裡面, 它將 volume 分成了兩個類型, 一種是關機後就會消失的 ephemeral volume, 另一種則是會繼續存在的 persistent volume, 即使 Virtual Machine 關機後, 你仍可以產生新的 Virtual Machine, 然後將這個 persistent volume 掛上去

而 ephemeral volume 目前會用在兩個地方, 第一個是開機用的主硬碟 (Root Disk), 如果你跑的程式有需要使用額外的空間, 那可以要求多一顆暫用硬碟(Ephemeral Disk), 但仍要注意這個 disk 在關機後就會消失.

我們可以在 Flavor 內看到 Openstack 預設的幾種組合(tiny 的那個雖然寫著沒有 root disk, 但其實仍然有, 只是比較小, 只有 2G)



m1.tiny (1VCPU / 0GB disk / 512MB RAM) 的狀況

ubuntu@vm1:~$ sudo fdisk -l Disk /dev/vda: 2147 MB, 2147483648 bytes 255 heads, 63 sectors/track, 261 cylinders, total 4194304 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000     Device Boot      Start         End      Blocks   Id  System /dev/vda1   *       16065     4192964     2088450   83  Linux   ubuntu@vm1:~$ sudo less /proc/meminfo | grep -i total MemTotal:         503520 kB SwapTotal:             0 kB VmallocTotal:   34359738367 kB HugePages_Total:       0  ubuntu@vm1:~$ sudo less /proc/cpuinfo | grep CPU model name      : QEMU Virtual CPU version 1.0  ubuntu@vm1:~$ sudo df -h Filesystem      Size  Used Avail Use% Mounted on /dev/vda1       2.0G  667M  1.3G  35% / udev            242M   12K  242M   1% /dev tmpfs            99M  204K   99M   1% /run none            5.0M     0  5.0M   0% /run/lock none            246M     0  246M   0% /run/shm  

m1.small (1VCPU / 10GB disk / 2048MB RAM) 的狀況, 可以看到比 m1.tiny 多了一個 /dev/vdb , 大小是 20G

ubuntu@vm2:~$ sudo fdisk -l  Disk /dev/vda: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000     Device Boot      Start         End      Blocks   Id  System /dev/vda1   *       16065    20964824    10474380   83  Linux  Disk /dev/vdb: 21.5 GB, 21474836480 bytes 16 heads, 63 sectors/track, 41610 cylinders, total 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000  Disk /dev/vdb doesn't contain a valid partition table  ubuntu@vm2:~$ sudo less /proc/meminfo | grep -i total MemTotal:        2051772 kB SwapTotal:             0 kB VmallocTotal:   34359738367 kB HugePages_Total:       0  ubuntu@vm2:~$ sudo less /proc/cpuinfo | grep CPU model name      : QEMU Virtual CPU version 1.0  ubuntu@vm2:~$ sudo df -h Filesystem      Size  Used Avail Use% Mounted on /dev/vda1       9.9G  670M  8.7G   7% / udev            998M  8.0K  998M   1% /dev tmpfs           401M  208K  401M   1% /run none            5.0M     0  5.0M   0% /run/lock none           1002M     0 1002M   0% /run/shm /dev/vdb         20G  173M   19G   1% /mnt 

回到 compute node 上面去看


# 可以看到有兩個 virtual machine 正在跑 wistor@ubuntu83:~$ sudo virsh list [sudo] password for wistor:  Id Name                 State ----------------------------------   3 instance-00000007    running   4 instance-00000009    running  # 這個只有 vda, 合理的判斷應該是 m1.tiny wistor@ubuntu83:~$ sudo virsh domblklist 3 Target     Source ------------------------------------------------ vda        /var/lib/nova/instances/instance-00000007/disk  # 這個有 vda 和 vdb, 應該就是 m1.small wistor@ubuntu83:~$ sudo virsh domblklist 4 Target     Source ------------------------------------------------ vda        /var/lib/nova/instances/instance-00000009/disk vdb        /var/lib/nova/instances/instance-00000009/disk.local  # 先到 tiny 的資料夾去看, 可以發現有 disk 這個檔案, 還有一個 libvirt.xml # 但為什麼 disk 大小只有 118M ? 而不是 2G? wistor@ubuntu83:/var/lib/nova/instances/instance-00000007$ ll -h total 115M drwxrwxr-x 2 nova         nova 4.0K May 29 13:54 ./ drwxr-xr-x 6 nova         nova 4.0K May 29 13:57 ../ -rw-rw---- 1 libvirt-qemu kvm   21K May 29 13:55 console.log -rw-r--r-- 1 libvirt-qemu kvm  118M May 29 14:07 disk -rw-rw-r-- 1 nova         nova 1.5K May 29 13:54 libvirt.xml  # 看一下 disk 是什麼東西, 結果發現他是 QCOW 格式, backing file 在 _base 裡面 wistor@ubuntu83:/var/lib/nova/instances/instance-00000007$ file disk disk: QEMU QCOW Image (v2), has backing file (path /var/lib/nova/instances/_base/20938b475c7d805e707888fb2a3196550), 2147483648 bytes  # 看一下 _base 底下有什麼東西 wistor@ubuntu83:/var/lib/nova/instances/_base$ ll -h total 3.1G drwxrwxr-x 2 nova         nova 4.0K May 27 23:35 ./ drwxr-xr-x 6 nova         nova 4.0K May 29 13:57 ../ -rw-r--r-- 1 libvirt-qemu kvm  2.0G May 27 23:57 20938b475c7d805e707888fb2a31965508d0bb4b -rw-r--r-- 1 libvirt-qemu kvm   10G May 27 23:57 20938b475c7d805e707888fb2a31965508d0bb4b_10 -rw-r--r-- 1 libvirt-qemu kvm   20G May 27 23:28 ephemeral_0_20_None  # 而這個 backend 的大小剛好就是 2G, 而且是個 boot sector, 所以他就是 tiny 的 boot disk wistor@ubuntu83:/var/lib/nova/instances/_base$ file 20938b475c7d805e707888fb2a31965508d0bb4b 20938b475c7d805e707888fb2a31965508d0bb4b: x86 boot sector; partition 1: ID=0x83, active, starthead 0, startsector 16065, 4176900 sectors, code offset 0x63  # 接下來看看 small 的資料夾, 可以發現多一個 disk.local wistor@ubuntu83:/var/lib/nova/instances/instance-00000009$ ll -h total 395M drwxrwxr-x 2 nova         nova 4.0K May 29 13:57 ./ drwxr-xr-x 6 nova         nova 4.0K May 29 13:57 ../ -rw-rw---- 1 libvirt-qemu kvm   21K May 29 13:58 console.log -rw-r--r-- 1 libvirt-qemu kvm  390M May 29 14:13 disk -rw-r--r-- 1 libvirt-qemu kvm   12M May 29 13:58 disk.local -rw-rw-r-- 1 nova         nova 1.7K May 29 13:57 libvirt.xml  # 發現他也是 qcow 格式, backing file 也在 _base 下 wistor@ubuntu83:/var/lib/nova/instances/instance-00000009$ file disk.local disk.local: QEMU QCOW Image (v2), has backing file (path /var/lib/nova/instances/_base/ephemeral_0_20_None), 21474836480 bytes  # 這個就是 ephemeral disk, 大小為 20G wistor@ubuntu83:/var/lib/nova/instances/_base$ file ephemeral_0_20_None ephemeral_0_20_None: Linux rev 1.0 ext3 filesystem data, UUID=e886c848-3a77-4e2c-b6d6-4d77eb51f8da, volume name "ephemeral0" (large files) 


另下來就是測試一下 persistent volume. 透過 UI 或是 command line, 我們生成一個大小為 10G 的 volume, 並且把它 attach 到 vm2 (m1.small)

Openstack nova的存储、ephemeral以及虚拟机实例的备份与恢复 - 见龙在天 - 见龙在天

# 從 nova 的 command line 可以看到新增的 volume 
wistor@ubuntu83:~$ sudo -i nova volume-list
 +----+-----------+--------------+------+-------------+-------------+ | ID |   Status  | Display Name | Size | Volume Type | Attached to |
 +----+-----------+--------------+------+-------------+-------------+ | 3  | available | volume1      | 10   | None        |             | 
+----+-----------+--------------+------+-------------+-------------+  
# 在 lvm 內也可以看到這個新的 volume 
wistor@ubuntu83:~$ sudo lvscan   ACTIVE            '/dev/nova-volumes/volume-00000003' [10.00 GiB] inherit 
 # 可以看到 tgt 把這個 volume export 出去變成一個 iscsi target 
wistor@ubuntu83:~$ sudo tgt-admin -s Target 1: iqn.2010-10.org.openstack:volume-00000003     System information:         Driver: iscsi         State: ready     I_T nexus information:     LUN information:         LUN: 0             Type: controller             SCSI ID: IET     00010000             SCSI SN: beaf10             Size: 0 MB, Block size: 1             Online: Yes             Removable media: No             Readonly: No             Backing store type: null             Backing store path: None             Backing store flags:         LUN: 1             Type: disk             SCSI ID: IET     00010001             SCSI SN: beaf11             Size: 10737 MB, Block size: 512             Online: Yes             Removable media: No             Readonly: No             Backing store type: rdwr             Backing store path: /dev/nova-volumes/volume-00000003             Backing store flags:     Account information:     ACL information:         ALL  # 然後使用 open iscsi initiator 連線到這個 iscsi target  wistor@ubuntu83:~$ sudo iscsiadm -m session tcp: [5] 172.17.123.83:3260,1 iqn.2010-10.org.openstack:volume-00000003  

# 然後就多一個 device 
wistor@ubuntu83:/dev/disk/by-path$ ll lrwxrwxrwx 1 root root   9 May 29 14:23 ip-172.17.123.83:3260-iscsi-iqn.2010-10.org.openstack:volume-00000003-lun-1 -> ../../sdf  wistor@ubuntu83:~$ sudo fdisk -l /dev/sdf  Disk /dev/sdf: 10.7 GB, 10737418240 bytes 64 heads, 32 sectors/track, 10240 cylinders, total 20971520 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000  Disk /dev/sdf doesn't contain a valid partition table  # 然後也可以看到 vm2 上面又多了一個 device wistor@ubuntu83:~$ sudo virsh domblklist 4 Target     Source ------------------------------------------------ vda        /var/lib/nova/instances/instance-00000009/disk vdb        /var/lib/nova/instances/instance-00000009/disk.local vdc        /dev/disk/by-path/ip-172.17.123.83:3260-iscsi-iqn.2010-10.org.openstack:volume-00000003-lun-1 
PS1. 目前發現在 vm 有掛載額外的 volume 時, 重開機會有問題

openstack中 虚拟机实例的备份与恢复

openstack中,虚拟机实例一般是放在nova/instances目录底下.

该目录的典型结构如下所示:

root@node77:~# ls /opt/stack/nova/instances/
_base instance-0000001a

其中

_base目录中存放的是虚拟机实例的base image

而instance-0000001a存放的是虚拟机实例镜像的增量部分。

instance-0000001a目录有如下的一些文件:

root@node77:~# ls /opt/stack/nova/instances/instance-0000001a/
console.log disk disk.local libvirt.xml

其中

console.log 保存虚拟机启动的日志信息

disk 和 disk.local为虚拟机实例的镜像文件

libvirt.xml为配置文件。

这其中需要注意的是,disk和disk.local并没有包含该虚拟机的所有数据,它们只是基于base image的增量部分

我们通过kvm-image 工具可以查看该信息,如下:

root@node77:/opt/stack/nova/instances/instance-0000001a# kvm-img info disk
image: disk
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 1.6G
cluster_size: 2097152
backing file: /opt/stack/nova/instances/_base/5dcb736a3fbb7f5b92657095aa77a877f4039ec0_10 (actual path: /opt/stack/nova/instances/_base/5dcb736a3fbb7f5b92657095aa77a877f4039ec0_10)

 

root@node77:/opt/stack/nova/instances/instance-0000001a# kvm-img info disk.local 
image: disk.local
file format: qcow2
virtual size: 40G (42949672960 bytes)
disk size: 4.0M
cluster_size: 2097152
backing file: /opt/stack/nova/instances/_base/ephemeral_0_40_None (actual path: /opt/stack/nova/instances/_base/ephemeral_0_40_None)

其中backing file 即是base image

因此我们在备份虚拟机实例的时候,不仅要备份instance-0000001a目录下的数据,而且要备份该虚拟机相关的base image数据,即backing file给出的文件。

 

对于该例子:

我们需要备份如下的文件:

(1)console.log

(2)disk

(3)disk.local

(4)libvirt.xml

(5)/opt/stack/nova/instances/_base/ephemeral_0_40_None

(6)/opt/stack/nova/instances/_base/5dcb736a3fbb7f5b92657095aa77a877f4039ec0_10

 

如何根据备份的文件,在另外一台机器上恢复该虚拟机:

方法1:

我们将disk 和 disk.local磁盘文件分别和它们的base image合并,生成两个新的磁盘文件,那么这两个磁盘文件将包含虚拟机所有的数据。

 qemu-img convert [-c] [-f format] [-o options] [-O output_format] filename output_filename
qemu-img convert disk –O qcow2 newdisk
 qemu-img convert disk.local –O qcow2 newdisk.local

 

方法2:

我们修改disk和disk.local文件中backing file的位置,为当前base image的位置

qemu-img rebase [-f format] [-u] -b backing_file [-F backing_format] filename
正确处理完磁盘文件后,剩下的工作就是按照libvirt.xml文件的设置,启动虚拟机了。 




root@ubuntu:/opt/stack/data/nova/instances/f17c8e1b-4fb5-4d67-a116-4abef8e8b00a# virsh domblklist 7
Target     Source
------------------------------------------------
vda        /opt/stack/data/nova/instances/f17c8e1b-4fb5-4d67-a116-4abef8e8b00a/disk
vdb        /opt/stack/data/nova/instances/f17c8e1b-4fb5-4d67-a116-4abef8e8b00a/disk.local
vdc        /dev/disk/by-path/ip-192.168.220.3:3260-iscsi-iqn.2010-10.org.openstack:volume-b68926a3-643e-4858-ba23-e4de1f9cb206-lun-1
hdd        /opt/stack/data/nova/instances/f17c8e1b-4fb5-4d67-a116-4abef8e8b00a/disk.config



OpenStack虚拟机创建过程中镜像格式的的变化过程 

Glance用来作为独立的大规模镜像查找服务,当它与Nova和Swift配合使用时,就为OpenStack提供了虚拟机镜像的查找服务,像所有的OpenStack项目一样,遵循以下设计思想: 
  • 基于组件的架构 - 便于快速增加新特性
  • 高可用性 - 支持大负荷
  • 容错性 - 独立的进程地址空间,避免串行错误
  • 开放标准 - 对社区驱动的API提供参考实现

1. Glancle架构

    Glance主要由三个部分构成:glance-api、glance-registry以及image store。

  • Glance-api接收REST API的请求,类似nova-api;

          Glance-api在功能上与nova-api十分类似,都是接收REST API请求,然后通过其他模块(glance-registry及image store)来完成诸如镜像的查找、获取、上传、删除等操作,i默认监听端

          口9292。

  • glance-registry用于与MySQL数据库交互,用于存储或获取镜像的元数据(metadata);

          Glance-registry用于提供镜像元数据相关的REST接口,通过glance-registry,可以向数据库中写入或获取镜像的各种数据,glance-registry监听端口9191。Glance的数据库中有两张表,

          一张是image表,另一张是image property表。Image表保存了镜像格式、大小等信息;image property表则主要保存镜像的定制化信息。

  • image store是一个存储的接口层,通过这个接口,glance可以获取镜像,image store支持的存储有Amazon的S3、OpenStack本身的Swift,还有诸如ceph,sheepdog,GlusterFS等分布式存储。

          Image store是镜像保存与获取的接口,它仅仅是一个接口层,具体的实现需要外部的存储支持,目前,支持的接口有Amazon S3、GlusterFS、Swift,sheepdog,ceph等。

    Glance体系结构如下图所示,通过glance,OpenStack的三个模块计算组件(nova)、镜像管理组件(glance)、存储组件(swift,ceph,sheepdog等)被连接成一个整体,Glance为Nova提供镜像的查找等操作,而存储组件又为Glance提供了实际的存储服务。而Swift,ceph,gluster,sheepdog等又是Glance存储接口的一些具体实现,Glance的存储接口还能支持S3等第三方的商业组件。

2. Openstack创建虚拟机的过程中镜像文件格式的变化过程

   这里通过OpenStack的horizon组件来创建一个m1.small的virtual machine,来详细分析下镜像格式的变化以及glance底层具体执行的哪些操作。

(1)首先看一下Glance管理的镜像,如果采用local storage,glance将镜像文件默认存储到/var/lib/glance/image目录下,这里我们选择c036d689-0336-4fcd-a8e0-4aed4dd5e420这个镜像来作为创建虚拟机的模板,此镜像是通过如下命令添加的,因此在horizon中显示的名称为:Precise x86_64。

  1. glance add name="Precise x86_64" is_public=true
  2. container_format=ovf disk_format=qcow2
  3. < ubuntu-12.04-server-cloudimg-amd64-disk1.img
    1. ubuntu@compute-63-02:/var/lib/glance/images$ ll -alh
    2. total 2.5G
    3. drwxr-xr-x 2 glance glance 4.0K Jan 30 01:30 ./
    4. drwxr-xr-x 6 glance glance 4.0K Dec 27 21:11 ../
    5. -rw-r----- 1 glance glance 768M Dec 27 04:31 5b298155-8bcf-442f-bc83-bc52f3fe5be9
    6. -rw-r----- 1 glance glance 712M Jan 30 01:31 8760d55b-0d91-4987-8980-d6659c7856ab
    7. -rw-r----- 1 glance glance 223M Dec 25 03:58 c036d689-0336-4fcd-a8e0-4aed4dd5e420
    8. -rw-r----- 1 glance glance 768M Dec 27 04:44 d771b2ce-9310-4757-8ec5-d80f8d1e1712
    通过qemu-img info命令,先看一下镜像文件的大小和格式如下:
    1. ubuntu@compute-63-02:/var/lib/glance/images$ sudo qemu-img info c036d689-0336-4fcd-a8e0-4aed4dd5e420
    2. image: c036d689-0336-4fcd-a8e0-4aed4dd5e420
    3. file format: qcow2                                       //qcow2格式的镜像
    4. virtual size: 2.0G (2147483648 bytes)                    //镜像文件大小的上限为2G,实际使用了223M
    5. disk size: 223M
    6. cluster_size: 65536
    (2)通过horizon创建m1.small(具体配置为:1vcpu,2G memory,10G root disk,20G extra volume的virtual machine
  1.       新创建的虚拟机存放在/var/lib/nova/instances目录下,该目录的大体结构如下:
    1. ubuntu@compute-63-12:/var/lib/nova/instances$ ll
    2. total 32
    3. drwxr-xr-x 8 nova nova 4096 Feb 28 21:39 ./
    4. drwxr-xr-x 10 nova nova 4096 Dec 25 01:07 ../
    5. drwxrwxr-x 2 nova nova 4096 Feb 28 21:39 _base/                    //相当于镜像文件的cache目录,在此host上创建的所有的vm,都会先cacha到这里
    6. drwxrwxr-x 2 nova nova 4096 Jan 8 05:56 instance-00000022/         //instance-xxxxx新创建的虚拟机
    7. drwxrwxr-x 2 nova nova 4096 Feb 28 03:40 instance-00000034/         
    8. drwxrwxr-x 2 nova nova 4096 Feb 28 04:02 instance-00000037/
    9. drwxrwxr-x 2 nova nova 4096 Feb 28 21:39 instance-0000003a/
    10. drwxrwxr-x 2 nova nova 4096 Jan 30 01:30 snapshots/                 //此host上虚拟机对应的快照文件
  2.   通过查看nova-compute.log可以看到vm创建过程中,镜像文件格式的变化过程,下面总结了下,具体参见下图。

        从glance中得知,有个virtual size =2G的qcow2格式的镜像文件Precise x86_64,它在glance中的ID=c036d689-0336-4fcd-a8e0-4aed4dd5e420

  3.   当Nova Compute接收到vm创建的请求时,通过以下步骤完成一个VM的创建过程:
  4.   
  5. (1)步:
  6.     从vm的描述文件中获得所使用的image文件的ID,然后向Glance发起索取image文件的HTTP请求,结果是image文件从Glance的存储节点下载到发起请求的host机器上,即:/var/lib/nova/instances/_base目录下:
    1. ubuntu@compute-63-11:/var/lib/nova/instances/_base$ ll -alh
    2. total 4.0G
    3. drwxrwxr-x 2 nova nova 4.0K Feb 28 21:39 ./
    4. drwxr-xr-x 8 nova nova 4.0K Feb 28 21:39 ../
    5. -rw-r--r-- 1 nova kvm 2.0G Mar 1 02:06 d265f9d66b8be65448e6c9147a83d65a300e1852
    6. -rw-r--r-- 1 nova kvm 10G Mar 1 02:06 d265f9d66b8be65448e6c9147a83d65a300e1852_10
    7. -rw-rw-r-- 1 nova nova 223M Feb 28 03:17 d265f9d66b8be65448e6c9147a83d65a300e1852.part
    8. -rw-r--r-- 1 nova nova 20G Feb 28 04:01 ephemeral_0_20_None
    9. -rw-r--r-- 1 libvirt-qemu kvm 20G Feb 28 04:01 ephemeral_0_20_None_20
    10. -rw-r--r-- 1 nova nova 40G Feb 28 21:39 ephemeral_0_40_None
    11. -rw-r--r-- 1 libvirt-qemu kvm 40G Feb 28 21:39 ephemeral_0_40_None_40
    即从:c036d689-0336-4fcd-a8e0-4aed4dd5e420 ---> d265f9d66b8be65448e6c9147a83d65a300e1852.part
  7. 通过qemu-img info,可以发现d265f9d66b8be65448e6c9147a83d65a300e1852.part仍为qcow2格式的镜像,且大小与glance上的大小一致。
    1. ubuntu@compute-63-11:/var/lib/nova/instances/_base$ sudo qemu-img info d265f9d66b8be65448e6c9147a83d65a300e1852.part
    2. image: d265f9d66b8be65448e6c9147a83d65a300e1852.part
    3. file format: qcow2
    4. virtual size: 2.0G (2147483648 bytes)
    5. disk size: 223M
    6. cluster_size: 65536
    (2)步:
  8.       镜像下载成功后,openstack先去判断image文件的类型是否为qcow2,如果是,则现将其转化为raw格式,否则,直接进入(3)
  9.       这里通过qemu-img convert命令,将qcow2格式转化为raw格式,转化完的镜像为:d265f9d66b8be65448e6c9147a83d65a300e1852通过qemu-imag info查看其information。
    1. ubuntu@compute-63-11:/var/lib/nova/instances/_base$ sudo qemu-img info d265f9d66b8be65448e6c9147a83d65a300e1852
    2. image: d265f9d66b8be65448e6c9147a83d65a300e1852
    3. file format: raw
    4. virtual size: 2.0G (2147483648 bytes)
    5. disk size: 659M
    (3)(4)两步:
  10.      由于所请求的vm的类型为m1.small,其root disk的大小为10G,所以需要resize image fille to 10G。
  11.     这里比较奇怪的是,在resize之前,openstack会将d265f9d66b8be65448e6c9147a83d65a300e1852拷贝一份d265f9d66b8be65448e6c9147a83d65a300e1852_10,然后对d265f9d66b8be65448e6c9147a83d65a300e1852_10进行resize操作,将其变成10G的raw,这可能与vm的备份有关,暂时还没有理解为什么这么做。
    1. cp /var/lib/nova/instances/_base/d265f9d66b8be65448e6c9147a83d65a300e1852 /var/lib/nova/instances/_base/d265f9d66b8be65448e6c9147a83d65a300e1852_10 (raw -->raw 2G-->2G)
    2. qemu-img resize /var/lib/nova/instances/_base/d265f9d66b8be65448e6c9147a83d65a300e1852_10 10737418240 (raw--> raw 2G -->10G)
    (5) 步:
  12.     以(3)中创建的d265f9d66b8be65448e6c9147a83d65a300e1852_10作为base创建qcow2格式的overlay,可以理解为以d265f9d66b8be65448e6c9147a83d65a300e1852_10为base,创建了一个快照disk,具体看对应虚拟机目录下的文件:
    1. ubuntu@compute-63-12:/var/lib/nova/instances/instance-0000003a$ ll -alh
    2. total 417M
    3. drwxrwxr-x 2 nova nova 4.0K Feb 28 21:39 ./
    4. drwxr-xr-x 8 nova nova 4.0K Feb 28 21:39 ../
    5. -rw-rw---- 1 libvirt-qemu kvm 23K Feb 28 21:40 console.log
    6. -rw-r--r-- 1 libvirt-qemu kvm 417M Mar 1 02:36 disk
    7. -rw-r--r-- 1 libvirt-qemu kvm 576K Mar 1 01:35 disk.local
    8. -rw-rw-r-- 1 nova nova 1.6K Feb 28 21:38 libvirt.xml
    现在来总结下镜像文件的变化过程:
  13.  c036d689-0336-4fcd-a8e0-4aed4dd5e420    (223M -- qcow2)
  14.      -->d265f9d66b8be65448e6c9147a83d65a300e1852.part   (223M -- qcow2)
  15.            --> d265f9d66b8be65448e6c9147a83d65a300e1852      (2G -- raw)
  16.                   -->d265f9d66b8be65448e6c9147a83d65a300e1852_10   (10G -- raw)
  17.                           --> disk    (417M -- qcow2)

3. cache机制

   如果之后创建的vm的类型也是m1.small,并且是同一个image,将不会再去glance下载image文件,而是直接利用本地_base下的d265f9d66b8be65448e6c9147a83d65a300e1852_10来直接创建vm的disk文件,大大减少的vm的部署时间

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值