存档

‘ovirt’ 分类的存档

oVirt 中的 cloudinit 体验

2014年8月4日 没有评论

为了解决云平台中的初始化问题, 开发者们设计了 cloudinit, 它驻留在虚拟机中, 随机启动, 根据配置文件和云平台提供的 userdata 进行相关配置. oVirt 从很早 的版本就有了 cloudinit 的支持. 下面我在 oVirt-3.4 中简单的体验一下 cloudinit 的功能.

首先, 得有一个支持 cloudinit 的虚拟机, 为了方便, 我们从内置的 ovirt-image-repository 中导入一个 fedora19 的镜像作为模板创建虚拟机: 选择 [系统] –> [存储] –> [ovirt-image-repository], 在列出的镜像中选择 “Fedora 19 64-Bit”, [导入] –> [作为模板导入]

然后, 创建虚拟机: [新建虚拟机] –> 选择刚才导入的 fedora19 作为模板, 设置虚拟机类型为 linux, 点击 [显示高级选项] –> [初始运行] –> [使用 Cloud-Init/Sysprep] –> [验证], 把想要设置的密码填写进去, 把本机的 ssh 公钥输入进去, 保存.

然后, 启动虚拟机. 过一会儿, 在界面上显示虚拟机的 IP 地址之后, 连接该虚拟机

# ssh root@192.168.2.225

如果之前导入公钥是本机的话, 不用密码直接就可以登陆了, 如果是在另外的机器, 输入 上面设置的密码也可以登陆进去.

深入一点

通过查看该虚拟机的启动参数, 发现 cloudinit 的配置是以 IDE 设备的方式注入进去的.

-drive file=/var/run/vdsm/payload/81654b36-1d6e-4093-82a0-2f730ca720d1.3944715d95e1a09bf282ede59538de1e.img
# mount -o loop /var/run/vdsm/payload/81654b36-1d6e-4093-82a0-2f730ca720d1.3944715d95e1a09bf282ede59538de1e.img  /mnt
# ls /mnt/openstack/latest/
meta_data.json  user_data

至于数据源的格式, 完全是借用了 openstack 的标准:

# cat /mnt/openstack/latest/user_data 
#cloud-config
ssh_pwauth: true
disable_root: 0
output:
  all: '>> /var/log/cloud-init-output.log'
user: root
password: abc123
chpasswd:
  expire: false
runcmd:
- 'sed -i ''/^datasource_list: /d'' /etc/cloud/cloud.cfg; echo ''datasource_list:
  ["NoCloud", "ConfigDrive"]'' >> /etc/cloud/cloud.cfg'

在虚拟机内部, cloudinit 把数据源所在的磁盘 /dev/sr1 临时挂载, 然后把源数据复制到 cloudinit 的目录下.

# less /var/log/cloud-init.log
... util.py[DEBUG]: Running command ['mount', '-o', 'ro,sync', '/dev/sr1', '/tmp/tmpdem7bo'] with allowed return codes [0] (shell=False, capture=True)
# cat /var/lib/cloud/instance/user-data.txt
#cloud-config
ssh_pwauth: true
disable_root: 0
output:
  all: '>> /var/log/cloud-init-output.log'
user: root
password: abc123
chpasswd:
  expire: false
runcmd:
- 'sed -i ''/^datasource_list: /d'' /etc/cloud/cloud.cfg; echo ''datasource_list:
  ["NoCloud", "ConfigDrive"]'' >> /etc/cloud/cloud.cfg'

分类: ovirt 标签:

ovirt 新版本中的 glance 仓库

2014年8月3日 没有评论

在 oVirt 3.4 中, 内建了一个默认的外部供应商: ovirt-image-repository, 该仓库其实 是提供 OpenStack 的 glance 镜像服务, 目前里面有 fodora, centos 等的虚拟机模板镜像.

但是在使用中会有一个问题, 由于该镜像存放在 ovirt.org 中, 在中国大陆(你懂得)访问速度 相当慢, 为了能更方便地使用这些镜像, 最好把这些镜像导入到本地的 glance 中.

我考察了一下该仓库, 该仓库的 endpoint 为 http://glance.ovirt.org:9292/, 且它没有使用 keystone 验证服务, 只是一个简单的没有权限控制的镜像服务, 所以我们 可以直接下载然后导入到我们的 glance 中:

先列出所有的镜像

# glance --os-image-url http://glance.ovirt.org:9292 image-list

下载该镜像, 然后导入到 openstack glance 中, ID 为上面列出来的 ID:

# wget -O [filename] http://glance.ovirt.org:9292/v1/images/[ID]
# glance image-create --name="what you want" --is-public True --container-format bare --disk-format qcow2 --progress --file [filename]

分类: ovirt 标签:

ovirt-shell 使用

2014年6月12日 没有评论

Introduction

oVirt 项目的用户接口有 GUI 方式的, rest API 方式的, SDK 方式, 甚至也有 命令行方式的, 也就是本文要介绍的 ovirt-shell.

本文介绍在 OSX(这么牛逼)环境下, 从头建立一个数据中心, 集群, 存储域, 并且基于 此创建一个虚拟机并对其完成生命周期管理.

Install

从功能来讲, ovirt-shell 只是一个控制 oVirt 的命令行客户端, 它的实现是基于 python SDK 的, 所以几乎在所有 POSIX 平台都能很容易的安装(包管理器或者 pip 方式), 我的主要 开发平台是 OSX, 正是使用 pip 来安装 ovirt-shell 的.

使用发行版提供的包管理器

比如在 RPM 系的发行版中, 可以

# yum install -y ovirt-engine-cli

使用 python 的包管理工具

如果发行版的软件仓库中没有提供软件, 那么可以使用 python 的包管理器 pip 安装, 比如在我的 mac 上, 使用:

# pip install ovirt-shell

Usage

接下来演示从头使用 oVirt, 包括创建数据中心, 数据域, 虚拟机等等.

连接到 oVirt engine

首先需要连接到 oVirt engine, 使用下列的指令:

# wget http://192.168.3.252/ca.crt -O ~/ca.crt # 下载 engine 的 CA 证书
# ovirt-shell -c -A ~/ca.crt -l "https://192.168.3.252:443/api" -u admin@internal

上述命令中的参数解释:

-c: 自动连接到服务器, 不要使用交互模式
-A: 指定 oVirt engine 的 CA 证书, 下载地址为 http://[ovirt-engine-url]/ca.crt
-l: ovirt-enging 的 url, 格式为 http[s]://server[:port]/api
-u: 连接 ovirt-engine 的用户名

如果出现以下错误, 是由于证书中的 hostname 和 engine 的 hostname 不匹配, engine 的配置不一致导致的, 连接的时候用 “-I” 告诉 engine 不要验证证书的 hostname 即可.

The host name "192.168.3.252" contained in the URL doesn't match any of the names in the server certificate

之后, ovirt-shell 会提示用户输入密码, 然后就进入 ovirt-shell 的交互模式了, 可以使用 help 查看使用帮助, 任何命令都可以使用 TAB 补全.

创建一个完整的数据中心

我这里创建一个完整的 NFS 类型的数据中心

创建一个数据中心

先创建一个名为 test 空的 NFS 数据中心

[oVirt shell (connected)]# add datacenter --name test --comment "test" --description "test" --storage_type nfs --version-major 3 --version-minor 3
 
id                              : 67ef255f-29ff-4474-8008-085d8066bb04
name                            : test
description                     : test
comment                         : test
status-state                    : uninitialized
storage_type                    : nfs
supported_versions-version-major: 3
supported_versions-version-minor: 3
version-major                   : 3
version-minor                   : 3

上述命令中的参数解释:

--storage_type: 数据中心的类型.
--version-major: 和 --version-minor 一起确定数据中心的兼容版本.

创建一个集群

创建一个名为 test 的集群

[oVirt shell (connected)]# add cluster --data_center-name test --name test --comment "test" \
> --description "test" --cpu-id "Intel SandyBridge Family" --version-major 3 --version-minor 3 \
> --virt_service true --gluster_service false
 
id                                         : f57b9ecf-c99d-4285-8f88-8ce4b3348f4f
name                                       : test
description                                : test
ballooning_enabled                         : False
comment                                    : test
cpu-id                                     : Intel SandyBridge Family
data_center-id                             : 67ef255f-29ff-4474-8008-085d8066bb04
error_handling-on_error                    : migrate
gluster_service                            : False
memory_policy-overcommit-percent           : 200
memory_policy-transparent_hugepages-enabled: True
scheduling_policy-policy                   : none
threads_as_cores                           : False
trusted_service                            : False
tunnel_migration                           : False
version-major                              : 3
version-minor                              : 3
virt_service                               : True

上述命令中的参数解释:

--data_center-name: 对应的数据中心.
--cpu-id: 兼容的主机的 CPU 类型.
--version-minor: 和 --version-minor 对应集群的兼容版本.
--virt_service: 是否用来作为虚拟机集群.
--gluster_service: 是否作为 glusterfs 集群.

添加主机到数据中心

由于我的演示环境已经有很多主机注册到系统中了, 我使用一个空闲的.

[oVirt shell (connected)]# list hosts --query "status=maintenance"
 
id         : 34905bed-ebf5-45b6-a30e-65abe149ff24
name       : node-123

把它加入创建的集群中, 并激活之.

[oVirt shell (connected)]# update host node-123 --cluster-name test
 
[oVirt shell (connected)]# action host node-123 activate
host-id     : 34905bed-ebf5-45b6-a30e-65abe149ff24
status-state: complete

添加存储

创建一个 NFS 的存储域:

[oVirt shell (connected)]# add storagedomain --name test --storage-type nfs --storage_format v3 --type data --host-name node-123 --storage-address 192.168.3.157 --storage-path /home/ovirt/nfs-test

上述命令中的参数解释:

--storage-type: 存储类型.
--storage_format: NFS 存储的版本号.
--type: 存储域的类型, 这里作为数据存储域.
--host-name: 使用主机 node-123.
--storage-address: NFS 的地址
--storage-path: 挂载路径

然后把该存储域加入到数据中心中

[oVirt shell (connected)]# add storagedomain --name test --datacenter-identifier test

添加 ISO

添加一个 ISO 存储域加入到数据中心中

[oVirt shell (connected)]# add storagedomain --name iso --datacenter-identifier test

创建虚拟机

我们的 oVirt 环境已经准备好了, 可以开始使用该平台进行各种操作了. 下面我们创建虚拟机:

创建一个虚拟机

[oVirt shell (connected)]# add vm --name test --template-name Blank --cluster-name test \
> --os-type rhel_6x64 --memory 2147483648 --cpu-topology-cores 2

上述命令中的参数解释:

--template-name: 该虚拟机基于的模板, 如果模板为空, 则填 Blank
--cluster-name: 虚拟机处于的集群
--os-type: 虚拟机的操作系统类型, 有效值为:
           windows_2008x64, unassigned, other, other_linux, windows_2008r2, 
           ubuntu_12_04, windows_2008, windows_7x64, windows_2003x64, windows_8x64, 
           windows_7, rhel_6x64, ubuntu_12_10, rhel_6, rhel_5, rhel_4x64, rhel_4, 
           rhel_3, windows_8, windows_2008R2x64, windows_2012x64, windows_xp, rhel_3x64, 
           windows_2003, ubuntu_13_10, rhel_5x64, sles_11, ubuntu_13_04
--memory: 分配的内存, 以字节为单位
--cpu-topology-cores: 虚拟机的 CPU 核心数

给虚拟机新分配一个磁盘

[oVirt shell (connected)]# add disk --name test_disk --size 10737418240 --interface virtio \
> --format cow --bootable true --storagedomain-identifier test

上述命令中的参数解释:

--size: 磁盘大小, 以字节为单位.
--interface: 磁盘的接口类型, 可选的值为: ide, virtio_scsi, virtio
-- format: 磁盘镜像的类型, 可选的值为 cow, raw

将磁盘添加到虚拟机上, 并激活, 注意这里只能使用磁盘的 id 来操作.

[oVirt shell (connected)]# list disks --query "alias=test_disk" | grep id
id         : 4357a838-2a99-4a05-a0b9-be6ee6ec5eaa
 
[oVirt shell (connected)]# add disk --id 4357a838-2a99-4a05-a0b9-be6ee6ec5eaa --vm-identifier test
 
[oVirt shell (connected)]# action disk test_disk activate --vm-identifier test

给虚拟机新分配一个网卡

[oVirt shell (connected)]# add nic --vm-identifier test --name test --network-name ovirtmgmt \
> --interface virtio --linked true --plugged true

上述命令中的参数解释:

--network-name: 逻辑网络的名称.
--interface: 网卡接口类型, 可选的值为: e1000, virtio, rtl8139, rtl8139_virtio
--linked: 链接状态.
--plugin: 插入状态.

启动虚拟机

虚拟机已经准备就绪, 现在可以启动了, 由于我们的虚拟机没有操作系统, 我们需要设置虚拟机 的启动第一启动设备为 CDROM, 并用该 CDROM 给虚拟机安装一个操作系统.

先列出 ISO 域名里可用的的镜像.

[oVirt shell (connected)]# list files --storagedomain-identifier iso
id         : CentOS-6.5-x86_64-minimal.iso
name       : CentOS-6.5-x86_64-minimal.iso

给虚拟机增加一个 CDROM 设备.

[oVirt shell (connected)]# add cdrom --vm-identifier test --file-id CentOS-6.5-x86_64-minimal.iso

启动虚拟机, 以 CDROM 作为启动设备

# action vm test start --vm-stateless true --vm-os-boot "boot.dev=cdrom" --vm-display-type vnc

上述命令中的参数解释:

--vm-stateless: 以 stateless 模式启动虚拟机.
--vm-os-boot: 第一启动设备, 可选的值为 cdrom, hd, network.
--vm-display-type: 访问控制协议, 这里选择 vnc, 可选的有, spice, vnc

访问虚拟机

由于虚拟机的 vnc 和 spice 密码是按需生成的, 访问该虚拟机之前, 我们需要给 vnc 设置一个临时的密码

[oVirt shell (connected)]# action vm test ticket --ticket-value "abc123"

查看 vnc server 所在的地址和端口

[oVirt shell (connected)]# show vm test | grep display
display-address           : 192.168.3.123
display-allow_override    : False
display-monitors          : 1
display-port              : 5900
display-single_qxl_pci    : False
display-smartcard_enabled : False
display-type              : vnc

现在, 就可以用 vnc 客户端打开 192.168.3.123:5900 加上上面设置的临时密码来 访问该虚拟机了.

虚拟机的任务(TODO)

分类: ovirt 标签: