Jan 162014
 

 

以前一直都没怎么关注过镜像的制作,使用Ubuntu官方提供的image来测试,发现还是挺方便。不过最近要到自己做CentOS镜像的时候,发现里面学问还是很多,这里就整理一下。

对于云和虚拟化来说,镜像的重要性应该是不言而喻。镜像制作,会影响到你后期的使用的很多功能。什么是Openstack镜像,和我们日常的KVM的镜像有什么区别呢?

Cloud-init

这是Canonical搞的一个开源项目,https://launchpad.net/cloud-init/

Cloud-init,他是在虚拟机启动的时候,对虚拟机进行操作,他的功能应该是很强,目前我知道和测试的功能是

  • 秘钥注入
  • hostname设置

http://www.scalehorizontally.com/2013/02/24/introduction-to-cloud-init/  这篇文章,应该目前外面介绍cloud init最详细的文章,

cloud init 支持3种的运行:

  1. 仅仅运行1次
  2. 总是运行,也就是启动的时候总是运行
  3. 根据instance id来运行,这主要是针对快照

目前在CentOS下,EPEL的源上的cloud-init的版本是0.6.3,功能很有限,我装了cloud-init后,hostname设置了,不过重启后,hostname就没了。你必须升级到0.7.1的版本

cloud-init 0.71 http://repohost.raindrops.centos.org/cloud-init/6/x86_64/

这样你的虚拟机的hostname才正常。邮件列表里有人提到,0.7.2的以上的版本,功能更加强大。这个就需要等待Redhat和CentOS升级。 http://repos.fedorapeople.org/repos/openstack/cloud-init/epel-6/

cloud-utils

这个也是Canonical开源的项目https://launchpad.net/cloud-utils

以前虚拟机的磁盘大小,是由镜像来决定的,如果你希望不同的磁盘大小,那么你就需要做多个镜像,这是一个很恐怖的事情。一个os,多种分区的方案,你就需要多个镜像。

国外的IaaS厂商其实很早就实现了一个功能,可以根据Flavor来调整硬盘大小,不过底层如何实现,一直都不是太明白。有了Openstack以后,大家就明白了很多。通过这个Cloud-utils工具,可以实现硬盘的扩大。

不过这个工具只是能扩大硬盘,是不允许缩小,外面也没有任何的厂商提供硬盘缩小的功能。硬盘的缩小,估计需要考虑的问题更多。

目前这个工具,已经在EPEL上有,并且是最新的版本。有了这个工具,你才有可能调整硬盘。

linux-rootfs-resize

在虚拟机镜像里的分区,其实和物理机器是有很多的区别和不同。例如你做镜像的时候,不需要swap分区,也不建议你使用lvm分区。

所谓扩大分区,他其实就是扩大根分区。

有朋友专门写了一个工具,调用cloud-utils,在虚拟机启动的时候,如果检测到磁盘扩大后,会自动扩大根分区。我在CentOS6.4的镜像进行测试,对于普通分区是没问题的。目前对于LVM分区还是无法生效。

目前这个工具 https://github.com/flegmatik/linux-rootfs-resize 还没有rpm包,你只能用git到本地来安装。

 

镜像精简

目前Ubuntu官方提供的image,是200多兆。目前我使用kitstart安装完,是1.3G,采用的是Qcow2的格式。CentOS官方提供的Openstack的镜像,也是800多兆。http://dev.centos.org/centos/hvm/ (目前官方的image的cloud init已经是0.7.1,不过还不支持磁盘扩大)

对于CentOS来说,有一个比较有意思的现象,你手工安装,采用最小化安装,那么需要安装的包的数量大概是:243个包。如果你采用自动化安装,用kitstart脚本进行安装,那么需要安装417个包。

http://www.opendevs.org/kwwqi/kickstart-deploys-more-packages.html

经过深入学习,这个问题已经算解决,是ks配置的原因,装完以后的镜像是800多M,是因为没有进行qcow2的压缩,目前CentOS的镜像,已经可以做到300M左右。

Ubuntu的镜像可以做到200多M,是因为他们把一些不需要的包也去掉,所谓蓝牙设备支持,无线设备支持,都去掉,看来Redhat和CentOS要多做点东西才行。把镜像做小点,可以节省很多带宽资源和让虚拟机创建更快。

自动化创建镜像

其实镜像制作的过程,比较繁琐,最好能实现自动化,这样对镜像的修改也容易很多,节省很多时间。对于CentOS,我看到的最好的方案,应该就是利用Oz,基本是可以满足需求。剩下的就是你如何写脚本来完成工作。

我已经通过Oz完成了cloud-init的安装,分区的扩大,都是没问题。剩下的就是优化细节。

http://www.chenshake.com/oz-making-centos-mirror/  详细操作,可以参考

 

CentOS镜像的资源

CentOS官方镜像 http://dev.centos.org/centos/  (目前还不支持扩大硬盘)

http://catn.com/labs/project/centos-images/  这个image使用的用户很多,这是一个基本的kvm镜像,不集成cloud-init,磁盘扩大应该也是不支持。

https://github.com/fubralimited/CentOS-KVM-Image-Tools  这也算是一个工具,不过我没测试过,只能说这是一个centos的kvm镜像。

  15 Responses to “谈谈Openstack的CentOS镜像”

  1. 对于CentOS来说,有一个比较有意思的现象,你手工安装,采用最小化安装,那么需要安装的包的数量大概是:243个包。如果你采用自动化安装,用kitstart脚本进行安装,那么需要安装417个包。

    这个是因为少了@packages –nobase
    多的是base组的包

    • 可以这样写,我还真没试过,改天测试一下。谢谢啊。第一次看到这个参数。

  2. linux-rootfs-resize
    这个在CentOS 6.x 的环境下并不复杂,因为有一系列的工具,例如growpart 等是支持扩展根分区的。这可以通过定制kickstart文件来完成即可。
    但在CentOS 5.x版本下就变得很复杂了,我定制了一个基于5.8 的启动镜像,可以完成这个功能,主要的工作是把fdisk、resize2fs等工具放入initrd启动镜像中,通过删除根分区,重建等实现扩展。前提是,实例只有一个独立的根分区,没有额外的swap等,也不支持lvm。

    • 是,现在非lvm的分区,扩大,已经没问题了。现在centos官方,也正在解决这个问题,等待一下把。

      • CentOS 6.x 在lvm 环境下也是可以解决的,已经有现成的方案了,但5.x 难度比较大,主要是涉及到很多的额外命令,这些命令又有依赖库。不过,我觉得只要自定制的镜像,固定单个根分区还是可以的。

  3. 从http://repos.fedorapeople.org/repos/openstack/guest-images/ 下了centos-6.5-20140117.0.x86_64.qcow2镜像,创建虚拟机之后,不知道登录的密码,陈老师是否知道root的密码,或者如何设置?谢谢!

  4. 陈老师,openstack对windows的镜像不知道你有没有关注?自己制作了winxp、win7和win8的镜像,可是出来都很大(大于5G),这还有压缩空间吗?谢谢!

  5. 我创建的镜像大小10G 创建40G虚拟机 为何系统看到的还是10G 无法自动扩展硬盘?

  6. 请问 CentOS 7 images 的用户名和密码是什么?

  7. 陈老师,如何使镜像的 磁盘inode数调大?有方法吗,找了很多地方没有发现

 Leave a Reply

(required)

(required)