OpenStack 虛擬機的磁盤文件類型與存儲方式

目錄

虛擬機的磁盤文件類型

Nova 虛擬機的虛擬磁盤主要包含有 Root Disk、Ephemeral Disk、Swap Disk、Block Storage 等幾種類型。html

Root Disk – virtual root disk size in glgabytes. This is an ephemeral disk the base image is copied into. You don’t use it when you boot from a persistent volume. The 「0」 size is a special case that uses the native base image size as the size of the ephemeral root volume.web

Root Disk(根分區)系統盤,提供 Boot Loader。shell

Swap – Optional swap space allocation for the instancejson

Swap Disk(交換分區)交換盤。用於虛擬機內存耗盡時,協助承載內存壓力。後端

Ephemeral – Specifies the size of a secondary ephemeral data disk. this is an empty unformatted disk and exists only for the life of the instance.安全

Ephemeral Disk 臨時盤,非持久性存儲空間,會隨着虛擬機的生命週期被建立和回收。app

Block Storage – Volume from Cinderdom

Block Storage(塊存儲)數據盤,由 Cinder 提供的持久性存儲空間。ide

OpenStack 提供了 Nova Flavor 和 nova boot 指令兩種操做入口來指定虛擬機的磁盤類型:svg

[stack@undercloud (overcloudrc) ~]$ openstack flavor create
usage: openstack flavor create [-h]
                               [-f {html,json,json,shell,table,value,yaml,yaml}]
                               [-c COLUMN] [--max-width <integer>]
                               [--noindent] [--prefix PREFIX] [--id <id>]
                               [--ram <size-mb>] [--disk <size-gb>]
                               [--ephemeral <size-gb>] [--swap <size-gb>]
                               [--vcpus <vcpus>] [--rxtx-factor <factor>]
                               [--public | --private] [--property <key=value>]
                               [--project <project>]
                               [--project-domain <project-domain>]
                               <flavor-name>
  • [--disk <size-gb>]:系統盤
  • [--ephemeral <size-gb>]:臨時盤
  • [--swap <size-gb>]:交換盤
[stack@undercloud (overcloudrc) ~]$ nova boot
usage: nova boot [--flavor <flavor>] [--image <image>]
                 [--image-with <key=value>] [--boot-volume <volume_id>]
                 [--snapshot <snapshot_id>] [--min-count <number>]
                 [--max-count <number>] [--meta <key=value>]
                 [--file <dst-path=src-path>] [--key-name <key-name>]
                 [--user-data <user-data>]
                 [--availability-zone <availability-zone>]
                 [--security-groups <security-groups>]
                 [--block-device-mapping <dev-name=mapping>]
                 [--block-device key1=value1[,key2=value2...]]
                 [--swap <swap_size>]
                 [--ephemeral size=<size>[,format=<format>]]
                 [--hint <key=value>]
                 [--nic <auto,none,net-id=net-uuid,net-name=network-name,port-id=port-uuid,v4-fixed-ip=ip-addr,v6-fixed-ip=ip-addr,tag=tag>]
                 [--config-drive <value>] [--poll] [--admin-pass <value>]
                 [--access-ip-v4 <value>] [--access-ip-v6 <value>]
                 [--description <description>]
                 <name>
  • [--image <image>]:Boot from image 的鏡像文件
  • [--boot-volume <volume_id>]:Boot from volume 的塊設備
  • [--snapshot <snapshot_id>]:Boot from snapshot(Snapshot 能夠來自 Image,也可能來自 Volume)
  • [--ephemeral size=<size>[,format=<format>]]:臨時盤
  • [--swap <swap_size>]:交換盤
  • [--block-device key1=value1[,key2=value2...]]:塊設備隱射(可指定多種來源類型),key-value 選項以下
    • source=image|snapshot|volume|blank
    • id={uuid} (a volume|image|snapshot UUID if using source=volume|snapshot|image)
    • *dest=volume|local
    • *format=swap|ext4|…|none (to format the image/volume/ephemeral file; defaults to ‘none’ if omitted)
    • *bus=ide|usb|virtio|scsi (hypervisor driver chooses a suitable default if omitted)
    • *device=the desired device name (e.g. /dev/vda, /dev/xda, …)
    • *type=disk|cdrom|floppy|mmc (defaults to ‘disk’ if omitted)
    • *bootindex=N (where N is any number >= 0, controls the order in which disks are looked at for booting)
    • (size=NN (where NN is number of GB to create type=emphemeral image, or the size to re-size to for type=glance|cinder)
    • *shutdown=preserve|remove
    • NOTE:* 表示可選項
      在這裏插入圖片描述
  • [--block-device-mapping <dev-name=mapping>]:塊設備隱射(只指定 Volume 類型),mapping 的格式爲 <dev-name>=<id>:<type>:<size(GB)>:<delete-on-terminate>
    • id:UUID of Volume|Snapshot
    • *dev-name:Volume 在虛擬機中的設備名,e.g. /dev/sda
    • *type:snapshot|blank,snapshot 則表示 Volume 是從 Snapshot 上
    • *size (GB): Volume Size
    • *delete-on-terminate(Boolean):標識是否隨虛擬機一塊兒被刪除

NOTE:在實際使用中,建議經過 Flavor 的方式來使用 Ephemeral 和 Swap 磁盤,由於 nova boot 指定的 ephemeral size 和 swap size 不能大於 Flavor 設定的值,很容易形成衝突。

經過對以上虛擬機磁盤類型的瞭解,在生產環境中使用 Boot from Volume 的虛擬機啓動方式會是一種不錯的選擇。以 Volume 做爲 Root Disk 的話,Volume 不會隨着虛擬機刪除而銷燬。Boot from Volume 有着更高的數據安全性,是大多數 OpenStack 企業級產品提供的默認選項。

虛擬機磁盤文件的存放方式

Openstack 虛擬機磁盤文件的存放方式大體上能夠歸納爲 Local(本地)和 backend(後端存儲)兩種形式。

  • Local,顧名思義,虛擬機的磁盤文件存放在計算節點本地,由 nova.conf 配置項 instances_path 指定目錄路徑。e.g.
instances_path = /var/lib/nova/instances
  • backend,即 Nova 啓用了後端存儲,或者說 Nova 底層的 Hypervisor 啓用了後端存儲更爲準確。e.g.
[libvirt]
# VM Images format.
# Allowed values: raw, flat, qcow2, lvm, rbd, ploop, default
images_type = rbd

# The RADOS pool in which rbd volumes are stored (string value)
images_rbd_pool = rbd

# Path to the ceph configuration file to use (string value)
images_rbd_ceph_conf = /etc/ceph/ceph.conf

這裏以 Ceph RBD 爲例,當 Libvirt 對接了 Ceph RBD Backend,那麼虛擬機的磁盤文件再也不存放到計算節點本地,Ceph 經過精簡配置的快照複製(snapshotted-cloned)卷(又稱快照連接)來幫助 Libvirt 快速啓動虛擬機,虛擬機的數據變動經過 rbd 協議寫入 Ceph 塊存儲。此時的 instances_path 目錄做爲 console.log、disk.info、Ephemeral file、Swap file 的存放路徑。可見 Ephemeral file、Swap file 老是 Local 的,會隨着虛擬機的刪除而徹底銷燬,除非特殊需求,不然不建議使用。

[root@localhost ~]# ll /opt/stack/data/nova/instances/9b17609e-13b8-448d-a225-e69b797e83c4/
total 416
-rw-------. 1 root  root      18067 Mar 21 12:08 console.log
-rw-r--r--. 1 qemu  qemu     196624 Mar 21 12:07 disk.eph0
-rw-r--r--. 1 stack libvirtd    181 Mar 21 12:07 disk.info
-rw-r--r--. 1 qemu  qemu     196616 Mar 21 12:07 disk.swap

固然還有一種場景,Nova 使用 NFS 後端存儲來存放虛擬機磁盤文件。與 Ceph RBD 不一樣,NFS 以文件存儲的方式 mount 到計算節點本地的(注:CephFS 也支持文件存儲,這裏以 NFS 爲例)。e.g.

mount {nfs_server_ipaddr}:/instances /var/lib/nova/instances
chown -R nova:nova /var/lib/nova/instances
chmod 755 /var/lib/nova/instances

此時,雖然虛擬機磁盤文件存放到了後端存儲,但對於 Libvirt 而言這些文件依舊是存放在本地文件系統上的,不須要經過特殊的協議訪問,只是單純的本地文件訪問,因此我將這種存放形式概括到 Local 行列。

QCOW2 鏡像格式與 qemu-img 指令

QCOW2 是 QEMU-KVM 經常使用的 Image 格式,也是常見的虛擬機 disk_format。當採用 Local 磁盤文件存放方式時,Nova 經過 qemu-img 指令對此格式的磁盤文件進行管理。關於 qemu-img 指令的詳細使用方式在 《QCOW2/RAW/qemu-img 概念淺析》中已經有過記錄,這裏再也不贅述。

QCOW2 – QEMU copy-on-write format with a range of special features, including the ability to take multiple snapshots, smaller images on filesystems that don’t support sparse files, optional AES encryption, and optional zlib compression.

QCOW2 的特性

  • COW
  • 支持多重快照,又稱鏈式快照
  • 佔用更小的存儲空間
  • AES 加密
  • zlib 壓縮

其中咱們關心 QCOW2 的 COW 特性,COW(Copy-On-Write,寫時複製,或稱即寫即拷)是一種快照技術,更多的 COW 實現原理能夠瀏覽《再談 COW、ROW 快照技術》。簡而言之,當使用 QCOW2 Image 建立虛擬機而且虛擬機的磁盤文件存放方式是 Local 的話,那麼虛擬機 Root file 本質只是一個 QCOW2 Image 的快照連接,而非從 Glance download 到本地的 QCOW2 Image。與 Ceph RBD 相似的,這個快照連接一樣用於記錄 GuestOS 對磁盤的讀寫變動,Root file 會隨着虛擬機的使用而膨脹,直到 Root file size 達到 Flavor Disk_GB 的上限爲止。

EXAMPLE

[root@overcloud-ovscompute-0 instances]# qemu-img info 84603dbf-cf56-4c7d-b8a9-3ca83970682d/disk
image: 84603dbf-cf56-4c7d-b8a9-3ca83970682d/disk
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 30M
cluster_size: 65536
backing file: /var/lib/nova/instances/_base/309eee24778f158af7ae57d8843e698d48f43d4a
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
    
[root@overcloud-ovscompute-0 instances]# qemu-img info 744a1c9f-705d-4294-89cf-dadbb1b6ca8c/disk
image: 744a1c9f-705d-4294-89cf-dadbb1b6ca8c/disk
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 30M
cluster_size: 65536
backing file: /var/lib/nova/instances/_base/309eee24778f158af7ae57d8843e698d48f43d4a
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
    
[root@overcloud-ovscompute-0 instances]# qemu-img info /var/lib/nova/instances/_base/309eee24778f158af7ae57d8843e698d48f43d4a
image: /var/lib/nova/instances/_base/309eee24778f158af7ae57d8843e698d48f43d4a
file format: raw
virtual size: 8.0G (8589934592 bytes)
disk size: 881M

上述輸出,兩個虛擬機的根磁盤文件有着共同的 backing file /var/lib/nova/instances/_base/309eee24778f158af7ae57d8843e698d48f43d4a,這個文件纔是從 Glance 拉到本地的 QCOW2 Image。因此,我更願意將虛擬機磁盤文件稱爲 disk file,將 QCOW2 Image 稱爲 base file,二者的結合纔是虛擬機在當前時刻的完整數據。這種利用了 QCOW2 特性的虛擬機磁盤文件處理方式的好處在於佔用了更小的磁盤空間,但在虛擬機遷移場景中要引發注意,若是隻是遷移 disk file 的話,將沒法獲得虛擬機的完整數據。
在這裏插入圖片描述

Initially the image is downloaded from glance and cached in libvirt base. We’ll consider the options for handling a qcow2 image stored in glance, as that format can be downloaded quite efficiently from glance as it supports compression, and image sparseness can be maintained. This article will focus on the flow and transformations in 「libvirt base」, which is used to cache, preprocess and optionally back, VM disk images.

NOTE:Ephemeral file 和 Swap file 也同樣,不作過多討論。

隨帶一提,若是 Nova、Cinder、Glance 都使用了 Ceph RBD 後端存儲。那麼 Image 是以 RAW(裸數據)格式存儲的,依賴 Ceph 塊存儲的 COW 特性來達到與 QCOW2 相似,甚至更完備的效果。

參考文章

http://www.javashuo.com/article/p-ubrtxteq-mq.html

相關文章
相關標籤/搜索