Chapter 5 镜像服务(Image service)

5.1 镜像服务的概念

OpenStack镜像服务能够使用户发现、注册(导入)、查询虚拟机镜像。它通过REST API来查询虚拟机镜像的元数据从而获取镜像文件。这里镜像服务安装在控制节点上,默认存储镜像的路径为/var/lib/glance/p_w_picpaths/,可以在/etc/glance/glance-api.conf文件来修改路径参数filesystem_store_datadir。注意,镜像文件将存放在之前配置的共享存储上。


OpenStack镜像服务包括以下几个组件:

glance-api:接受关于镜像发现、检索、存储的API调用

glance-registry:存储、处理和检索关于镜像的元数据,元数据包括如大小,类型等选项

数据库

镜像文件存储仓库


5.2 安装配置镜像服务(Image service)

5.2.1 配置预先环境

1. 创建镜像服务数据库、用户及权限:

[root@controller ~]# mysql -uroot -piforgot

MariaDB [(none)]> CREATE DATABASE glance;

MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glancepw';

MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glancepw';

MariaDB [(none)]> flush privileges;


2. 创建镜像服务用户、角色、服务实体以及API终端:

[root@controller ~]# source admin-openrc.sh

[root@controller ~]# openstack user create --password glancepw glance

[root@controller ~]# openstack role add --project service --user glance admin

[root@controller ~]# openstack service create --name glance \

  --description "OpenStack Image service" p_w_picpath

[root@controller ~]# openstack endpoint create \

  --publicurl http://controller:9292 \

  --internalurl http://controller:9292 \

  --adminurl http://controller:9292 \

  --region RegionOne \

  p_w_picpath


5.2.2 安装配置镜像服务组件

1. 安装相关软件包:

[root@controller ~]# yum -y install openstack-glance python-glance python-glanceclient glusterfs-fuse

由于镜像文件存储在GluterFS存储系统发布的共享空间里,所以需要安装glusterfs-fuse客户端。


2. 编辑/etc/glance/glance-api.conf文件:

[root@controller ~]# cp /etc/glance/glance-api.conf{,.bak}

[root@controller ~]# > /etc/glance/glance-api.conf

[root@controller ~]# vi /etc/glance/glance-api.conf

[DEFAULT]

notification_driver = noop

verbose = True


[database]

connection = mysql://glance:glancepw@controller/glance


[keystone_authtoken]

auth_uri = http://controller:5000

auth_url = http://controller:35357

auth_plugin = password

project_domain_id = default

user_domain_id = default

project_name = service

username = glance

password = glancepw


[paste_deploy]

flavor = keystone


[glance_store]

default_store = file

filesystem_store_datadir = /var/lib/glance/p_w_picpaths/

backup-volfile-servers = compute2


另外,根据设置需求将glusterfs文件系统设置为开机自动挂载:

[root@controller ~]# vi /etc/fstab

compute1:/glance-volume /var/lib/glance/p_w_picpaths glusterfs defaults,_netdev 0 0


3. 编辑/etc/glance/glance-registry.conf文件:

[root@controller ~]# cp /etc/glance/glance-registry.conf{,.bak}

[root@controller ~]# > /etc/glance/glance- registry.conf

[root@controller ~]# vi /etc/glance/glance- registry.conf

[DEFAULT]

notification_driver = noop

verbose = True


[database]

connection = mysql://glance:glancepw@controller/glance


[keystone_authtoken]

auth_uri = http://controller:5000

auth_url = http://controller:35357

auth_plugin = password

project_domain_id = default

user_domain_id = default

project_name = service

username = glance

password = glancepw


[paste_deploy]

flavor = keystone


4. 填充镜像服务数据库:

[root@controller ~]# su -s /bin/sh -c "glance-manage db_sync" glance


5. 启动镜像服务并将其设置为开机自启:

[root@controller ~]# systemctl start openstack-glance-api openstack-glance-registry

[root@controller ~]# systemctl enable openstack-glance-api openstack-glance-registry


5.3 虚拟机镜像介绍

虚拟机镜像(virtual machine p_w_picpath)其实就是一个单独的文件,包含一个已安装了可引导的操作系统的磁盘。虚拟机镜像可以是多种格式(后面章节将介绍如何进行格式转换):

Raw:原始镜像是最简单的格式,KVM和Xen Hypervisor都可以支持这种格式。可以认为它就是一个块设备文件。这里不推荐使用dd命令生成一个块设备文件来创建原始镜像

qcow2:qcow2(QEMU copy-on-write version 2)是KVM hypervisor最常用的一种镜像格式。它具有一些原始镜像所不具备的特性:

使用稀疏表示(sparse representation),使镜像文件更小,这也意味着在上传时速度更快

支持快照功能,因此在必要时OpenStack会自动将原始镜像(raw p_w_picpath)转换成qcow2格式

VMDK:VMware ESXi使用VMDK镜像格式

VDI:VirtualBox使用VDI镜像格式

ISO:ISO是标准的磁盘镜像格式,通过CD或DVD来启动系统


5.3.1 磁盘镜像格式

虚拟机镜像磁盘格式其实就是底层磁盘镜像格式。虚拟厂商提供了不同的格式,常见的有:

raw:一种非结构化的磁盘镜像格式,如果一个文件不具备扩展性,它可能就是原始格式(raw format)

qcow2:QEMU仿真器(emulator)所支持的、可动态扩展并可进行拷贝(Copy on Write)的格式


5.4 手动创建镜像

获得镜像最快的方式就是下载官方发布的镜像文件、或者别人已创建的镜像文件。如果需要定制个性化的镜像文件,可根据需求手动创建镜像文件。


5.4.1 预设环境

在使用libvirt启动一台虚拟机之前,确认libvirt默认网络"default"是否已开启,这个网络必须是激活状态,并能连接到网络。通过virsh net-list命令来进行查看:

[root@test_env ~]# virsh net-list

Name      State  Autostart   Persistent

------------------------------------------------------------------------------

default      active  yes       yes


如果网络没有启动,可以通过下面命令将其开启:

[root@test_env ~]# virsh net-start default

注意,test_env是实验环境的宿主机,安装了CentOS6.5-x86_64系统,因此支持KVM虚拟机创建。


5.4.2 使用virt-manager X11 GUI图像界面安装CentOS虚拟机

如果使用图形界面进行虚拟机的安装,可以通过virt-manager命令开启图形配置界面来设置虚拟机安装所需参数:

[root@test_env ~]# virsh manager

 


接下来配置安装环境,这里安装的操作系统是CentOS6.5 x86_64:

  


  


 


 


 

存放位置为/var/lib/libvirt/p_w_picpaths/目录下,名称为CentOS6-x86_64-test.img。


启动虚拟机后,通过图形界面完成操作系统的安装:

 


重启之后,需要完成下面几个步骤:

清空/etc/udev/rules.d/70-persistent-net.rules文件的内容

(如有该文件的话)清空/lib/udev/rules.d/75-persistent-net-generator.rules文件的内容,该文件用于生成上面的70-persistent-net.rules文件

移除/etc/sysconfig/network-scripts/ifconfigeth0中配置参数HWADDR和UUID,并确认参数ONBOOT为yes

另外,如有必要请关闭防火墙和SELinux服务


5.4.3 上传镜像到OpenStack镜像服务

首先将宿主机上的镜像文件上传到控制节点,然后通过glance命令创建OpenStack Image:

[root@test_env ~]# cd /var/lib/libvirt/p_w_picpaths/

[root@test_env p_w_picpaths]# scp CentOS6-x86_64-test.img 10.0.0.11:~

[root@test_env p_w_picpaths]# ssh 10.0.0.11

[root@controller ~]# source admin-openrc.sh

[root@controller ~]# glance p_w_picpath-create --name "CentOS6-x86_64-test" --file CentOS6-x86_64-test.img \

  --disk-format qcow2 --container-format bare --visibility public --progress 

[root@controller ~]# glance p_w_picpath-list

| ID                              | Name                |

| 534d920c-02eb-4c17-beb9-918650e92bb9 | CentOS6-x86_64-test |


5.5 修改镜像文件

当获取了一个镜像文件,在上传到OpenStack Image服务之前可能需要对其进行修改,这时需要使用特定工具来执行。


5.5.1 guestfish

guestfish是一个出自libguestfs项目用于修改虚拟机内部文件的工具。guestfish不能直接将镜像文件挂载到本地文件系统,取而代之,它提供了一个shell交互接口,允许用户查看、编辑、删除文件等操作。


其功能在于,当需要修改一些配置信息(而不是直接启动虚拟机来进行修改),通过它来完成更加地方便实用。例如在上传镜像文件到OpenStack镜像服务时,需要修改一些特定的文件,包括清空/etc/udev/rules.d/70-persistent-net.rules等:

[root@controller ~]# guestfish --rw -a CentOS6-x86_64-test.img

><fs> run

><fs> list-filesystems

/dev/sda1: ext4

/dev/vgsys/lvroot: ext4

/dev/vgsys/lvswap: swap

><fs> mount /dev/vgsys/lvroot /

><fs> vi /etc/udev/rules.d/70-persistent-net.rules

(清空文件内容,然后rw保存退出)

...

><fs> vi /etc/sysconfig/network-scripts/ifcfg-eth0

...

ONBOOT=yes

BOOTPROTO=dhcp

...

><fs> exit