LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

定制化的镜像,关键就是掌握好如何制作定制镜像

2022年12月31日 216点热度

虚拟机镜像(以下简称镜像)是Openstack云计算平台不可或缺的一部分。利用各种定制化的镜像linux服务器搭建,我们可以快速创建出满足不同目的的虚拟机。例如,利用一个安装并配置了Apache、Mysql和PHP的Linux操作系统镜像,就可以在Openstack平台上秒级创建出多台LAMP服务器,可以直接用于部署或者开发。

要充分利用好镜像的优势,关键就是掌握好如何制作定制化的镜像,这往往也伴随着如何测试和管理这些镜像。本文主要介绍:1. 制作满足Openstack要求的镜像的流程;2. 利用devstack对制作好的镜像进行测试。

本文出现的命令和配置都是实际测试可行的,可以直接复制使用;但本文更多是介绍各个操作配置的原理和目的,这样即使在不同的运行环境,我们仍可以把握关键细节,完成镜像的制作和测试。

主要内容:

原理和流程简介

虚拟机镜像实际就是一个包含整个虚拟磁盘内容的文件,这个虚拟磁盘也就是虚拟机的系统盘,包含可以引导启动的操作系统。所谓定制化的镜像,就是在这个(虚拟)系统盘上安装好需要的软件,保存好需要的配置,最后清理掉不必要的临时文件和日志等数据。最简单直观的定制方式,就是用一个干净的镜像作为系统盘创建一台虚拟机,安装好需要的操作系统,然后就可以像平时的操作那样安装需要的软件,保存配置,再利用工具清理不需要的数据,最后关闭虚拟机,镜像就定制化完成了。当然,我们也可以使用已经制作好的镜像直接创建虚拟机,这样可以省略操作系统和一些软件的安装步骤。

所谓Openstack虚拟机镜像,就是满足一些要求(安装特定的软件,配置特定的服务等)的镜像,从而配合完成Openstack计算平台的镜像相关功能。

测试镜像也很简单,就是把制作好的镜像导入Openstack平台,使用它来创建虚拟机,测试各个功能是否正常运作。搭建一个Openstack平台用于测试的方式很多种,本文选择了devstack,因为devstack的安装步骤很简单,而且很轻量,可以直接安装在一台虚拟机中。

准备工作

本文的例子所在运行环境的操作系统为Centos 7,并利用基于libvirt的一系列工具来创建和管理虚拟机,针对的虚拟化技术(hypervisor)为QEMU/KVM。

libvirt和kvm分别是Openstack上面最常用的工具和虚拟化平台。

1.安装好虚拟化工具

yum install qemu libvirt-client virt-manager virt-viewerguestfish libguestfs-tools virt-top

2.创建虚拟子网

目的:因为虚拟机在安装软件过程中需要连通互联网,最简单的办法就是利用libvirt创建一个虚拟子网,虚拟机通过dhcp分配虚拟子网的ip,通过NAT的方式访问外网。

linux apache配置虚拟主机_linux配置虚拟独立主机_apache linux 配置

2.1 准备虚拟网络资源的xml文件default.xml:

default

2.2 配置:

# virsh net-define /usr/share/libvirt/networks/default.xml Networkdefault defined from /usr/share/libvirt/networks/default.xml # virsh net-autostart defaultNetworkdefault marked as autostarted # virshnet-start defaultNetworkdefault started

2.3 修改系统配置/etc/sysctl.conf:

net.ipv4.ip_forward = 1

环境准备好了,可以开始制作镜像了。

制作镜像

制作Linux镜像

Linux镜像需要满足:

1.配置SSH server开机运行。

2.禁用防火墙。

3.开机时支持磁盘分区和改变大小。

4.支持ssh公钥访问虚拟机。

5.运行和使用user data和metadata(如修改root密码,执行用户脚本等)。

6.操作系统内核支持Virtio。

7.没有写死的MAC地址信息。

其中1、2很容易操作,本文使用的Centos 7安装盘默认安装后就满足了。3、4、5三条,只需要安装一个cloud-init的服务就可以了。

cloud-init是一系列python脚本和工具,负责云实例最开始的初始化工作。具体运行原理参考附录:cloud-init工作原理。

第6条,Virtio是提高KVM类型的虚拟机I/O(存储和网络)性能的一种技术。目前常用的Linux发行版本内核都直接支持了,如果你的安装版本有特殊需求,可以查看这里。

关于Virtio的细节,可以参考附录:虚拟机性能优化.

第7条,使用工具virt-sysprep清理。

下面以Centos 7.1的安装为例,其他发行版本可以参考Openstack的文档:

1.准备好ISO安装文件,下载。

2.创建一个磁盘:qemu-img create -fqcow2 image.qcow2 20G

因为针对的是KVM,因此本文使用的镜像格式是qcow2(QEMU copy-on-writeversion 2),关于镜像格式更多细节,可查看附录:镜像格式。镜像大小没有特殊要求,根据需求即可。镜像完成后是可以通过qemu-img增大的,但是一般很难缩小。

3.创建并启动虚拟机:

使用virt-install命令进行创建,通过vnc图形界面安装(本地需要安装一个vnc客户端来访问vnc界面):

virt-install –virt-type kvm –cpucpu64-rhel6 –ram 2048

–name image_name

–disk path=image.qcow2,format=qcow2,device=disk,bus=virtio

–network network=default,model=virtio

–graphics vnc,listen=0.0.0.0,password=Yourpassw0rd –noautoconsole

–os-type=linux

–extra-args=”console=ttyS0,115200n8 console=tty0”

–location=/path/to/installer.iso

或者通过虚拟console(命令行)界面安装,执行virsh consoleimage_name进入console界面,ctrl+]退出:

virt-install –virt-type kvm –cpucpu64-rhel6 –ram 2048

–name image_name

–disk path=image.qcow2,format=qcow2,device=disk,bus=virtio

–network network=default,model=virtio

–os-type=linux

–nographics

–extra-args=”console=tty0 console=ttyS0,115200n8 serial”

–location=/path/to/installer.iso

这些命令参数的含义多数都比较直观,其中:

–cpu cpu64-rhel6:虚拟机的cpu特性集合,因为不同物理机的cpu特性都不同,为了保证虚拟机在不同物理机之间迁移时的cpu兼容性,Openstack平台往往会指定一个虚拟的cpu特性集合(物理机cpu特性的子集),用于所有的虚拟机。其他集合可以通过cat/usr/share/libvirt/cpu_map.xml查看。这里的cpu64-rhel6只是个示例,根据实际情况指定即可。

–graphicsvnc,listen=0.0.0.0,password=Yourpassw0rd:通过vnc的方式提供安装界面,通过virsh vncdisplayimage_name来查看vnc监听端口(vnc端口通常从tcp端口5900开始)。然后就可以使用vnc客户端进行操作。例如noVNC。

–location=/path/to/installer.iso和–extra-args=”console=tty0console=ttyS0,115200n8 serial”:指定ISO安装文件路径,在内核启动阶段,应用指定的参数。

4.按照步骤要求安装操作系统(比如设置root密码,设置时区,网络和分区等)。

5.如果虚拟机dhcp没有正确配置,需要配置一下。centos7的话,需要编辑/etc/sysconfig/network-scripts/ifcfg-ens3(根据网卡接口名字不同),修改ONBOOT=yes,然后执行service networkrestart。

6.弹出虚拟cd,关机并重启

virsh attach-disk --type cdrom --mode readonly image_name "" hdb virsh destroy image_name virshstart image_name

7.重新登录(virsh consoleimage_name或者ssh或者vnc),然后就可以安装基本的服务和修改配置:

# 安装ACPI yum install acpid chkconfig acpid on # 安装NetworkManager,用于网卡的自动发现及管理 yum install NetworkManager chkconfig NetworkManager on # 安装cloud-init yum install cloud-init # 禁用默认的zeroconf route echo "NOZEROCONF=yes" >> /etc/sysconfig/network

8.关机shutdown -h now。

9.关机后回到宿主机,执行virt-sysprep -dimage_name,擦除虚拟机镜像中的无用数据(MAC地址等)。

10.取消虚拟机:virsh undefineimage_name。

11.这个镜像(image.qcow2)就可以用了。

因为我们通常对同一个Linux版本制作多种镜像,没必要每次都从头开始。我们可以跳过1 - 7步骤,基于一个已经制作好了的镜像创建虚拟机,登录后进行具体的定制化行为,然后再完成8 - 10:

virt-install--virt-typekvm--cpucpu64-rhel6--ram2048--nameimage_name--diskpath=image.qcow2,format=qcow2,device=disk,bus=virtio --networknetwork=default,model=virtio --graphicsvnc,listen=0.0.0.0,password=Yourpassw0rd --noautoconsole--os-type=linux--import

制作Windows镜像

Windows镜像的制作和Linux会有所不同:

Windows平台上是通过一个和cloud-init类似的服务,cloudbase-init,来帮助虚拟机初始化的。Windows平台要额外安装virtio-win驱动,才能使用Virtio来提高I/O性能。下面以Windows 2008为例:

1.准备好Windoes 2008的ISO安装盘。

2.准备好Virtio驱动的ISO安装盘,下载地址

3.创建一个磁盘镜像:

qemu-img create -f qcow2 ws2008.qcow2 20G

4.创建并启动虚拟机:

virt-install –connect qemu:///system

–name image_name –ram 2048 –vcpus 2

–network network=default,model=virtio

–disk path=image.qcow2,format=qcow2,device=disk,bus=virtio

–cdrom /path/to/win2008_installer.iso

–disk path=/path/to/virtio-win-0.1.102.iso,device=cdrom

–graphics vnc,listen=0.0.0.0,password=Yourpassw0rd

–os-type windows –os-variant win2k8

5.通过vnc进入安装界面,开始安装过程。

6.安装Virtio驱动。

当安装程序进入选择系统盘的步骤时,会找不到可用磁盘,这是理所当然的(因为相关驱动还没安装)。此时选择“加载启动”(Load drivers),找到virtio-win的目录,选择合适的驱动,安装即可(因为例子中安装的是Windows2008 64bit,因此选择的是amd64下的Win2008)。要安装两种驱动:VirtIO SCSI和network。安装完成后就可以看到可用磁盘了。

7.选择系统盘,继续安装步骤。

8.以Administrator身份进入桌面,打开cmd,完成Virtio的安装:

C:pnputil -i -a E:PATHTO*.INF

9.安装Cloudbase-init,打开Powershell(如果默认没有安装,先安装),并运行:

C:powershell

C:Set-ExecutionPolicy Unrestricted

用IE打开,下载并安装。

这个过程中可能需要:1. 关闭IE安全增强设置;2. 下载的msi文件需要右键点击属性,Unblock。

安装过程中,需要指定以下几项:

- Username: Administrator- Network adapter to configure: Red HatVirtIO Ethernet Adapter - Serial port forlogging: COM1

安装向导的最后,勾选Run Sysprep和Shutdown,最后点击完成,系统自动关机。

10.关机完成后镜像已经可用了,不过Cloudbase-init还多是默认配置,可以重新开机virshstart image_name,根据实际需求修改配置,具体参考文档。

本文例子做了如下修改:打开配置文件C:ProgramFilesCloudbase SolustionsCloudbase-Initconfcloudbase-init.conf,修改如下几项,配置ConfigDrive的方式:

mtu_use_dhcp_config=false ntp_use_dhcp_config=false metadata_services=cloudbaseinit.metadata.services.configdrive.ConfigDriveService

11.正常关机,virsh undefineimage_name,镜像就制作完成了。

12.同样的,如果要针对同一个Windows版本安装不同软件,可以使用已有的镜像进行安装。

测试镜像

如果仅仅使用devstack用于测试镜像,可以将devstack安装在一台虚拟机上,不用时直接关闭,这里的优化可以参考附录:虚拟机性能优化。

搭建devstack的步骤(如果是安装在虚拟机上同样适用):

1.创建stack账号,添加sudo权限,并登录stack:

adduser stack

echo “stack ALL=(ALL) NOPASSWD: ALL” >> /etc/sudoers

su - stack

2.安装git:sudo yum install -y git

3.下载devstack源码:git clone并cd devstack

4.选定指定的Openstack版本,如:git checkoutstable/juno

5.配置文件~/devstack/local.conf:

[[local|localrc]] FLOATING_RANGE=192.168.122.224/27 FIXED_RANGE=10.11.12.0/24 FIXED_NETWORK_SIZE=256 FLAT_INTERFACE=ens3 ADMIN_PASSWORD=123 DATABASE_PASSWORD=123 RABBIT_PASSWORD=123 SERVICE_PASSWORD=123 SERVICE_TOKEN=123 LIBVIRT_TYPE=kvmLOGFILE=$DEST/logs/stack.sh.log # nova相关配置[[post-config|$NOVA_CONF]] [libvirt] inject_password=trueinject_partition=-1 cpu_mode=customcpu_model=cpu64-rhel6

6.安装并启动devstack:./stack:

第一次执行时会安装许多库和下载代码

7.启动完后,为了让Dashboard中创建虚拟机页面支持设置admin密码,需要修改/opt/stack/horizon/openstack_dashboard/local/local_settings.py:

OPENSTACK_HYPERVISOR_FEATURES = { 'can_set_mount_point': False, 'can_set_password': True, }

8.如果有防火墙,打开80和6080端口:

firewall-cmd --add-port=80/tcp firewall-cmd --add-port=6080/tcp firewall-cmd --reload

devstack的使用方式:

1.确保是以stack用户登录。

2.进入devstack目录,执行source openrcadmin admin,即使用admin身份(密码在配置文件中指定了)操作openstack。

3.然后就可以使用命令行工具了。

也可以通过Dashboard(80端口)和VNC(6080)以web界面来操作openstack。如果安装在虚拟机linux apache配置虚拟主机,且虚拟机运行在虚拟子网上,可以通过iptables等工具将虚拟机80和6080端口NAT映射到外网,进而访问。

具体测试流程:

1.在devstack机器上,su - stack&& cd devstack && source openrc admin admin

2.导入镜像到glance:

glance image-create --nameimage_name --disk-format=qcow2 --container-format=bare --is-public=True --file /path/to/image.qcow2

3.浏览器打开devstack的80端口,通过horizon界面用刚才导入的镜像创建虚拟机。

4.测试确保几点:

总结

制作虚拟机镜像的方式有很多种,本文介绍了一种直观的方式:通过创建虚拟机,用平时使用操作系统的方式来定制化需求。另外还值得一提的一个工具,Diskimage-builderlinux apache配置虚拟主机,可以用于自动化地创建镜像,使得定制化和测试镜像都变得更容易,但是相比本文介绍的方式也有一些不足:一是有一定的学习成本,二是目前只支持部分常用的Linux发行版本。

测试镜像的方式同样也很多,本文是通过devstack搭建一个最简的Openstack平台环境,把镜像直接导入平台,测试各个操作是否成功,日志是否无异常。

附录

问题和解决

制作Windows镜像时,报错无法从CD boot。

这是由于virt-install误把Virtio的ISO文件当做安装盘,解决办法:使用floppy盘的方式安装Virtio驱动:

1.下载vfd格式的Virtio驱动安装文件。

2.将–diskpath=/path/to/virtio-win-0.1.102.iso,device=cdrom替换为–diskpath=/path/to/virtio-win-0.1.102_amd64.vfd,device=floppy

cloud-init工作原理

cloud-init是一系列python脚本和工具,负责云实例最开始的初始化工作(修改主机名、注入ssh-key文件、设置root密码等)。cloud-init是一个通用方案,还适用于Openstack外的多种云平台。

cloud-init安装在虚拟机中,在第一次启动时,会根据本地配置去获取Datasources。Datasources包含了cloud-init初始化虚拟机时所需的配置数据:来自用户的userdata和来自平台的metadata。通常userdata包含yaml文件、运行脚本等多种格式的文件,而metadata包含了主机名、实例id、显示名等云平台相关的细节。

云平台提供Datasource的方式很多,Openstack默认的方式是通过http server提供Datasource:虚拟机访问默认的,Openstack会对这个地址重定向,最终指向自己的metadataserver。

镜像格式

虚拟机镜像格式最简单的是raw格式,可以认为是一个位等价的块设备文件(对/dev/sda使用dd命令进行复制)。此外还有很多格式,各自有不同的特点,如:ISO(主要用于CD或DVD)、VDI(VirtualBox使用)、VHD/VHDX(微软Hyper-V使用)、VMDK(VMware使用)。

QCOW2(QEMU copy-on-write version 2)则常用于KVM虚拟机,相比raw格式,qcow2格式的文件体积更小,更利于保存和上传。qcow2格式还支持快照(snapshot)功能(raw不支持)linux视频,因此需要时,Openstack会自动将raw格式的镜像转换成qcow2格式。

虚拟机性能优化

关于虚拟化,先梳理几个概念:

这些硬件虚拟化特性需要在BIOS中打开。

sudo rmmod kvm-intel sudo sh -c "echo 'options kvm-intelnested=y' >> /etc/modprobe.d/dist.conf"sudo modprobe kvm-intel

•确保正确打开:

cat /sys/module/kvm_intel/parameters/nested Y modinfo kvm_intel | grep nested parm: nested:bool

相关命令指定virtio模式即可。

作者简介蔡凯捷,现就职于绿星云科技,高级工程师,负责Openstack相关领域的研发工作。爱好云计算、开源项目、Web相关话题。曾任腾讯基础架构部门研发工程师,拥有互联网分布式系统多年研发经验。本文为绿星云科技独家供稿,已得到官方的独家授权发布。

责任编辑魏伟,关注OpenStack。欢迎技术文章投稿,投稿邮箱

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: devstack kvm创建虚拟机 openstack 虚拟机 镜像
最后更新:2022年12月31日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
Linux系统用户系统上的三种类型的帐户的介绍 Linux下的开机启动设置方法是什么?脚本或服务 谷歌更新Linux内核构建的公共内核库:添加对kokoro作业的支持 linux下mysql中可以使用REVOKE语句来删除某个用户的权限 内核的角度来看,调用hotplug和通常的hotplug环境 Linux系统在开机的时候自动加载某些脚本或系统服务 如何在Linux上安装Diablo3操作系统Diablo3 RedHatLinux软件安装包软件后缀为.rpm最初 1.1.4Linux的内核版本和发行版本是什么意思?(图) Linux系统的安装-Ubuntu开启虚拟机安装过程默认注意事项 hello_exit函数代码存放在__init段中(一) 英伟达将LinuxGPU内核模块作为开放源码/MIT双重许可证(图) virtualboxlinux官方版免费、小巧,同时支持Windows、Linux和Mac系统主机 Linux平台下的嵌入式软件要具备说明技能吗? 图解linuxlinux内核结构框图对内核框图有个总体的把握 linux虚拟机的安装步骤是什么?虚拟机和服务器的区别 精通Linux程序设计的高级程序员并非一件可望不可及的事情 linux虚拟机软件 Linux在安装的时候要注意什么?Linux安装注意事项 Python都有哪些应用,学习完成Python后能的工作方向 微软考虑用Rust开发内核的Linux内核-Hartman
Linux5.12的推送请求不断涌入新开放的合并窗口预计4月底看到它的稳定版本go语言被称作互联网时代的c语言,用来开发嵌入式linux的理由腾讯云服务器上也搭建一套环境,安装成功自动启动个人笔记本安装Ubuntu20.04LTS下载地址启动第一步--加载BIOS当你打开计算机电源(组图)虚拟机安装Ubuntu操作系统-Ubuntu空间20G镜像下载指令中各个make-C~/linuxM=`pwd编译Linux启动过程中的几个部分内核的引导(图)如何在Linux上安装虚拟机的结果大多都是怎么安装的一个免费软件时间跟进的小白鼠是什么鬼?专题计算机是如何启动的?、内核操作系统的启动流程学习Linux最简单、最实用的环境就是虚拟机环境(上)基于命令修改文件的权限命令-ld1.Linux磁盘分区和目录Linux发行版本之间的差别很少?国内性价比很高的Linux虚拟主机系统安装的流程是什么?Linux下修改文件权限的权限与所有权的实现就显得很有必要linux到底难不难学呢?推荐可以查看Linux命令大全Linux中修改文件权限的命令、创建者所在组、所有人Linux的内核放在了哪里?/boot的启动目录一览阿里云>社区>主题地图S>查看存储推荐
《Linux基础知识》命令文件操作相关命令操作命令 统信UOS为啥火?国产操作系统又该如何发展?(组图) 基于命令修改文件的权限命令-ld Linux一模一样远程连接编辑的操作图是什么? Linux2.6.32内核的64为操作系统的命令-苏州安嘉 Linux中如何查看分区的文件系统类型的方法-乐题库 11种笔测试工具检测漏洞并准确模拟网络攻击ProPro linux基础命令注意:Linux命令区分大小写,小心输入内容 linux查询端口的方法及使用检查端口查询方法 Linux系统服务器的搭建方法-上海怡健医学 Linux账号密码过期导致无法登录CentOS7模式重置root用户密码 Linux启动过程中的几个部分内核的引导(图) 《构建高性能web站点》推荐理由及方法都能找到 如何在Linux相关系统上运行Python程序1.脚本执行(图) 如何用命令修改Linuxrename命令的用法?命令用法 学习Linux的8个简单教程,开始你的Linux之旅 你没有装系统,你装了系统就可以用了 我准备开始吓人了!C++Linux服务器后台开发学习篇 嵌入式linux系统开发培训-C编程以及C++Linux应用开发 Linux下强大的shell,模式下配置
标签聚合
shell 虚拟机 sudo 软件 命令模式 linux服务器 linux系统 unix 电脑 文件目录
书籍
课程
技术群
技术干货大合集↓
  • 2023年2月 / 12篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.