openstack_虚拟机镜像制作指南


docs.openstack.org 虚拟机镜像指南 November 24, 2015 current ii OpenStack 虚拟机镜像制作指南 current (2015-11-24) 版权 © 2013-2015 OpenStack基金会 Some rights reserved. 摘要 这个指南描述了如何获取,创建以及修改 OpenStack 兼容的虚拟机镜像。 Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. http://creativecommons.org/licenses/by/3.0/legalcode 虚拟机镜像指南 November 24, 2015 current iii 目录 前言 ............................................................................................................................... vi 约定 ....................................................................................................................... vi 1. 介绍 ............................................................................................................................ 1 镜像的磁盘格式和镜像的容器格式 ........................................................................... 2 镜像元数据 .............................................................................................................. 3 2. 获取镜像 ..................................................................................................................... 5 CentOS 镜像 ............................................................................................................ 5 CirrOS (测试镜像) ................................................................................................... 5 Ubuntu 官方镜像 ...................................................................................................... 5 红帽企业lLinux官方镜像 .......................................................................................... 6 官方Fedora 镜像 ...................................................................................................... 6 官方 openSUSE 和 SLES 镜像 .................................................................................... 6 官方 Debian 镜像 ..................................................................................................... 6 其他Linux发行版的官方镜像 .................................................................................... 7 Rackspace 云计算镜像(多个发行版) ..................................................................... 7 微软 Windows 镜像 ................................................................................................... 7 3. OpenStack Linux 镜像需求 ........................................................................................... 8 磁盘分区以及在启动时调整根分区大小 (cloud-init) ................................................. 8 无硬编码的 MAC 地址信息 ....................................................................................... 10 确保 ssh 服务在运行 ............................................................................................. 10 禁用防火墙 ............................................................................................................ 10 使用 SSH 公钥(cloud-init)访问虚拟机 ................................................................. 11 处理用户数据以及其他元数据(cloud-init) .......................................................... 12 确认镜像输出启动日志到控制台 ............................................................................. 12 内核内对半虚拟化的 Xen 支持(仅Xen 虚拟化) ..................................................... 12 管理镜像缓存 ......................................................................................................... 13 4. 更改镜像内容 ............................................................................................................. 14 guestfish .............................................................................................................. 14 guestmount ............................................................................................................ 15 virt-* tools ........................................................................................................... 16 loop(环回)设备,kpartx,网络块设备 ...................................................................... 17 5. 手动创建镜像 ............................................................................................................. 20 检查 libvirt 默认网络是否运行 .............................................................................. 20 使用 virt-manager X11 图形界面 ............................................................................ 20 使用 virt-install 且使用本地 VNC 客户端连接 ......................................................... 21 示例:CentOS 镜像 ................................................................................................ 22 示例:Ubuntu 镜像 ................................................................................................ 29 示例:Fedora 镜像 ................................................................................................ 35 示例:微软Windows镜像 .......................................................................................... 38 示例:FreeBSD 镜像 ............................................................................................... 39 6. 支持创建镜像的工具 .................................................................................................. 43 镜像生成器 ............................................................................................................ 43 Oz .......................................................................................................................... 43 VMBuilder ............................................................................................................... 45 VeeWee ................................................................................................................... 45 Packer ................................................................................................................... 45 imagefactory ......................................................................................................... 45 SUSE Studio ........................................................................................................... 45 虚拟机镜像指南 November 24, 2015 current iv 7. 转换镜像格式 ............................................................................................................. 46 A. 社区支持 .................................................................................................................... 47 文档 ...................................................................................................................... 47 问答论坛 ............................................................................................................... 48 OpenStack 邮件列表 ............................................................................................... 48 OpenStack 维基百科 ............................................................................................... 48 Launchpad的Bug区 .................................................................................................. 48 The OpenStack 在线聊天室频道 .............................................................................. 50 文档反馈 ............................................................................................................... 50 OpenStack分发包 ................................................................................................... 50 虚拟机镜像指南 November 24, 2015 current v 表格清单 3.1. 镜像缓存管理配置选项 ............................................................................................ 13 7.1. qemu-img 格式字符列表 ............................................................................................ 46 虚拟机镜像指南 November 24, 2015 current vi 前言 约定 ............................................................................................................................... vi 约定 OpenStack文档使用了多种排版约定。 声明 以下形式的标志为注意项 注意 便签或提醒 重要 提醒用户进一步操作之前必须谨慎 警告 关于有丢失数据的风险或安全漏洞的危险信息提示 命令行提示符 $ 提示 符 $ 提示符表示任意用户,包括 root用户,都可以运行的命令。 # 提示 符 # 提示符表明命令仅为 root可以执行。当然,用户如果可以使用sudo命令的话,也 可以运行此提示符后面的命令。 虚拟机镜像指南 November 24, 2015 current 1 第 1 章 介绍 镜像的磁盘格式和镜像的容器格式 ................................................................................... 2 镜像元数据 ...................................................................................................................... 3 在你拥有虚拟机镜像(也有人叫"虚拟器件")之前,你的 OpenStack 计算云不太有用,这个 指南描述了如何获取,创建以及修改 OpenStack 兼容的虚拟机镜像。 为了简化,有时文档使用 "镜像" 代替 "虚拟机镜像" 。 虚拟机镜像是什么? 一个虚拟机镜像是一个文件,文件内包含了已经安装好可启动操作系统的虚拟磁盘。 虚拟机镜像有不同的格式,下面具体列出。 Raw "raw" 镜像格式是最最简单的,并且是被 KVM 和 Xen 原生支持的格式,你 可以想象裸格式镜像和块设备文件是二进制位相当的,就好像从块设备拷 贝过来的,比方说,使用dd 命令将 /dev/sda 内容拷贝到一个文件。 qcow2 qcow2 (QEMU 写时复制版本2)格式通常是KVM使用,相比裸格式,它有额 外的特性,例如: •使用稀疏文件呈现方式,因此镜像尺寸更小。 •支持快照。 因为qcow2 镜像是稀疏的,因此,qcow2镜像通常比裸格式镜像小,更小的 文件意味着上传更快,因此通常转换裸格式镜像到qcow2格式上传比直接 上传裸格式镜像文件更快。 注意 因为裸格式镜像不支持快照,OpenStack 计算节点在需要的时 候将会自动转换裸格式镜像到qcow2格式。 AMI/AKI/ARI AMI/AKI/ARI 格式是亚马逊 EC2 云最初支持的格式,它包含三类文件: •AMI (亚马逊虚机镜像): 裸格式镜像,如前面描述。 •AKI (亚马逊内核镜像) 虚拟化启动镜像时最先加载的内核文件。对 Linux 机器,对应的应该 是vmlinuz 文件。 •ARI (亚马逊 Ramdisk 镜像) 系统启动时可选的 ramdisk 文件,对 Linux 机器,对应的是 initrd 文 件。 UEC tarball UEC(Ubuntu 企业云) 文件是一个包含了 AMI AKI ARI文件的tar包压缩文 件。 虚拟机镜像指南 November 24, 2015 current 2 VMDK VMDK (Virtual Machine Disk) 是 VMware ESXi 虚拟化使用的镜像格式。 VDI VDI (Virtual Disk Image)是 VirtualBox 使用的镜像格式。OpenStack 计算节 点并不直接支持VDI格式,因此你在OpenStack中使用VDI镜像需要提前转换 成其他受支持的格式。 VHD 微软 Hyper-V 使用 VHD 镜像格式。 VHDX Microsoft Server 2012 中的 Hyper-V 版本使用的新的 VHDX 格式,它比VHD 有额外的新的特性例如支持更大的磁盘以及意外掉电时数据丢失保护。 OVF OVF (Open Virtualization Format)是一种虚拟机打包格式,由 DMTF (分布 式任务管理)标准组定义,单个 OVF 包包含一个或多个镜像文件, .ovf 后 缀的 XML元数据文件包含了关于虚拟机信息及其他文件的信息。 OVF 包可通过几种方式分发,例如,可以通过一系列分散的文件分发或者 通过一个tar归档文件(.ova后缀)分发。 OpenStack 计算节点目前并不支持 OVF 包,如果你想要在Openstack中使 用,你需要从OVF中释放磁盘镜像文件。 ISO ISO 格式是磁盘镜像被格式化成只读 ISO 9660(ECMA-119) 文件系统的格 式,通常用于 CD 和 DVD。通常 ISO 不被考虑是虚拟机镜像格式,由于他 包含一个可启动的文件系统,你可以将它看做是和其他虚拟机镜像文件一 样。 镜像的磁盘格式和镜像的容器格式 当你添加镜像到镜像服务,你可以指定镜像的磁盘和容器格式。 磁盘格式 虚拟机的磁盘格式指的是底层的磁盘镜像格式,虚拟设备厂商有不同的格式来放置虚拟机磁 盘镜像包含的信息。 设置你的镜像磁盘格式为下面的值: •raw: 无结构的磁盘镜像格式;如果你有一个无扩展名的磁盘文件,那么这个磁盘文件可 能是裸格式。 •vhd: VHD磁盘格式,一种被VMware, Xen, Microsoft, VirtualBox, 以及其他虚拟机管理程序 通用的磁盘格式。 •vmdk.:能被多钟虚拟机管理程序支持的通用格式。 •vdi.:能被 VirtualBox 虚机管理程序和 QEMU 模拟器支持的格式。 •iso:光盘数据内容的归档格式,例如CD-ROM。 •qcow2: 由 QEMU 模拟器支持,能动态扩展以及支持写时复制特性。 •aki: Amazon 内核镜像。 •ari.:Amazon ramdisk 镜像。 虚拟机镜像指南 November 24, 2015 current 3 •ami: Amazon 虚机镜像。 容器格式 镜像容器格式表示包含虚拟机镜像的文件是否也包含虚拟机的metadata数据。 注意 目前,镜像服务以及 OpenStack 的其他项目都不支持解析容器格式,如果你不 确定你虚拟机镜像容器格式,你可以安全的指定bare作为容器格式。 你可设置你的镜像容器格式为以下之一: •bare. 镜像没有容器或者没有封装metadata数据。 •ovf. OVF容器格式。 •aki. Amazon 内核镜像。 •ari. Amazon ramdisk 镜像。 •ami. Amazon 虚机镜像。 镜像元数据 镜像元数据使最终用户能获取镜像的原生特性,并且用于关联 OpenStack 的各组件以及驱动 镜像服务接口。 元数据还能探测知主机的调度。 如果设置了镜像的 property 选项,而且计算节点也配置了 启用(默认的) ImagePropertiesFilter 调度过滤器。那么调度器在调度时只需要考虑哪些 符合属性需求的计算节点。 注意 计算节点的 ImagePropertiesFilter 值在 /etc/nova/nova.conf 文件的 scheduler_default_filter 参数设定。 你可以使用 glance image-create 或者 glance image-update 命令设置 --property key=value 添加元数据到镜像服务中的镜像。多个属性值可指定。例如: $ glance image-update img-uuid --property architecture=arm --property hypervisor_type=qemu 通用的镜像属性可以在 /etc/glance/schema-image.json 文件设定。要获取有效的属性值和 数值,参考 OpenStack Command-Line Reference. 镜像的所有相关联的属性可以使用 glance image-show 命令显示。例如: $ glance image-show myCirrosImage +---------------------------------------+--------------------------------------+ | Property | Value | +---------------------------------------+--------------------------------------+ | Property 'base_image_ref' | 397e713c-b95b-4186-ad46-6126863ea0a9 | | Property 'image_location' | snapshot | | Property 'image_state' | available | 虚拟机镜像指南 November 24, 2015 current 4 | Property 'image_type' | snapshot | | Property 'instance_type_ephemeral_gb' | 0 | | Property 'instance_type_flavorid' | 2 | | Property 'instance_type_id' | 5 | | Property 'instance_type_memory_mb' | 2048 | | Property 'instance_type_name' | m1.small | | Property 'instance_type_root_gb' | 20 | | Property 'instance_type_rxtx_factor' | 1 | | Property 'instance_type_swap' | 0 | | Property 'instance_type_vcpu_weight' | None | | Property 'instance_type_vcpus' | 1 | | Property 'instance_uuid' | 84c6e57d-a6b1-44b6-81eb-fcb36afd31b5 | | Property 'kernel_id' | df430cc2-3406-4061-b635-a51c16e488ac | | Property 'owner_id' | 66265572db174a7aa66eba661f58eb9e | | Property 'ramdisk_id' | 3cf852bd-2332-48f4-9ae4-7d926d50945e | | Property 'user_id' | 376744b5910b4b4da7d8e6cb483b06a8 | | checksum | 8e4838effa1969ad591655d6485c7ba8 | | container_format | ami | | created_at | 2013-07-22T19:45:58 | | deleted | False | | disk_format | ami | | id | 7e5142af-1253-4634-bcc6-89482c5f2e8a | | is_public | False | | min_disk | 0 | | min_ram | 0 | | name | myCirrosImage | | owner | 66265572db174a7aa66eba661f58eb9e | | protected | False | | size | 14221312 | | status | active | | updated_at | 2013-07-22T19:46:42 | +---------------------------------------+--------------------------------------+ 镜像转换的卷属性 当从镜像创建块存储卷的时候,需要考虑镜像的属性。如果你修改镜像的核心 属性,你也应该更新块存储配置。修改所有匹配你设置在镜像服务的核心属性 的控制节点 的/etc/cinder/cinder.conf 文件的 glance_core_properties 值。 虚拟机镜像指南 November 24, 2015 current 5 第 2 章 获取镜像 CentOS 镜像 .................................................................................................................... 5 CirrOS (测试镜像) ........................................................................................................... 5 Ubuntu 官方镜像 .............................................................................................................. 5 红帽企业lLinux官方镜像 .................................................................................................. 6 官方Fedora 镜像 .............................................................................................................. 6 官方 openSUSE 和 SLES 镜像 ............................................................................................ 6 官方 Debian 镜像 ............................................................................................................. 6 其他Linux发行版的官方镜像 ............................................................................................ 7 Rackspace 云计算镜像(多个发行版) ............................................................................. 7 微软 Windows 镜像 ........................................................................................................... 7 获取 OpenStack 兼容的虚拟机镜像的最简单的方法就是直接下载已经制作好的镜像,大多数 镜像中包含 cloud-init 软件包以支持 SSH 密钥对以及用户数据注入。由于许多镜像默认禁用 了SSH 密码认证,镜像首次启动是会注入SSH 密钥对。你可以使用默认账户的私钥登陆到创 建的虚拟机中。参考OpenStack 使用指南 获取如何创建和注入密钥对到Openstack的详细信 息。 CentOS 镜像 CentOS 项目维护官方的镜像下载。 •CentOS 6 镜像 •CentOS 7 镜像 注意 CentOS 云镜像中的登陆账号是 centos. CirrOS (测试镜像) CirrOS 是一个最小化的 Linux 发行版,它被设计为用于诸如 OpenStack 云计算测试用镜像。 你可以从 CirrOS 下载页面下载不同格式的 CirrOS 镜像。 如果你部署的使用 QEMU 或者 KVM,我们推荐使用 QCOW2 镜像格式,本文档编写时最近的64 位 qcow2 镜像是 cirros-0.3.4-x86_64-disk.img。 注意 CirrOS 镜像的登陆账号是 cirros,密码是 cubswin:) Ubuntu 官方镜像 Canonical 维护 Ubuntu系列官方镜像集。 镜像被分类为 Ubuntu 发行版本,以及镜像发行日期,镜像发布的 "current" 是最近的 发行版。例如,页面包含的最近的 "Trusty Tahr" Ubuntu 14.04版本地址是 http://cloud- images.ubuntu.com/trusty/current/ 。拉动页面到最底下即可直接下载。 虚拟机镜像指南 November 24, 2015 current 6 如果你的部署使用 QEMU 或者 KVM,推荐使用 qcow2 镜像格式。本文档编写时最新的 64位 Ubuntu 14.04 qcow2 镜像是trusty-server-cloudimg-amd64-disk1.img。 注意 Ubuntu 云镜像的登陆账号是 ubuntu。 红帽企业lLinux官方镜像 红帽公司维护红帽企业lLinux官方镜像。下载这些镜像需要红帽企业Linux订阅。 •Red Hat Enterprise Linux 7 KVM Guest Image •Red Hat Enterprise Linux 6 KVM Guest Image 注意 在红帽企业Linux云镜像中,登陆账户是 cloud-user。 官方Fedora 镜像 Fedora 项目维护了一个官方云镜像列表,地址是 https://getfedora.org/en/cloud/ download/. 注意 在Fedora 云镜像中,登陆账户是 fedora. 官方 openSUSE 和 SLES 镜像 SUSE 为 openSUSE 提供镜像。对于SUSE 企业服务器版 Linux(SLES),定制镜像可以通过基 于web的一个工具 SUSE Studio来完成。SUSE Studio同时也可以用于定制openSUSE 镜像。 官方 Debian 镜像 自 2015年1月开始,Debian 提供直接下载镜像。他们和 CD 以及 DVD 镜像同步,然而,直到 Debian 8.0 (也称 Jessie)出来,这些镜像还是每周生成的测试发行版(译者注:但貌似现在 已经有8.1的正式版放出了)。 如果你想创建 Debian 7.0 镜像(也就是 Wheezy,Debian 当前稳定版本)。你可以使用用 于创建官方的 Debian 镜像的 openstack-debian-images 软件包,它提供既简单的脚本来创 建。这个包在 Debian 未稳定分支 Debian Jessie 内,通过使用 wheezy-backports 源。要生成 Wheezy 镜像,仅需运行: # build-openstack-debian-image -r wheezy 如果你创建 Wheezy 镜像,诸如 cloud-init, cloud-utils 或 cloud-initramfs-growroot 安装包 将从 wheezy-backports 获取。并且,当前版本的 Wheezy 的 bootlogd包不支持记录日志到多 个控制台,但OpenStack Dashboard 控制台和 nova console-log 需要记录日志到多控制台才 虚拟机镜像指南 November 24, 2015 current 7 能工作。因此, GPLHost 软件库的修正的非官方版本。要在镜像上安装它,可能需要使用 build-openstack-debian-image 脚本的 --hook-script 选项,使用下面的脚本作为参数: #!/bin/sh cp bootlogd_2.88dsf-41+deb7u2_amd64.deb ${BODI_CHROOT_PATH} chroot ${BODI_CHROOT_PATH} dpkg -i bootlogd_2.88dsf-41+deb7u2_amd64.deb rm ${BODI_CHROOT_PATH}/bootlogd_2.88dsf-41+deb7u2_amd64.deb 注意 在 Debian 镜像中,登陆账号是 admin。 其他Linux发行版的官方镜像 在本文档编写时,我们并未发现其他Linux发行版提供镜像下载。 Rackspace 云计算镜像(多个发行版) Rackspace 云运行商维护了多个发行版(Red Hat, CentOS, Fedora, Ubuntu)预先创建的镜像 列表。列表的链接为rackerjoe/oz-image-build on GitHub。 微软 Windows 镜像 Cloudbase Solutions 存放了可运行在 Hyper-V, KVM, 以及 XenServer/XCP 上的OpenStack Windows Server 2012 标准版评估镜像。 虚拟机镜像指南 November 24, 2015 current 8 第 3 章 OpenStack Linux 镜像需求 磁盘分区以及在启动时调整根分区大小 (cloud-init) ......................................................... 8 无硬编码的 MAC 地址信息 ............................................................................................... 10 确保 ssh 服务在运行 ..................................................................................................... 10 禁用防火墙 .................................................................................................................... 10 使用 SSH 公钥(cloud-init)访问虚拟机 ......................................................................... 11 处理用户数据以及其他元数据(cloud-init) .................................................................. 12 确认镜像输出启动日志到控制台 ..................................................................................... 12 内核内对半虚拟化的 Xen 支持(仅Xen 虚拟化) ............................................................. 12 管理镜像缓存 ................................................................................................................. 13 要使基于 Linux的镜像在 OpenStack 云计算中有全部的功能,有几个必要条件。其中你可以 安装 cloud-init软件包来完成。在你创建镜像之前,阅读这一章节,以便明确你想要使用的 镜像支持 OpenStack 的哪些特性。 •磁盘分区以及在启动时调整根分区大小 (cloud-init) •无硬编码的 MAC 地址信息 •启用SSH服务 •禁用防火墙 •使用SSH 公钥访问虚拟机 (cloud-init) •处理用户以及其他的元数据 (cloud-init) •Linux 内核对半虚拟化 Xen的支持 (Xen hypervisor only with Linux kernel version < 3.0) 磁盘分区以及在启动时调整根分区大小 (cloud-init) 当创建 Linux 镜像时,你必须决定如何分区。选择不同的分区方法会对重新调整分区大小有 不同的影响,请看以下章节的描述。 镜像磁盘的大小在最开始创建磁盘的时候就已经决定了的,然而,OpenStack 通过指定不同 的硬件配置规格让你启动磁盘大小不同的虚拟机。例如,如果你的镜像是5GB,你创建的虚 拟机指定的虚拟机规格是 m1.small 。最终创建的虚拟机的系统磁盘是10GB。当虚拟机的磁盘 扩充的时候,在磁盘的后面以0填充。 你的镜像必须能在启动的时候重新伸缩大小以便匹配最终用户的需求。否则,在虚拟机启动 后,你需要手工改变分区的容量才能使用虚拟机指定的硬件配置规格的磁盘分容量大于你镜 像原有容量的那部分容量。 Xen: 单一 ext3/ext4 分区 ( 无LVM , 无 /boot ,无swap分区区 ) 如果你使用 OpenStack XenAPI 驱动,那么计算服务在虚拟机启动时会自动调整分区和文件 系统大小。在满足以下条件的时候会自动调整容量需: •在镜像的属性设置了 auto_disk_config=True 。 虚拟机镜像指南 November 24, 2015 current 9 •镜像的磁盘只有一个分区。 •仅有的分区文件系统是 ext3 或者 ext4 . 因此,如果你使用 Xen ,我们推荐当你创建镜像时,只建立一个 ext3 或者 ext4 分区(而且 没有LVM管理)。否则,继续往下看。 非 Xen 平台安装 cloud-init/cloud-tools :单 ext3/ext4 分区 (无 LVM ,无 /boot , 无 SWAP) 你的镜像必须满足以下配置: •镜像的分区表表述的是镜像的原始大小。 •镜像的文件系统填充满镜像的原始大小。 然后,在启动过程中,你必须: •修改分区表识别磁盘额外的空间。 •如果你没使用 LVM,你需要修改分区表扩充已经存在的根分区包纳磁盘额外的空间。 •如果你使用了LVM,你可以添加新 LVM 条目到分区表,创建新 LVM 物理卷,然后添加 LVM 物理卷到 卷组,然后扩充 root 卷的容量。 •重改变 root 卷文件系统。 实现以上操作最简单的方法是安装以下软件到镜像内: •cloud-utils 包,包含了 growpart 工具来扩展分区。 •cloud-initramfs-growroot 包在 Ubuntu , Ubuntu 和 Fedora 上支持系统首次启动时改变根 分区大小。 •Centos 和 RHEL 上使用cloud-initramfs-growroot •cloud-init 软件包。 通过安装这些包,镜像在启动时完成root分区改变大小。例如,通过设置/etc/rc.local 文件,这些包包在Ubuntu 和 Debian 包管理库内以及 EPEL 库( Fedora/RHEL/CentOS/ Scientific 系列 Linux) 如果你不能安装 cloud-initramfs-tools 软件包,Robert Plestenjak 在 GitHub 上有个项目叫 linux-rootfs-resize ,包含了脚本更新ramdisk,在ramdisk内使用 growpart 命令因此在启动 的时候镜像尺寸缩放已经就绪。 如果你能安装 cloud-utils 和 cloud-init包,我们推荐你创建镜像时,只创建一个 ext3 和 ext4 分区(且不使用LVM管理) 非 Xen 环境且无 cloud-init/cloud-tools软件包:使用 LVM 如果你不能安装 cloud-init 和 cloud-tools 软件包到镜像内但你还想镜像支持伸缩大小,你 必须编写脚本让你的镜像在启动的时候修改分区表。在这种情况下,我们推荐使用 LVM 来管 虚拟机镜像指南 November 24, 2015 current 10 理你的磁盘分区。由于 Linux 内核限制(本文档编写时),当磁盘有分区被挂载的时候你不 能修改磁盘分区表,但是你可以使用 LVM 。 你的脚本需要完成以下功能: 1. 检查磁盘额外可用空间。例如,解析 parted /dev/sda --script "print free" 的输出。 2. 在额外的空间上创建 LVM 分区。例如:parted /dev/sda --script "mkpart lvm ..." 。 3. 创建新的物理卷(PV)。例如: pvcreate /dev/sda6 。 4. 使用这个屋里分区扩展卷组(VG)。例如: vgextend vg00 /dev/sda6 。 5. 使用分区所有空间扩展包含根分区的逻辑卷(LV)。例如,lvextend /dev/mapper/node- root /dev/sda6。 6. 重新改变根文件系统大小。例如,resize2fs /dev/mapper/node-root。 你无须 /boot分区,除非你的镜像使用的是较老的 Linux 发行版,那些发行版要求 /boot 目 录不能被 LVM管理。 无硬编码的 MAC 地址信息 你必须删除镜像内网络规则文件,因为它这会导致新创建虚拟机启动时网卡不是eth0。这是 由于你创建的镜像第一次安装时会记录网卡的MAC地址。并且MAC地址在每次创建虚拟机时不 同。你应该修改以下文件: •使用空文件替换 /etc/udev/rules.d/70-persistent-net.rules 文件(包含网络持久规则, 包括MAC地址)。 •使用空文件替换 /lib/udev/rules.d/75-persistent-net-generator.rules 文件(它将生成上 面所说的文件)。 •在 Fedora系列的镜像上从 /etc/sysconfig/network-scripts/ifcfg-eth0 文件删除 HWADDR 一行。 注意 如果你删除网络持久规则文件,系统启动时你会看到内核警告信息,这是为什 么我们推荐使用空文件替代的原因。 确保 ssh 服务在运行 在镜像内你必须安装 SSH 服务并且确保它在启动时自动启动,否则你不能通过 ssh 连接到你 在 OpenStack 内的虚拟机。ssh 服务包名通常叫做 openssh-server 。 禁用防火墙 通常,我们推荐你关闭掉镜像内所有的防火墙,使用 OpenStack 安全组来限制访问你的虚拟 机。因为在镜像内开启防火墙会增加在不能访问虚拟机的时候诊断问题时的难度。 虚拟机镜像指南 November 24, 2015 current 11 使用 SSH 公钥(cloud-init)访问虚拟机 访问在 OpenStack 内运行的虚拟机典型的办法是通过 ssh 使用公钥认证。为了实现这个,你 的虚拟机镜像必须被配置为在虚拟机启动时能从 OpenStack 元数据服务获取ssh 公钥或者使 用config 磁盘。 如果镜像内同时包含 XenAPI 和 cloud-init 包,cloud-init包处理ssh-key的注入。当镜像有 cloud_init_installed 属性的时候系统假设镜像已经安装cloud-init 包。 使用 cloud-init 获取公钥 cloud-init 软件从元数据服务自动获取公钥并存放在账户内。不同发行版的账户不一样。基 于 Ubuntu 系的虚拟机,账户是 ubuntu 。Fedora 系的虚拟机,账户是 ec2-user。 你可以编辑 /etc/cloud/cloud.cfg 文件添加一行修改 cloud-init 使用的账户名,例如,添加 以下这行到配置文件,来配置 cloud-init 存放公钥到admin账户: user: admin 编写脚本获取公钥 如果你没有或者不希望安装 cloud-init包到虚拟机里,你可以自己编写脚本来获取公钥并存 放到用户账户内。 要获取 ssh 公钥并存放到 root 账户。编辑 /etc/rc.local 文件并添加以下内容到 "touch / var/lock/subsys/local" 这行之前。下面的脚本片段来自 rackerjoe oz-image-build CentOS 6 template。 if [ ! -d /root/.ssh ]; then mkdir -p /root/.ssh chmod 700 /root/.ssh fi # Fetch public key using HTTP ATTEMPTS=30 FAILED=0 while [ ! -f /root/.ssh/authorized_keys ]; do curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /tmp/metadata-key 2>/dev/ null if [ $? -eq 0 ]; then cat /tmp/metadata-key >> /root/.ssh/authorized_keys chmod 0600 /root/.ssh/authorized_keys restorecon /root/.ssh/authorized_keys rm -f /tmp/metadata-key echo "Successfully retrieved public key from instance metadata" echo "*****************" echo "AUTHORIZED KEYS" echo "*****************" cat /root/.ssh/authorized_keys echo "*****************" else FAILED=`expr $FAILED + 1` if [ $FAILED -ge $ATTEMPTS ]; then echo "Failed to retrieve public key from instance metadata after $FAILED attempts, quitting" break 虚拟机镜像指南 November 24, 2015 current 12 fi echo "Could not retrieve public key from instance metadata (attempt #$FAILED/$ATTEMPTS), retrying in 5 seconds..." sleep 5 fi done 注意 有些 VNC 客户会使用分号 (;)替换冒号(:) 以及用中划线 (-)替换下划线(_) ,确 认你输入的是 http: 而不是 http; , authorized_keys 而不是 authorized-keys。 处理用户数据以及其他元数据(cloud-init) 除了 ssh 公钥,镜像可能还需要从 Openstack 中获取其他信息,例如当启动虚拟机获取镜像 的时候 提供虚机用户数据 ,以及你可能在虚拟机启动的时候设置主机名,或者你可能希望 配置镜像设置它在启动的时候执行用户数据脚本。 你可以通过元数据服务访问这些信息或者参考 在配置驱动器存储元数据。Openstack 元数 据服务兼容亚马逊 EC2 元数据服务标准 2009-04-04 版。查阅亚马逊 EC2 文档 使用虚机元数 据获取如何获取用户数据的详细信息。 支持这个功能的最简单的办法是安装 cloud-init 软件包到你的镜像,它默认配置为将用户数 据视为可执行脚本并且设置主机名。 确认镜像输出启动日志到控制台 你必须配置镜像以便镜像内核输出启动日志到 ttyS0 设备,尤其是 console=ttyS0参数必须 在启动时传递给内核。 如果你的镜像使用 grub2 做为引导程序,在配置文件内应该有一行配置内容。例如, / boot/grub/grub.cfg,看起来应该如下: linux /boot/vmlinuz-3.2.0-49-virtual root=UUID=6d2231e4-0975-4f35-a94f-56738c1a8150 ro console=ttyS0 如果 console=ttyS0 不存在,你需要修改 grub 配置,通常,你不应该直接更新 grub.cfg 文 件,因为它是程序自动生成的。作为替代的,你应该编辑 /etc/default/grub 文件并修改 GRUB_CMDLINE_LINUX_DEFAULT 的值: GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0" 然后,更新 grub 配置,在 Debian 系列的系统如 Ubuntu,运行以下命令: # update-grub 在 Fedora 系列的系统,如 RHEL 和 CentOS,以及 openSUSE,运行以下命令: # grub2-mkconfig -o /boot/grub2/grub.cfg 内核内对半虚拟化的 Xen 支持(仅Xen 虚拟化) 在 Linux 内核 3.0以前,内核的主线分支不支持 Xen 半虚拟化虚拟机(即 Xen DomU 虚拟 机)。如果你运行 Xen 半虚拟化,并且你想创建内核在3.0版本之前的虚拟机镜像,你不许 确保镜像启动内核已经编译了 Xen 支持。 虚拟机镜像指南 November 24, 2015 current 13 管理镜像缓存 使用 nova.conf的选项来控制在 /var/lib/nova/instances/_base/ 目录中是否保存或者多长 时间,未使用的基础镜像。如果你配置了虚拟机活迁移。所有的计算节点还需要共享同一个 /var/lib/nova/instances/ 目录 关于 Openstack 中的 libvirt 镜像信息,参考 The life of an OpenStack libvirt image from Pádraig Brady. 表 3.1. 镜像缓存管理配置选项 配置属性=默认值 (类型) 描述 preallocate_images=none (字符串型)虚拟机镜像预分配模式: •none。不分配存储。 •space。虚拟机启动时存储完全分配。$instance_dir/目 录在空间足够的情况下立即 fallocate分配。并且为了增 加虚拟机 I/O 性能,会选择更适合的的块设备。 remove_unused_base_images=True (布尔型)未使用的基础镜像是否被删除? 当设置为 True 的时候,删除未使用的基础镜像的时间间隔在下面两个参 数设置。如果设置为 False,基础镜像将一直不被删除。 remove_unused_original_minimum_age_seconds=86400 (整数型),未使用以及未修改大小的镜像,低于这个 值,不删除。默认是86400秒,或24小时。 remove_unused_resized_minimum_age_seconds=3600 (整数型)未使用且大小改变了的基础镜像镜像文件,低 于这个值的不删除。默认是3600秒,或1小时。 查看以上设置对被删除的虚拟机镜像文件的影响,查看以下目录: # ls -lash /var/lib/nova/instances/_base/ 在 /var/log/compute/compute.log 文件,查看以下部分日志。 2012-02-18 04:24:17 41389 WARNING nova.virt.libvirt.imagecache [-] Unknown base file: /var/lib/nova/ instances/_base/06a057b9c7b0b27e3b496f53d1e88810 a0d1d5d3_20 2012-02-18 04:24:17 41389 INFO nova.virt.libvirt.imagecache [-] Removable base files: /var/lib/nova/ instances/_base/06a057b9c7b0b27e3b496f53d1e88810 a0d1d5d3 /var/lib/nova/instances/_base/06a057b9c7b0b27e3b496f53d1e88810a0d1d5d3_20 2012-02-18 04:24:17 41389 INFO nova.virt.libvirt.imagecache [-] Removing base file: /var/lib/nova/instances/ _base/06a057b9c7b0b27e3b496f53d1e88810a0d1d5d3 由于 remove_unused_original_minimum_age_seconds 的值默认是86400秒(24小时),你可 以等待这个时间间隔来查看基础镜像是否被删除,或者在 nova.conf 内设置更短的时间间 隔。修改 nova.conf 后,重启所有的 nova 服务。 虚拟机镜像指南 November 24, 2015 current 14 第 4 章 更改镜像内容 guestfish ...................................................................................................................... 14 guestmount .................................................................................................................... 15 virt-* tools ................................................................................................................... 16 loop(环回)设备,kpartx,网络块设备 .............................................................................. 17 有时你拿到一个虚拟机镜像,但你在将它上传到 OpenStack镜像服务之前,你想要修改镜像 里的内容。这里介绍几个可以修改镜像的工具。 警告 不要使用这些工具修改正在运行的虚拟机镜像,这些工具被设计成只能修改未 运行的虚拟机镜像。 guestfish guestfish程序是 libguestfs 项目的一个工具,它使你可以修改虚拟机镜像里的文件。 注意 guestfish并不直接mount镜像文件到本地文件系统,而是提供一个shell接口, 你可以通过这个shell接口对镜像内文件做查看,编辑,删除操作,诸如 touch, chmod, 和 rm的 guestfish 命令,就像普通bash命令一样。 guestfish 修改示例: 有时,你必须删除虚拟机镜像内任何包含虚拟机安装时分配给虚拟机网卡的MAC的文件, 因为用镜像文件创建新虚拟机时网卡MAC地址和创建镜像的虚拟机并不一样。这个示例通 过删除 /etc/udev/rules.d/70-persistent-net.rules文件以及删除/etc/sysconfig/network- scripts/ifcfg-eth0文件中HWADDR一行来演示了如何使用guestfish删除镜像中和原MAC地址 相关联的地方。 假设你有一个文件名为centos63_desktop.img的 CentOS qcow2 格式的虚拟机镜像。用root用 户挂载这个镜像为可读可写模式,如下: # guestfish --rw -a centos63_desktop.img Welcome to guestfish, the libguestfs filesystem interactive shell for editing virtual machine filesystems. Type: 'help' for help on commands 'man' to read the manual 'quit' to quit the shell > 通过上面命令,进入了 guestfish 会话,注意 guestfish提示符像一条鱼的样子: > . 在做任何操作之前,必须先在 guestfish提示符运行run命令。它会启动一个虚拟机,用于 完成我们所以的对文件的操作。 虚拟机镜像指南 November 24, 2015 current 15 > run 通过list-filesystems命令,我们可查看镜像内的文件系统列表: > list-filesystems /dev/vda1: ext4 /dev/vg_centosbase/lv_root: ext4 /dev/vg_centosbase/lv_swap: swap 我们必须挂载包含根分区的那个逻辑卷: > mount /dev/vg_centosbase/lv_root / 下一步,我们想删除一个文件,使用guestfish 命令 rm ,就像使用普通shell命令一样。 > rm /etc/udev/rules.d/70-persistent-net.rules 我们想编辑 ifcfg-eth0 文件以便删除 HWADDR 这一行。edit命令将文件拷贝文件到主机,调 用编辑器打开文件,编辑完后将它又拷贝回原来的位置。 > edit /etc/sysconfig/network-scripts/ifcfg-eth0 如果你想修改镜像让他在启动时加载8021q内核模块,你必须在/etc/sysconfig/modules/目 录下简历一个可执行脚本。你可以使用touchguestfish命令创建一个空文件,然后使用edit 命令编辑它,然后使用 chmod 命令让它具有可执行权限。 > touch /etc/sysconfig/modules/8021q.modules > edit /etc/sysconfig/modules/8021q.modules 我们添加以下一行到文件内,然后保存: modprobe 8021q 然后设置文件可执行权限: > chmod 0755 /etc/sysconfig/modules/8021q.modules 一切都完成后,我们可以使用 exit命令退出guestfish提示符: > exit guestfish更多功能 guestfish有大量庞大的功能,完全介绍它查出了本文档的功能范围。因此,我们推荐你阅 读 guestfs-recipes 文档页面感知通过这些工具都能做什么。 guestmount 对于某些类型的修改,你可以使用更简单的方式直接挂载镜像内文件系统。guestmount 程 序,同样出自于 libguestfs 项目。 例如,挂载 centos63_desktop.qcow2镜像内的根分区到 /mnt目录,可以敲以下命令: # guestmount -a centos63_desktop.qcow2 -m /dev/vg_centosbase/lv_root --rw /mnt 如果我们预先不知道镜像内的分区挂载点,可以使用-i(检阅)参数告诉 guestmount 自动 检测挂载点: 虚拟机镜像指南 November 24, 2015 current 16 # guestmount -a centos63_desktop.qcow2 -i --rw /mnt 当挂载完成后,我们可以干一些诸如使用rpm命令查看软件包安装列表等类似的事: # rpm -qa --dbpath /mnt/var/lib/rpm 当一切都完成后,卸载它: # umount /mnt virt-* tools libguestfs项目还有其他一堆有用的工具,包括 •virt-edit 用于编辑镜像内的文件。 •virt-df 用于显示镜像内的空闲空间。 •virt-resize 用于伸缩镜像文件大小。 •virt-sysprep 用于做镜像分发前的准备工作(例如,删除SSH 主机秘钥,删除MAC地址信 息,或者删除用户账号)。 •virt-sparsify 用于使镜像文件稀疏化。 •virt-p2v 用于转换物理机系统到一个运行在KVM上的镜像文件。 •virt-v2v 用于转换 Xen 和 VMware 镜像到 KVM 镜像。 修改镜像内单个文件 这个示例演示了如何使用virt-edit修改文件,这个命令既可以通过使用-a标记后跟文件名作 为参数,也可以通过使用-d后跟虚拟机的 domain 名称作为参数。下面的示例演示如何修改 在libvirt中运行的 domain 名称为 instance-000000e1的虚拟机内/etc/shadow文件: # virsh shutdown instance-000000e1 # virt-edit -d instance-000000e1 /etc/shadow # virsh start instance-000000e1 改变镜像大小 这是一个使用 virt-resize改变镜像大小的简单示例。假设我们有一个16GB的 qcow2 格式的 Windows 镜像想要改变大小到50GB。首先,识别分区: 在这个示例中,/dev/sda2是我们需要修改大小的分区,我们创建一个新的 qcow2 镜像并且 使用 virt-resize 命令写入一个修改大小后的原始镜像文件到新镜像文件内: # qemu-img create -f qcow2 /data/images/win2012-50gb.qcow2 50G # virt-resize --expand /dev/sda2 /data/images/win2012.qcow2 \ /data/images/win2012-50gb.qcow2 Examining /data/images/win2012.qcow2 ... ********** Summary of changes: 虚拟机镜像指南 November 24, 2015 current 17 /dev/sda1: This partition will be left alone. /dev/sda2: This partition will be resized from 15.7G to 49.7G. The filesystem ntfs on /dev/sda2 will be expanded using the 'ntfsresize' method. ********** Setting up initial partition table on /data/images/win2012-50gb.qcow2 ... Copying /dev/sda1 ... 100% #▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓# 00:00 Copying /dev/sda2 ... 100% #▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓# 00:00 Expanding /dev/sda2 using the 'ntfsresize' method ... Resize operation completed with no errors. Before deleting the old disk, carefully check that the resized disk boots and works correctly. loop(环回)设备,kpartx,网络块设备 如果你不能使用libguestfs,你可以使用loop(环回)设备,kpartx,网络块设备直接挂载镜像 文件系统到宿主机系统。 警告 使用本节介绍的工具挂载一个不受信任的虚机镜像有安全风险,如果你需要 访问虚拟机镜像内的内容,请使用 libguestfs 项目的工具诸如 guestfish 和 guestmount 。查看由Daniel Berrangé 写的A reminder why you should never mount guest disk images on the host OS为什么不要挂载虚拟机磁盘镜像到宿主 机系统的提示 获取更多细节内容。 挂载裸镜像(无LVM) 如果你有未使用LVM管理分区的裸虚拟机镜像。首先,使用losetup命令查找系统未使用的环 回设备。 # losetup -f /dev/loop0 在这个示例中,/dev/loop0是空闲的,关联裸镜像到环回设备: # losetup /dev/loop0 fedora17.img 如果镜像只有一个分区,你可以直接挂载环回设备: # mount /dev/loop0 /mnt 如果镜像有多个分区,使用kpartx显示分区为单独的设备(如:/dev/mapper/loop0p1), 然后挂载对应根文件系统的分区: # kpartx -av /dev/loop0 如果镜像显示有三个分区,对应的每个分区会有新的设备文件创建: 虚拟机镜像指南 November 24, 2015 current 18 $ ls -l /dev/mapper/loop0p* brw-rw---- 1 root disk 43, 49 2012-03-05 15:32 /dev/mapper/loop0p1 brw-rw---- 1 root disk 43, 50 2012-03-05 15:32 /dev/mapper/loop0p2 brw-rw---- 1 root disk 43, 51 2012-03-05 15:32 /dev/mapper/loop0p3 要挂载第二个分区,用 root 执行: # mkdir /mnt/image # mount /dev/mapper/loop0p2 /mnt 当所有操作完成后,清理操作: # umount /mnt # kpartx -d /dev/loop0 # losetup -d /dev/loop0 挂载裸镜像(有LVM) 如果你镜像分区使用了LVM,使用前面介绍的 losetup 和 kpartx 显示分区: # losetup -f /dev/loop0 # losetup /dev/loop0 rhel62.img # kpartx -av /dev/loop0 下一步,你需要用 vgscan 命令识别 LVM 卷组然后使用 vgchange 激活卷: # vgscan Reading all physical volumes. This may take a while... Found volume group "vg_rhel62x8664" using metadata type lvm2 # vgchange -ay 2 logical volume(s) in volume group "vg_rhel62x8664" now active # mount /dev/vg_rhel62x8664/lv_root /mnt 当完成操作后,清理命令“ # umount /mnt # vgchange -an vg_rhel62x8664 # kpartx -d /dev/loop0 # losetup -d /dev/loop0 挂载 qcow2 镜像(无LVM) 你需要加载 nbd (网络块设备)内核模块来挂载 qcow2 镜像文件。下面将加载满足我们需求 的支持16个块设备,以root用户执行: # modprobe nbd max_part=16 假设第一个块设备(/dev/nbd0)当前未被占用,我们使用qemu-nbd 和 partprobe 列出磁盘分 区。以root用户执行: # qemu-nbd -c /dev/nbd0 image.qcow2 # partprobe /dev/nbd0 如果镜像有三个分区(/boot, /, swap),对应的每个分区应该有新设备文件建立: $ ls -l /dev/nbd3* brw-rw---- 1 root disk 43, 48 2012-03-05 15:32 /dev/nbd0 brw-rw---- 1 root disk 43, 49 2012-03-05 15:32 /dev/nbd0p1 虚拟机镜像指南 November 24, 2015 current 19 brw-rw---- 1 root disk 43, 50 2012-03-05 15:32 /dev/nbd0p2 brw-rw---- 1 root disk 43, 51 2012-03-05 15:32 /dev/nbd0p3 注意 如果你选择的网络块设备已经被占用,最开始的 qemu-nbd 命令将会失败,并且 /dev/nbd3p{1,2,3} 设备文件也不会被建立。 如果镜像分区没有使用LVM,那么可以直接挂载他们: # mkdir /mnt/image # mount /dev/nbd3p2 /mnt 一切操作完成后,清理命令: # umount /mnt # qemu-nbd -d /dev/nbd0 挂载 qcow2 镜像(有LVM) 如果镜像分区使用LVM管理,在你使用 qemu-nbd 和 partprobe 命令后,你需要使用 vgscan 和 vgchange -ay 来列出LVM分区设备以便这些分区能被挂载: # modprobe nbd max_part=16 # qemu-nbd -c /dev/nbd0 image.qcow2 # partprobe /dev/nbd0# vgscan Reading all physical volumes. This may take a while... Found volume group "vg_rhel62x8664" using metadata type lvm2 # vgchange -ay 2 logical volume(s) in volume group "vg_rhel62x8664" now active # mount /dev/vg_rhel62x8664/lv_root /mnt 完成后,清理命令: # umount /mnt # vgchange -an vg_rhel62x8664 # qemu-nbd -d /dev/nbd0 虚拟机镜像指南 November 24, 2015 current 20 第 5 章 手动创建镜像 检查 libvirt 默认网络是否运行 ...................................................................................... 20 使用 virt-manager X11 图形界面 .................................................................................... 20 使用 virt-install 且使用本地 VNC 客户端连接 ................................................................. 21 示例:CentOS 镜像 ........................................................................................................ 22 示例:Ubuntu 镜像 ........................................................................................................ 29 示例:Fedora 镜像 ........................................................................................................ 35 示例:微软Windows镜像 .................................................................................................. 38 示例:FreeBSD 镜像 ....................................................................................................... 39 创建新的虚拟机镜像是安装完 OpenStack 意外的事情。你在你的系统上手工创建新虚拟机镜 像并且上传到云。 要创建新的虚拟机镜像,你需要虚拟机系统的安装 CD 或 DVD ISO 文件。你还需要虚拟化工 具,你可以使用KVM。或者如果你有图形的桌面虚拟化工具(例如, VMware Fusion 或者 VirtualBox),你可以使用它替代KVM,只是在你完成后需要转换镜像格式为裸格式。 当你创建虚拟机镜像的时候,你需要连接到虚拟化层的图形控制台,图形控制台作为虚 拟机的显示器并且使你能使用键盘和鼠标和虚拟机操作系统安装程序进行交互。KVM 通过 VNC (虚拟网络计算)协议或者更新的 SPICE 协议来完成图形控制台的显示。这里我们使用 VNC,因此你将在你的本地桌面更加可能使用 VNC 客户端。 检查 libvirt 默认网络是否运行 在使用 libvirt 启动虚拟机前,检查它的 "default" 默认网络是否启动。虚拟机要连接到外 网,它的默认网络必须激活。启动 libvirt 默认网络将创建 linux 网桥( 通常名称是virbr0 ),iptables 规则,以及dhcp服务器进程 dnsmasq 。 检查 "default" 默认网络是否激活,使用 virsh net-list 命令并查看 "default" 网络是否是启 用状态。 # virsh net-list Name State Autostart ----------------------------------------- default active yes 如果网络未激活,输入以下命令: # virsh net-start default 使用 virt-manager X11 图形界面 如果你计划创建虚拟机镜像的机器能运行 X11 程序,最简单的方法是使用 virt-manager 图 形界面,可以在 Fedora 系列和 Debian 系列系统上安装 virt-manager 软件包。它的图形界面 内含 VNC 客户端使你能和虚拟机图形界面进行交互。 如果你在无图形的服务器上创建虚拟机镜像,但在你本地机器有 X server启动,你可以用 virt-manager ,通过使用ssh X11 转发访问图形界面。因为 virt-manager 和 libvirt 直接交 虚拟机镜像指南 November 24, 2015 current 21 互,你通常需要 root 权限来访问。如果你能直接以 root 用户(或者有权限和livbirt交互的 用户) ssh 访问服务器,使用以下命令: $ ssh -X root@server virt-manager 如果你的账户没有权限和libirt交互,但是有 sudo 权限,运行: $ ssh -X root@server $ sudo virt-manager 注意 -X 参数传递给 ssh 将启用 ssh X11转发。如果不能工作,尝试用 -Y 参数。 点击 左上方的 "New" 按钮并跟随接下来的向导。 ,你将看到一系列允许你指定虚拟机的详细信息的的对话框。 注意 使用 qcow2 格式镜像你应该勾选 'customize before install',然后跳转到磁盘属 性并且确保明确选择了qcow2格式。这将保证虚拟机磁盘大小正确。 使用 virt-install 且使用本地 VNC 客户端连接 如果你不想使用 virt-manager (例如,你不想安装依赖包到你的服务器,你本地机器没有 X server 或者 X11 转发工作不正常),你可以使用 virt-install 工具通过 Libvirt 启动虚拟 机,然后使用本地 VNC 客户端连接到虚拟机的图形控制台。 由于 VNC 是一个标准协议,因此有多个可用的 VNC 规范的客户端实现,包括 TigerVNC(多 平台),TightVNC (多平台),RealVNC(多平台),Chicken (Mac OS X),Krde (KDE), 以及 Vinagre (GNOME). 以下示例展示了如何使用 qemu-img 命令创建空镜像文件 virt-install 命令使用创建的空镜像 文件启动虚拟机。以 root 用户执行: # qemu-img create -f qcow2 /data/centos-6.4.qcow2 10G # virt-install --virt-type kvm --name centos-6.4 --ram 1024 \ 虚拟机镜像指南 November 24, 2015 current 22 --cdrom=/data/CentOS-6.4-x86_64-netinstall.iso \ --disk path=/data/centos-6.4.qcow2,size=10,format=qcow2 \ --network network=default \ --graphics vnc,listen=0.0.0.0 --noautoconsole \ --os-type=linux --os-variant=rhel6 Starting install... Creating domain... | 0 B 00:00 Domain installation still in progress. You can reconnect to the console to complete the installation process. KVM 虚拟化使用 centos-6.4 名称,1024MB内存启动虚拟机。虚拟机还有一个关联文件/data/ CentOS-6.4-x86_64-netinstall.iso 的虚拟的 CD-ROM,并拥有 10GB 的qcow2格式的硬盘,硬盘 文件位置在 /data/centos-6.4.qcow2。虚拟机配置了网络使用 libvirt 的默认网络。且 VNC 服 务监听所有的网卡,并且 libvirt 不会自动启动 VNC 客户端也不会显示字符界面控制台(-- no-autoconsole)。最后,libvirt 将尝试以RHEL 6.x 发行版来优化虚拟机配置。 运行 virt-install --os-variant list命令查看 --os-variant 允许的选项范围。 使用 virsh vncdisplay vm-name 命令获取 VNC 端口号。 # virsh vncdisplay centos-6.4 :1 在上面的示例中,虚拟机 centos-6.4 使用 VNC 显示器 :1,对应的 TCP 端口是 5901。你应该 使用本地 VNC 客户端连接到远程服务器的 :1 显示器并且完成安装步骤。 示例:CentOS 镜像 这个示例演示如何安装 CentOS 镜像,主要是 CentOS 6.4。由于不同版本的 CentOS 安装过程 稍有差别,因此其他版本安装过程可能和示例中有不一样的地方。 下载 CentOS 安装 ISO 1. 浏览 CentOS 镜像 页面。 2. 单击镜像中靠近右变的一列的其中一个 HTTP 链接。 3. 单击要使用的CentOS版本的文件夹链接。例如, 6.4 / 。 4. 点击isos/ 文件夹的链接。 5. 要下载64位的文件点击 x86_64/ 文件夹链接。 6. 点击你想下载的网络安装ISO镜像文件,例如: CentOS-6.4-x86_64-netinstall.iso 就是一 个好的选择,因为它文件尺寸更小,在安装的时候,其余的包可以通过网络下载。 启动安装程序 通过使用前面的章节介绍的 virt-manager 或者 virt-install 命令都可以启动安装程序,如果 你使用 virt-install 记得连接你的VNC客户端到虚拟机。 虚拟机镜像指南 November 24, 2015 current 23 假设: •你的虚拟机名称是 centos-6.4;在你使用 virsh 命令操作虚拟机状态的时候你需要使用这 个名称。 •你保存下载的网络安装ISO镜像在 /data/isos 目录。 如果你使用 virt-install,命令应该如下所示: # qemu-img create -f qcow2 /tmp/centos-6.4.qcow2 10G # virt-install --virt-type kvm --name centos-6.4 --ram 1024 \ --disk /tmp/centos-6.4.qcow2,format=qcow2 \ --network network=default \ --graphics vnc,listen=0.0.0.0 --noautoconsole \ --os-type=linux --os-variant=rhel6 \ --extra-args="console=tty0 console=ttyS0,115200n8 serial" \ --location=/data/isos/CentOS-6.4-x86_64-netinstall.iso 安装步骤 在最开始的安装启动菜单,选择 Install or upgrade an existing system ,这事默认的。 配置 TCP/IP 默认的 TCP/IP 就OK了,尤其是,确认 IPv4 支持项启用了 DHCP,默认是启用的。 虚拟机镜像指南 November 24, 2015 current 24 将安装程序指向 CentOS 网站。 选择 URL 安装方法。 不同版本的 CentOS ,网络安装程序可能要求用户指定 URL 或者网站地址和 对应的CentOS 其中一个镜像的CentOS目录,如果安装程序要求填入单个 URL ,一个有效的 URL 可能是 http://mirror.umd.edu/centos/6/os/x86_64。 虚拟机镜像指南 November 24, 2015 current 25 注意 考虑使用其他镜像作为 mirror.umd.edu 的替代,国内推荐使用mirrors.163.com . 如果安装程序要求分别指定网站地址和 CentOS 目录,你可以这样输入: •网站地址:mirror.umd.edu •CentOS 目录: centos/6/os/x86_64 访问 CentOS mirror page 获取全部镜像列表,点击 镜像的"HTTP"链接获取镜像网站名。 存储设备 如果提示你使用哪种类型存储设备,选择 Basic Storage Devices。 主机名 安装程序让你输入主机名称,默的认(localhost.localdomain) 也可以,随后你将安装 cloud- init 包,它将在镜像将来启动时设置主机名。 磁盘分区 磁盘分区有好几个选项,默认使用LVM分区,会创建(/boot, /, swap)三个分区,默认设置就 可以正常工作。另外你也可以只建立一个 ext4 分区挂载到 "/",这也可以正常工作。 如果你不太确定,使用默认的分区方案就可以了,因为没有一定说某个方案就比其他方案要 优秀。 虚拟机镜像指南 November 24, 2015 current 26 安装步骤 使用默认设置,完成安装程序设置步骤,最后最简单的事选择 "Basic Server" 软件包组(以 前版本的 CentOS 可能叫做 "Server" ),它将默认安装 SSH 服务。 卸载 CD-ROM 并重启 安装完成后,屏幕出现 Congratulations, your CentOS installation is complete 界面。 使用 virsh 卸载磁盘,libvirt需要挂接一个空磁盘到之前挂接CDROM的地方,设备名应该是 hdc。可以使用 virsh dumpxml vm-image 命令来确认。 # virsh dumpxml centos-6.4 centos-6.4 ...
... 虚拟机镜像指南 November 24, 2015 current 27 以root用户使用virsh命令,执行下面的步骤完成挂载空磁盘并重启。如果你使用virt- manager安装,下面的命令也起相同作用,你也可以使用图形界面卸载磁盘并手工停止然后启 动虚拟机。 # virsh attach-disk --type cdrom --mode readonly centos-6.4 "" hdc # virsh destroy centos-6.4 # virsh start centos-6.4 登陆到新创建的镜像内 安装后的第一次启动,会提示认证工具(我咋没遇到过啊,文档bug吧)。选择Exit。然 后,以root用户登录。 安装 ACPI 服务 为了让虚拟化层能重启和关闭虚拟机,必须在虚拟机内安装并运行 acpid 服务。 在 CentOS虚拟机内运行以下命令安装 ACPI 服务并配置为系统启动时自动启动。 # yum install acpid # chkconfig acpid on 配置获取metadata 虚拟机在启动的时候需要和元数据服务交互以便完成几个任务,例如,虚拟机必须获取ssh 公钥以及运行用户数据脚本。确保虚拟机能完成这些任务,使用以下几个方法之一: •安装从 Ubuntu cloud-init 移植过来的cloud-init RPM包,这也是推荐的方法。 •修改 /etc/rc.local 文件从元数据服务获取信息,具体将在下一届描述。 使用 cloud-init 获取公钥 cloud-init 包自动从元数据服务获取公钥并保存到账户,你可以在 CentOS虚拟机添加 EPEL 安装源来安装 cloud-init 包。 # yum install http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm # yum install cloud-init 不同的发行版保存的账户不同,在基于 Ubuntu 的虚拟机,账户是 ubuntu ,基于 Fedora 的 虚拟机,账户是 ec2-user 。 你可以编辑 /etc/cloud/cloud.cfg 文件添加一行修改 cloud-init 使用的账户名,例如,添加 以下这行到配置文件,来配置 cloud-init 存放公钥到 admin 账户。 user: admin 编写脚本获取公钥(如果未使用cloud-init) 如果你不能在镜像中安装cloud-init软件包,就获取ssh公钥并添加到root帐号中,编辑/ etc/rc.d/rc.local文件,在touch /var/lock/subsys/local之前添加以下内容: if [ ! -d /root/.ssh ]; then mkdir -p /root/.ssh chmod 700 /root/.ssh 虚拟机镜像指南 November 24, 2015 current 28 fi # Fetch public key using HTTP ATTEMPTS=30 FAILED=0 while [ ! -f /root/.ssh/authorized_keys ]; do curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key \ > /tmp/metadata-key 2>/dev/null if [ \$? -eq 0 ]; then cat /tmp/metadata-key >> /root/.ssh/authorized_keys chmod 0600 /root/.ssh/authorized_keys restorecon /root/.ssh/authorized_keys rm -f /tmp/metadata-key echo "Successfully retrieved public key from instance metadata" echo "*****************" echo "AUTHORIZED KEYS" echo "*****************" cat /root/.ssh/authorized_keys echo "*****************" fi done 注意 有些 VNC 客户会使用分号 (;)替换冒号(:) 以及用中划线 (-)替换下划线(_) ,确 认你输入的是 http: 而不是 http; , authorized_keys 而不是 authorized-keys。 注意 前面的脚本仅仅只是从元数据服务获取了 ssh 的公钥,并未获取用户数据,用 户数据是用户申请新虚拟机可以传递到虚拟机内的可选数据,通常用于在虚拟 机启动时做一些定制化工作。 OpenStack 元数据服务兼容 亚马逊 EC2 2009-04-04 版本元数据服务,请参考亚 马逊 EC2 文档 使用虚机元数据获取如何获取用户数据的详细信息。 禁用 zeroconf 路由 要让虚拟机访问元数据服务,必须禁用 zeroconf 路由: # echo "NOZEROCONF=yes" >> /etc/sysconfig/network 配置 console 要使 nova console-log 命令在 CentOS 6.x 生效 ,你需要添加以下文字到 /boot/grub/menu.lst 文件: serial --unit=0 --speed=115200 terminal --timeout=10 console serial # Edit the kernel line to add the console entries kernel ... console=tty0 console=ttyS0,115200n8 关闭虚拟机 在虚拟机内,以root用户运行: 虚拟机镜像指南 November 24, 2015 current 29 # /sbin/shutdown -h now 清理(删除 MAC 地址相关信息) 操作系统会在/etc/sysconfig/network-scripts/ifcfg-eth0 和 /etc/udev/rules.d/70- persistent-net.rules 这类文件记录下网卡MAC地址,但是,虚拟机的网卡MAC地址在每次虚 拟机创建的时候都会不同,因此这些信息必须从配置文件删除掉。 目前有 virt-sysprep 工具可以完成清理虚拟机镜像内的 MAC 地址相关的信息。 # virt-sysprep -d centos-6.4 删除 libvirt 虚拟机域 现在你可以上传虚拟机镜像到镜像服务了,不再需要 libvirt 来管理虚拟机镜像,使用 virsh undefine vm-image 命令完成。 # virsh undefine centos-6.4 镜像准备完成 前面你使用 qemu-img create 命令创建的镜像已经准备好可以上传了,例如,你可以上传 / tmp/centos-6.4.qcow2 文件到镜像服务。 示例:Ubuntu 镜像 这个示例安装Ubuntu 14.04 (Trusty Tahr) 版本镜像。创建其他版本的Ubuntu镜像,注意下 面安装过程的标记不同的地方。 下载一个 Ubuntu 安装 ISO 由于我们的目标是制作一个最小化的可用基础镜像,本示例使用网络安装 ISO。Ubuntu 14.04 64位版本的网络安装 ISO 位于 http://archive.ubuntu.com/ubuntu/dists/trusty/main/ installer-amd64/current/images/netboot/mini.iso。 开始安装 使用在之前示例中讲解的 virt-manager 或者 virt-install 命令。如果你使用virt-install ,记 得使用 VNC 客户端连接到虚拟机。 假设你的虚拟机名称是 trusty ,当你使用 virsh 命令操作虚拟机状态的时候你需要虚拟机 名称。 如果你使用 virt-manager 命令,示例命令如下: # qemu-img create -f qcow2 /tmp/trusty.qcow2 10G # virt-install --virt-type kvm --name trusty --ram 1024 \ --cdrom=/data/isos/trusty-64-mini.iso \ --disk /tmp/trusty.qcow2,format=qcow2 \ --network network=default \ 虚拟机镜像指南 November 24, 2015 current 30 --graphics vnc,listen=0.0.0.0 --noautoconsole \ --os-type=linux --os-variant=ubuntutrusty 安装步骤 在安装初始启动菜单中,选择 Install 。安装过程提示中,默认的即可。 主机名 安装程序要求填入主机名。默认的 (ubuntu) 即可。后面我们将安装 cloud-init 包,cloud- init 包将在将来使用镜像创建新虚拟机启动的时候设置主机名。 选择镜像站点 选择默认的镜像站点即可。 安装步骤 安装过程中,使用默认的选项即可,当提示输入用户名时,使用默认的 (ubuntu) 即可。 磁盘分区 目前有几个分区选项。默认的安装程序使用 LVM 分区,将创建三个分区 (/boot, /, swap), 使用默认的即可。作为可选的,你也可以创建单个 ext4 分区,挂载 "/"。 虚拟机镜像指南 November 24, 2015 current 31 如果你不太确定如何分区,我们推荐你使用安装程序默认的分区方案,因为目前也没有任何 方案完全优于其他分区方案。 自动更新 Ubuntu 安装程序询问你如何设置系统更新。这个选项依赖于你的使用环境,如果将来创建 的虚拟机能链接到因特网,我们推荐 "Install security updates automatically"。 软件选择:OpenSSH 服务 选择 "OpenSSH server" 以便在 OpenStack 中启动虚拟机时你能 SSH 登陆到虚拟机。 安装 GRUB 引导程序 当提示安装 GRUB 引导程序到硬盘主启动记录时,选择 "Yes"。 虚拟机镜像指南 November 24, 2015 current 32 关于配置Grub的详细信息,请参考 “确认镜像输出启动日志到控制台”一节 [12]. 卸载 CD-ROM 并重启 剩下的步骤中,选择默认的值即可。当安装完成时,你会看到提示移除 CD-ROM。 虚拟机镜像指南 November 24, 2015 current 33 注意 在 Ubuntu 14.04中有一个已知bug;当你选择 "Continue", 虚拟机将关机,即使 它显示它将重启。 使用 virsh 弹出光驱时,libvirt 要求你挂一个空磁盘在光驱相同的位置。在之前盘符是 hdc 。你可以使用 virsh dumpxml vm-image 命令来完成。 # virsh dumpxml trusty trusty ...
... 在宿主机上以 root 用户运行以下命令暂停虚拟机,弹出磁盘然后恢复虚拟机。如果你使用 virt-manager ,你需要在图形界面完成这个过程。 # virsh start trusty --paused # virsh attach-disk --type cdrom --mode readonly trusty "" hdc 虚拟机镜像指南 November 24, 2015 current 34 # virsh resume trusty 注意 在前面的示例中,你暂停虚拟机,弹出磁盘,然后恢复虚拟机,理论上,你在 Installation complete 屏幕显示的时候就能弹出磁盘,然后我们测试显示 Ubuntu 安装程序锁定了磁盘,因此,不能弹出磁盘。 登陆到新创建的镜像内 当你安装后首次启动时,虚拟机将会询问你认证工具,你只需要选择 'Exit'。然后使用你设 置的root密码以root用户登录。 安装 cloud-init cloud-init 脚本将在虚拟机启动的时候搜寻元数据服务获取公钥。公钥将会放在镜像默认用 户内。 安装 cloud-init 软件包: # apt-get install cloud-init 在创建 Ubuntu 镜像时,cloud-init 必须明确的配置元数据源。OpenStack 元数据服务仿效 Amazon EC2 元数据服务。 运行 dpkg-reconfigure 命令设置镜像 cloud-init 软件包使用的元数据源。当屏幕出现提示 时,选择 EC2 数据源。 # dpkg-reconfigure cloud-init 不同的发行版保存的账户不同,在基于 Ubuntu 的虚拟机,账户是 ubuntu ,基于 Fedora 的 虚拟机,账户是 ec2-user 。 你可以编辑 /etc/cloud/cloud.cfg 文件添加一行修改 cloud-init 使用的账户名,例如,添加 以下这行到配置文件,来配置 cloud-init 存放公钥到admin账户。 user: admin 关闭虚拟机 在虚拟机内,以root用户运行: # /sbin/shutdown -h now 清理(删除 MAC 地址相关信息) 操作系统会在/etc/sysconfig/network-scripts/ifcfg-eth0 和 /etc/udev/rules.d/70- persistent-net.rules 这类文件记录下网卡MAC地址,但是,虚拟机的网卡MAC地址在每次虚 拟机创建的时候都会不同,因此这些信息必须从配置文件删除掉。 目前有 virt-sysprep 工具可以完成清理虚拟机镜像内的 MAC 地址相关的信息。 # virt-sysprep -d trusty 虚拟机镜像指南 November 24, 2015 current 35 删除 libvirt 虚拟机域 现在你可以上传虚拟机镜像到镜像服务了,所以不再需要 libvirt 来管理虚拟机镜像,使用 virsh undefine vm-image 命令来完成。 # virsh undefine trusty 镜像准备完成 前面你使用 qemu-img create 命令创建的镜像已经准备好可以上传了,你可以上传 /tmp/ trusty.qcow2 文件到 Openstack 镜像服务。 示例:Fedora 镜像 下载一个 Fedora ISO 镜像。这个过程将会创建Fedora 20 镜像。 1. 使用 virt-install 开始安装 ,如下: # qemu-img create -f qcow2 fedora-20.qcow2 8G # virt-install --connect=qemu:///system --network=bridge:virbr0 \ --extra-args="console=tty0 console=ttyS0,115200 serial rd_NO_PLYMOUTH" \ --name=fedora-20 --disk path=/var/lib/libvirt/images/fedora-20.qcow2,format=qcow2,size=10,cache= none \ --ram 2048 --vcpus=2 --check-cpu --accelerate --os-type linux --os-variant fedora19 \ --hvm --location=http://dl.fedoraproject.org/pub/fedora/linux/releases/20/Fedora/x86_64/os/ \ --nographics 这将启动一个虚拟机并且开始安装过程。 Starting install... Retrieving file .treeinfo... | 2.2 kB 00:00:00 !!! Retrieving file vmlinuz... | 9.8 MB 00:00:05 !!! Retrieving file initrd.img... | 66 MB 00:00:37 !!! Allocating 'fedora-20.qcow2' | 10 GB 00:00:00 Creating domain... | 0 B 00:00:00 Connected to domain fedora-20 Escape character is ^] [ 0.000000] Initializing cgroup subsys cpuset [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Initializing cgroup subsys cpuacct ... ... ... [ OK ] Reached target Local File Systems (Pre). Starting installer, one moment... anaconda 20.25.15-1 for Fedora 20 started. ================================================================================ =============================================================================== 2. 安装选项选择 VNC 或者 文本模式。 Text mode provides a limited set of installation options. It does not offer custom partitioning for full control over the disk layout. Would you like to use VNC mode instead? 1) Start VNC 虚拟机镜像指南 November 24, 2015 current 36 2) Use text mode Please make your choice from above ['q' to quit | 'c' to continue | 'r' to refresh]: 3. 设置时区,网络配置,安装源,root用户密码,以及作为可选项,你还可以创建额外的 用户。 4. 设置安装位置: ================================================================================ Probing storage... Installation Destination [x] 1) Virtio Block Device: 10.24 GB (vda) 1 disk selected; 10.24 GB capacity; 10.24 GB free ... Please make your choice from above ['q' to quit | 'c' to continue | 'r' to refresh]: c ================================================================================ ================================================================================ Autopartitioning Options [ ] 1) Replace Existing Linux system(s) [x] 2) Use All Space [ ] 3) Use Free Space Installation requires partitioning of your hard drive. Select what space to use for the install target. Please make your choice from above ['q' to quit | 'c' to continue | 'r' to refresh]: 2 ================================================================================ ================================================================================ Autopartitioning Options [ ] 1) Replace Existing Linux system(s) [x] 2) Use All Space [ ] 3) Use Free Space Installation requires partitioning of your hard drive. Select what space to use for the install target. Please make your choice from above ['q' to quit | 'c' to continue | 'r' to refresh]: c ================================================================================ ================================================================================ Partition Scheme Options [ ] 1) Standard Partition [x] 2) LVM [ ] 3) BTRFS 虚拟机镜像指南 November 24, 2015 current 37 Select a partition scheme configuration. Please make your choice from above ['q' to quit | 'c' to continue | 'r' to refresh]: c Generating updated storage configuration Checking storage configuration... ================================================================================ 5. 以root用户使用virsh命令弹出安装盘并且重启虚拟机。 # virsh attach-disk --type cdrom --mode readonly fedora-20 "" hdc # virsh destroy fedora-20 # virsh start fedora-20 你也可以使用图形界面手工停止和启动虚拟机来完成以上功能。 6. 安装完成重启后以root用户登录。 7. 在虚拟机上安装并且启用 acpid 服务,以便能够重启或者关闭虚拟机。 在 Fedora 虚拟机内运行一下命令安装并启用 ACPI服务。 # yum install acpid # chkconfig acpid on 8. 在 Fedora 虚拟机添加 EPEL 源以便安装 cloud-init 软件包。 cloud-init 自动从元数据服务器获取公钥并保存到账户内。 # yum install http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm # yum install cloud-init 你可以编辑 /etc/cloud/cloud.cfg 文件添加一行修改 cloud-init 使用的账户名,例如, 添加以下这行到配置文件,来配置 cloud-init 存放公钥到admin账户。 user: admin 9. 禁用默认的 zeroconf 路由。 # echo "NOZEROCONF=yes" >> /etc/sysconfig/network 10. 要让 nova console-log 命令在 Fedora 20虚拟机上,你需要编辑 /boot/grub/menu.lst 文 件添加以下几行。 serial --unit=0 --speed=115200 terminal --timeout=10 console serial # Edit the kernel line to add the console entries kernel ... console=tty0 console=ttyS0,115200n8 11. 在虚拟机内以root用户关闭虚拟机。 # /sbin/shutdown -h now 12. 清除和删除 MAC 地址。 操作系统会在/etc/sysconfig/network-scripts/ifcfg-eth0 和 /etc/udev/rules.d/70- persistent-net.rules 这类文件记录下网卡MAC地址,但是,虚拟机的网卡MAC地址在每 次虚拟机创建的时候都会不同,因此这些信息必须从配置文件删除掉。 使用 virt-sysprep 工具,它将通过几个步骤完成清除镜像内相关记录的MAC地址信息, 虚拟机镜像指南 November 24, 2015 current 38 # virt-sysprep -d fedora-20 13. 将虚拟机domain undefine掉,以为你已经完成镜像制作不再需要libvirt进行管理。 # virsh undefine fedora-20 以上步骤你使用 qemu-img 创建的镜像文件已经完备,可以上传到镜像服务了。 示例:微软Windows镜像 这个例子创建一个Windows Server 2012 qcow2镜像,使用virt-install以及KVM虚拟化。 1. 按照这些步骤做安装前准备: a. 下载 Windows Server 2012 安装ISO文件,评估镜像文件可以在 微软网站 (需注 册)。 b. 从Fedora 网站.下载已数字签名的 VirtIO 驱动ISO文件。 c. 创建一个15GB大小的磁盘镜像: $ qemu-img create -f qcow2 ws2012.qcow2 15G 2. 使用virt-install命令开始 Windows Server 2012 的安装: # virt-install --connect qemu:///system \ --name ws2012 --ram 2048 --vcpus 2 \ --network network=default,model=virtio \ --disk path=ws2012.qcow2,format=qcow2,device=disk,bus=virtio \ --cdrom /path/to/en_windows_server_2012_x64_dvd.iso \ --disk path=/path/to/virtio-win-0.1-XX.iso,device=cdrom \ --vnc --os-type windows --os-variant win2k8 使用 virt-manager 或 virt-viewer 命令连接到虚拟机开始 Windows 安装。 3. 启用 VirtIO 驱动 Windows 安装程序默认不识别硬盘,当安装程序要求你选择安装位置时,点击加载驱 动并浏览文件系统选择 E:\WIN8\AMD64 文件夹。Windows 安装程序显示驱动列表,选择 VirtIO SCSI和网络驱动,继续安装。 安装完成,虚拟机重启后,为虚拟机administrator用户设置密码。 4. 以administrator用户登录并开启命令行窗口。 5. 使用以下命令完成VirtIO驱动的安装: C:\pnputil -i -a E:\WIN8\AMD64\*.INF 6. 为了让Cloudbase-Init在系统启动时运行脚本,设置PowerShell执行策略解除限制。 C:\powershell C:\Set-ExecutionPolicy Unrestricted 7. 下载并安装 Cloudbase-Init: C:\Invoke-WebRequest -UseBasicParsing http://www.cloudbase.it/downloads/ CloudbaseInitSetup_Stable_x64.msi -OutFile cloudbaseinit.msi 虚拟机镜像指南 November 24, 2015 current 39 C:\.\cloudbaseinit.msi 在configuration options窗口,修改以下设置: •用户名: Administrator •网卡:Red Hat VirtIO Ethernet Adapter •日志输出串口:COM1 当安装完成后,在Complete the Cloudbase-Init Setup Wizard 窗口,选择Run Sysprep和Shutdown 复选框,然后点击Finish。 等待虚机关闭。 你的镜像已经准备好上传到镜像服务了: $ glance image-create --name WS2012 --disk-format qcow2 \ --container-format bare --is-public true \ --file ws2012.qcow2 示例:FreeBSD 镜像 这个示例创建了一个兼容 OpenStack 以及 bsd-cloudinit的最小化的 FreeBSD 镜像。bsd- cloudinit 是一个独立维护并且正在积极开发中的程序。项目当前的源码信息状态站点是 http://pellaeon.github.io/bsd-cloudinit/。 这个示例中使用 KVM 以及 virtio 驱动做为虚拟化平台,因为这是 Openstack 使用最广泛的 平台之一,如果你使用其他平台做为你的云计算虚拟化,在创建中镜像也使用相同的平台。 这个示例显示了如何创建 FreeBSD 10 镜像,要创建 FreeBSD 9.2 镜像,注意以下步骤中提 示。 创建 FreeBSD 镜像 1. 创建一个虚拟磁盘: $ qemu-img create -f qcow2 freebsd.qcow2 1G FreeBSD 支持的最小磁盘大小是1GB。因为我们的目标是建立一个最小化的基础镜像文 件,所以示例使用的最小磁盘大小,足够容纳可选的文档,游戏以及lib32库。要包含 ports软件,需要添加额外的1GB空间,要包含源码,再添加512M空间。 2. 获取安装ISO文件: $ curl ftp://ftp.freebsd.org/pub/FreeBSD/releases\ /amd64/amd64/ISO-IMAGES/10.1/FreeBSD-10.1-RELEASE-amd64-bootonly.iso >\ FreeBSD-10.1-RELEASE-amd64-bootonly.iso 3. 启动一个虚拟机,使用和你生产环境一样的虚拟化层,虚拟磁盘以及网卡驱动。 下面的命令使用最小内存,即256MB: $ kvm -smp 1 -m 256 -cdrom FreeBSD-10.1-RELEASE-amd64-bootonly.iso \ -drive if=virtio,file=freebsd.qcow2 \ -net nic,model=virtio -net user 虚拟机镜像指南 November 24, 2015 current 40 你可以指定最大1GB内存让安装程序运行更快。 虚拟机必须能访问 Internet 以便下载软件包。 注意 通过使用相同的虚拟化层,可以确保仿照你生产环境相同的虚拟设备,然 而,如果你有硬件虚拟化代替半虚拟化,可以不需要相同的虚拟化层;你 必须使用相同类型的虚拟化硬件因为 FreeBSD 设备名和驱动相关联。如果 创建镜像环境中根块设备或者第一个网卡和你生产环境不一样,那么在生 产环境中使用镜像会产生错误。 现在你的虚拟机从之前你下载的ISO文件启动并且使用了之前准备好的空白虚拟磁盘。 4. 在虚拟机里,完成以下步骤安装操作系统: a. 当出现提示的时候,选择运行ISO 于 Install 模式。 b. 接受默认键盘分布或者根据需要选择适当的键盘映射。 c. 提供主机名。如果你使用 bsd-cloudinit,它将在虚拟机启动时使用OpenStack分配 给他的主机名覆盖这个值。 d. 当提示可选doc, games, lib32, ports, and src 系统组件时,选择你需要的组件,当 你不选可选的系统组件时也可以完成一个完全功能安装,如前提示,最小化系统的 1GB虚拟磁盘支持包含doc, games, and lib32内容。要包含ports 软件组需要至少1GB 额外空间,如果你计划安装更多port软件时还需要更多的空间,src(源代码)组 需要额外512MB空间。 e. 配置首选网卡使用DHCP,在这个示例中,使用 virtio 网卡,在虚拟机中命名为 vtnet0。 f. 接受默认的网络镜像。 g. 设置磁盘分区。 磁盘分区在镜像创建过程中是一个重要的要素,它自动产生默认的分区表会导致 bsd-cloudinit 不起作用。 因为默认的分区会导致bsd-cloudinit不能正常工作,你必须手工分区,分区编辑器 仅列出块设备,如果你使用 virtio 磁盘驱动,它名称是 vtbd0。选择这个设备运行 create 三次: 1. 选择 Create创建分区表,当没有分区表存在时这是默认动作,然后,从列表中 选择 GPT GUID Partition Table ,这也是默认选择。 2. 创建两个分区: •第一个分区:一个64kB freebsd 启动分区,无挂载点。 •第二个分区: freebsd-ufs 分区挂载点是 / 并使用所有剩下的空余空间。 下图显示1GB虚拟磁盘分完区后的分区表: 虚拟机镜像指南 November 24, 2015 current 41 选择 Finish 然后选择 Commit 提交修改。 注意 如果你的分区和示例不一样,挂载到 / 的根分区必须是磁盘上的最后 一个分区,以便在启动新虚拟机实例时能够扩展分区大小。同时注意 bsd-cloudinit 目前将假设根分区是磁盘的第二个分区且已硬编码到程 序中。 5. 设置root用户密码。 6. 选择 CMOS 时区。 虚拟的CMOS始终存储它的时间时区为UTC,除非你知道原因,否则选择UTC. 7. 选择你当前环境的时区。 8. 从启动时需要启动的服务列表中选择 ssh 。以及可选的其他服务。 9. 可选的,添加用户。 你当前不需要添加用户,如果 freebsd 账户不存在, bsd-cloudinit 程序会添加一个 freebsd 用户账户。用户的ssh 秘钥和OpenStack相关联。要定制用户,你可以现在创 建,例如,你可能想定制用户的shell。 10. Final config 这个菜单让你更新之前的设置,检查参数是否正确,然后选择 exit。 11. 在退出后,你可以打开一个shell完成手工配置,选择 Yes 完成一些OpenStack特定的修 改: a. 设置console: 虚拟机镜像指南 November 24, 2015 current 42 # echo 'console="comconsole,vidconsole"' >> /boot/loader.conf 设置console输出到串口控制台,可以由 nova consolelog 查看,以及图形console使 用 VNC 或者 Spice 。 b. 最小启动延时: # echo 'autoboot_delay="1"' >> /boot/loader.conf c. 下载最新的 bsd-cloudinit-installer,在 FreeBSD 10.1 以及 9.2上的下载命令不一 样,因为fetch如何处理 HTTPS URL的方式不一样。 在 FreeBSD 10.1 fetch 命令默认校验SSL对端,因此你需要安装 ca_root_nss 包, 它包含了根证书的认证授权信息以及告诉 fetch 如何找到根证书。 对于 FreeBSD 10.1运行下面的命令: # pkg install ca_root_nss # fetch --ca-cert=/usr/local/share/certs/ca-root-nss.crt \ https://raw.github.com/pellaeon/bsd-cloudinit-installer/master/installer.sh FreeBSD 9.2 fetch 不支持https对端认证,FreeBSD 9.2运行以下命令 # fetch https://raw.github.com/pellaeon/bsd-cloudinit-installer/master/installer.sh d. 运行安装程序: # sh ./installer.sh 输入这个命令下载和安装最新的 bsd-cloudinit 包,并且安装包的依赖包。 e. 安装 sudo 并且配置 freebsd 用户无密码访问: # pkg install sudo # echo 'freebsd ALL=(ALL) NOPASSWD: ALL' > /usr/local/etc/sudoers.d/10-cloudinit 12. 关闭系统: # shutdown -h now 虚拟机镜像指南 November 24, 2015 current 43 第 6 章 支持创建镜像的工具 镜像生成器 .................................................................................................................... 43 Oz .................................................................................................................................. 43 VMBuilder ....................................................................................................................... 45 VeeWee ........................................................................................................................... 45 Packer ........................................................................................................................... 45 imagefactory ................................................................................................................. 45 SUSE Studio ................................................................................................................... 45 有几个工具设计为自动创建镜像。 镜像生成器 镜像生成器 是一个支持不同发行版以及体系架构的自动化磁盘镜像创建工具。镜像生成器 (DIB)能为 Fedora, Red Hat Enterprise Linux, Ubuntu, Debian, CentOS, and openSUSE 生成镜 像,DIB 是被组合一系列的工具之上的创建特殊镜像的基础。 要创建镜像,输入以下命令: # disk-image-create ubuntu vm 这个示例创建了一个通用的,可启动的最新版本 Ubuntu 镜像。 更进一步的镜像定制可以通过设置环境变量或者添加元素到命令行: # disk-image-create -a armhf ubuntu vm 这个示例使用之前创建的镜像,但是针对 ARM 结构,更多的基础元素参见 git 源目录 且文 档参考 镜像生成器基础元素文档。 Oz Oz 是一个自动化创建镜像文件的命令行工具。它是一个和 KVM 进行交互完成整个虚拟机镜 像安装过程的 Python 程序。它使用操作系统支持的一系列预定义的 kickstart (红帽系)文 件或 preseed 文件 (Debian 系),并且他也用于创建微软 Windows 镜像。在 Fedora 上,使用 yum 安装 Oz: # yum install oz 注意 在本文档编写时,没有针对 Ubuntu 的 Oz 安装包,因此你需要从源代码安装或 者编译自己的.deb文件包。 完整的 Oz 示例 已经超出本文档范围,但是我们提供一个示例。你可以在 GitHub rackerjoe/ oz-image-build/templates.查找到额外的 Oz 模板文件。下面演示了使用 Oz 如何创建 CentOS 6.4 镜像。 使用以下内容创建模板文件(我们叫做 centos64.tdl)。你仅仅需要修改 部分的 内容。 虚拟机镜像指南 November 24, 2015 current 44 Oz 模板指定了 Centos 6.4 安装 ISO 的下载位置。 Oz 使用版本信息确认了使用哪一个 kickstart 文件。在这个示例中,是 RHEL6.auto 。它添加 EPEL 软件库,并且安装在 packages 字段指定的 epel-release, cloud-utils, 以及 cloud-init 包。 在 Oz 使用kickstart文件完成系统初始安装后,它通过更新镜像内容来定制镜像文件。定制 的过程它通过 在XML 文件中的 command 字段也删除任何关于eth0设备的信息。 运行: # oz-install -d3 -u centos64.tdl -x centos64-libvirt.xml •-d3 参数指定 Oz 运行时显示状态信息。 •-u 参数指定 Oz 完成安装后运行自定义的安装动作(安装扩展包,运行其他命令等) •-x 参数指定 Oz 输出给libvirt使用的 XML 文件名(否则它默认文件名是诸如 centos64Apr_03_2013-12:39:42这种名称)。 如果你忘记使用 -u 参数,或者你想编辑文件做额外的定制化,你可以使用 oz-customize 命 令,来使用 oz-install 创建的libvirt XML 文件,例如: # oz-customize -d3 centos64.tdl centos64-libvirt.xml Oz 将调用 libvirt 通过 KVM 来启动镜像,然后Oz ssh 到虚拟机内完成定制化工作。 虚拟机镜像指南 November 24, 2015 current 45 VMBuilder VMBuilder (虚拟机生成器) 是一个可为不同 hypervisors 生成虚拟机镜像的命令行工 具。Ubuntu 带的 VMBuilder 版本只能创建 Ubuntu 虚拟机。 Debian 带的 VMBuilder 版本能创 建 Ubuntu 以及 Debian 虚拟机。 Ubuntu Server Guide 编写了如何使用 VMBuilder 创建 Ubuntu 镜像。 VeeWee VeeWee 通常用于创建 Vagrant boxses,但它也可用于创建 KVM 镜像。 Packer Packer 是使用单一源配置生成不同平台虚拟机镜像的工具。 imagefactory imagefactory 是一个设计为自动化创建,转换以及上传镜像到不同云提供商的较新的工 具。他使用 Oz 做为后端,并支持包含基于 OpenStack 的云。 SUSE Studio SUSE Studio 是创建和测试软件程序的基于浏览器的 web 程序。他支持创建物理,虚拟或 者基于云端的应用程序,并且支持使用SUSE Linux Enterprise and openSUSE 发行版为基于 Openstack 的云创建镜像。 虚拟机镜像指南 November 24, 2015 current 46 第 7 章 转换镜像格式 转换一种镜像格式到另一种通常是直接的。 qemu-img 转换:raw, qcow2, qed, vdi, vmdk, vhd qemu-img convert 命令可以转换多种格式的镜像文件,包括qcow2, qed, raw, vdi, vhd, and vmdk.。 表 7.1. qemu-img 格式字符列表 镜像格式 qemu-img 参数 QCOW2 (KVM, Xen) qcow2 QED (KVM) qed raw raw VDI (VirtualBox) vdi VHD (Hyper-V) vpc VMDK (VMware) vmdk 这个示例将转换换一个裸格式镜像文件 centos7.img 到qcow2镜像文件。 $ qemu-img convert -f raw -O qcow2 centos7.img centos7.qcow2 运行以下命令转换 VMDK 镜像文件到裸格式镜像文件, $ qemu-img convert -f vmdk -O raw centos7.vmdk centos7.img 运行以下命令转换 VMDK 镜像文件到qcow2镜像文件, $ qemu-img convert -f vmdk -O qcow2 centos7.vmdk centos7.qcow2 注意 -f format参数是可选的,如果忽略,qemu-img将尝试推断镜像格式。 当转换一个Windows系统的镜像文件时,需确保镜像内系统已安装好virtio驱 动。否则,在你启动虚拟机时会由于缺少virtio驱动遇到蓝屏死机。另外避免这 个问题的方法是按如下命令通过更新glance服务中镜像属性,但是这个方法会明 显的降低磁盘性能。 $ glance image-update --property hw_disk_bus='ide' image_id VBoxManage: VDI (VirtualBox) 转换为 raw 如果你使用 VirtualBox 创建了一个 VDI 镜像,你可以使用VirtualBox附带的 VBoxManage 工 具转换它为raw格式,在 Mac OS X和Linux 上,VirtualBox 默认存放镜像在 ~/VirtualBox VMs/ 目录,以下示例在当前目录中从一个VirtualBox VDI镜像创建一个 raw 镜像。 $ VBoxManage clonehd ~/VirtualBox\ VMs/fedora21.vdi fedora21.img --format raw 虚拟机镜像指南 November 24, 2015 current 47 附录 A. 社区支持 目录 文档 .............................................................................................................................. 47 问答论坛 ....................................................................................................................... 48 OpenStack 邮件列表 ....................................................................................................... 48 OpenStack 维基百科 ....................................................................................................... 48 Launchpad的Bug区 .......................................................................................................... 48 The OpenStack 在线聊天室频道 ...................................................................................... 50 文档反馈 ....................................................................................................................... 50 OpenStack分发包 ........................................................................................................... 50 以下可用的资源是帮助用户运行和使用OpenStack。OpenStack社区会经常性的改进和增加 OpenStack的主要特性,如果用户有问题,请不要在提问题方面犹豫。使用下面列出的资 源,以获得OpenStack社区的支持,也能得到一些安装/使用时一些解决问题的思路和方法。 文档 For the available OpenStack documentation, see docs.openstack.org. To provide feedback on documentation, join and use the mailing list at OpenStack Documentation Mailing List, or report a bug. 以下书籍解释了如何安装一个基于OpenStack云及其相关的组件 •Installation Guide for openSUSE 13.2 and SUSE Linux Enterprise Server 12 •Installation Guide for Red Hat Enterprise Linux 7 and CentOS 7 •Installation Guide for Ubuntu 14.04 (LTS) 以下书籍解释了如何配置和运行一个基于OpenStack的云: •架构设计指南 •云计算平台管理员手册 •配置参考手册 •实战指南 •Networking Guide •高可用指南 •安全指南 •虚拟机镜像指南 虚拟机镜像指南 November 24, 2015 current 48 以下书籍解释了如何使用OpenStack图形界面和命令行客户端: •API Guide •用户指南 •管理员手册 •命令行参考 下面文档提供了OpenStack 应用程序接口的参考和向导: •OpenStack应用程序接口完全参考(HTML) •OpenStack应用程序接口完全参考(PDF) 问答论坛 During the set up or testing of OpenStack, you might have questions about how a specific task is completed or be in a situation where a feature does not work correctly. Use the ask.openstack.org site to ask questions and get answers. When you visit the https:// ask.openstack.org site, scan the recently asked questions to see whether your question has already been answered. If not, ask a new question. Be sure to give a clear, concise summary in the title and provide as much detail as possible in the description. Paste in your command output or stack traces, links to screen shots, and any other information which might be useful. OpenStack 邮件列表 A great way to get answers and insights is to post your question or problematic scenario to the OpenStack mailing list. You can learn from and help others who might have similar issues. To subscribe or view the archives, go to http://lists.openstack.org/cgi-bin/ mailman/listinfo/openstack. You might be interested in the other mailing lists for specific projects or development, which you can find on the wiki. A description of all mailing lists is available at https://wiki.openstack.org/wiki/MailingLists. OpenStack 维基百科 The OpenStack wiki contains a broad range of topics but some of the information can be difficult to find or is a few pages deep. Fortunately, the wiki search feature enables you to search by title or content. If you search for specific information, such as about networking or OpenStack Compute, you can find a large amount of relevant material. More is being added all the time, so be sure to check back often. You can find the search box in the upper-right corner of any OpenStack wiki page. Launchpad的Bug区 The OpenStack community values your set up and testing efforts and wants your feedback. To log a bug, you must sign up for a Launchpad account at https://launchpad.net/+login. You can view existing bugs and report bugs in the Launchpad Bugs area. Use the search 虚拟机镜像指南 November 24, 2015 current 49 feature to determine whether the bug has already been reported or already been fixed. If it still seems like your bug is unreported, fill out a bug report. 一些小贴士: •提供清晰、简洁的语法。 •尽可能提供详细的细节描述。将命令行的输出或者trace输出粘贴出来,如果是截图请贴 链接,以及其他任何有用的信息。 •Be sure to include the software and package versions that you are using, especially if you are using a development branch, such as, "Liberty release" vs git commit bc79c3ecc55929bac585d04a03475b72e06a3208. •任何特别的部署信息都是有用的。例如用户使用的是Ubuntu 14.04,或者多节点安装。 以下列出Launchpad Bug区: •Bugs: OpenStack 块存储 (cinder) •Bugs: OpenStack 计算 (nova) •Bugs: OpenStack 仪表盘 (horizon) •Bugs: OpenStack 认证 (keystone) •Bugs: OpenStack Image service (glance) •Bugs: OpenStack 网络 (neutron) •Bugs: OpenStack 对象存储 (swift) •Bugs: Application catalog (murano) •Bugs: 裸金属服务 (ironic) •Bugs: Containers service (magnum) •Bugs: 数据处理服务 (sahara) •Bugs: Database service (trove) •Bugs: Deployment service (tuskar) •Bugs: Key Manager service (barbican) •Bugs: 编排 (heat) •Bugs: Shared file systems (manila) •Bugs: 计量 (ceilometer) •Bugs: Telemetry v3 (gnocchi) •Bugs: Workflow service (mistral) 虚拟机镜像指南 November 24, 2015 current 50 •Bugs: 消息服务 (zaqar) •Bugs: OpenStack 应用程序接口文档 (developer.openstack.org) •Bugs: OpenStack 文档 (docs.openstack.org) The OpenStack 在线聊天室频道 The OpenStack community lives in the #openstack IRC channel on the Freenode network. You can hang out, ask questions, or get immediate feedback for urgent and pressing issues. To install an IRC client or use a browser-based client, go to https://webchat.freenode.net/. You can also use Colloquy (Mac OS X, http://colloquy.info/), mIRC (Windows, http:// www.mirc.com/), or XChat (Linux). When you are in the IRC channel and want to share code or command output, the generally accepted method is to use a Paste Bin. The OpenStack project has one at http://paste.openstack.org. Just paste your longer amounts of text or logs in the web form and you get a URL that you can paste into the channel. The OpenStack IRC channel is #openstack on irc.freenode.net. You can find a list of all OpenStack IRC channels at https://wiki.openstack.org/wiki/IRC. 文档反馈 To provide feedback on documentation, join and use the mailing list at OpenStack Documentation Mailing List, or report a bug. OpenStack分发包 以下是Linux发行版针对OpenStack的社区支持: •Debian: https://wiki.debian.org/OpenStack •CentOS, Fedora, 以及 Red Hat Enterprise Linux: https://www.rdoproject.org/ •openSUSE 和 SUSE Linux Enterprise Server: https://en.opensuse.org/Portal:OpenStack •Ubuntu: ubuntu官方服务器团队之OpenStack云
还剩55页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 3 人已下载

下载pdf

pdf贡献者

guojinhai

贡献于2016-06-29

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf