应该是在2010年的时候,虚拟机的磁盘大小是由虚拟机的模板决定,这个就比较痛苦,如果你希望提供多种磁盘格式,那么你就需要搞多个镜像。
还有一种做法,就是固定磁盘大小,操作系统是20G,你可以通过增加磁盘,不能调整硬盘大小。硬盘调整是有风险的,很有可能造成数据丢失。
不过当时在国外,linode和Rackspace,都已经实现磁盘的大小是根据创建的时候选择的硬盘大小。那么这个如何实现的呢。
可以猜测到,肯定是虚拟机启动后,运行的磁盘调整的工具,实现分区扩大,具体如何实现,我们就无从知道。
Openstack上,实现了这个功能,虚拟机的大小是由Flovor来决定,那么我就好好研究一下,这个分区调整是如何实现的。
对于linux的虚拟机镜像的分区,大家有不同的看法。目前我看到的反馈就是
- 不需要swap分区
- lvm分区没太多意义
- 就一个 根分区 / 就可以
要想实现分区扩大,其实需要做的工作是很多的,大家会发现,自己做的镜像,分区是无法调整的。而Ubuntu官方的镜像是可以调整的。而且如果你是多个分区,那么他的扩大的分区,其实是根分区。
所以镜像的制作:http://www.chenshake.com/about-openstack-centos-mirror/ 对于centos,我们就需要自己把linux rootfs resize装上才行。
目前Openstack的Dashboard提供磁盘扩大两个选择,一个是自动resize,一个是自己通过fdisk来设置分区。详细可以看Rackspace文档 http://www.rackspace.com/knowledge_center/article/using-automatic-and-manual-disk-partitioning-on-cloud-servers
让同事研究了一下resize的原理
1. gunzip -c /boot/initramfs-2.6.32-220.el6.x86_64.img |cpio -i –make-directories
这是一个虚拟的root文件系统。
2. 检查虚拟的root文件系统是否安装growpart,sfdisk ,e2fsck ,resize2fs ,sed ,awk ,partx ,
如果没有安装,将当前文件系统中的相应工具拷贝到虚拟的文件系统,涉及到库的拷贝
3.修改虚拟文件系统下的init文件:
sed -i -e ‘/^export PATH=.*/r /root/linux-rootfs-resize/distro/centos-6/mod’ -e //N init
# 读取/root/linux-rootfs-resize/distro/centos-6/mod文件的内容,插入到init文件中,插入的位置为^export PATH=.*行的上边
sed -i ‘/^source_all pre-mount/i growroot’ init
# 在文件init上插入’growroot’,插入的位置为^source_all pre-mount行的上边
4. find ./ | cpio -H newc -o > /tmp/initrd.cpio
gzip -c /tmp/initrd.cpio > initramfs-2.6.32-220.el6.x86_64.img-mod #重新打包,从新命名,增加’-mod’
5.grubby -o /boot/grub/grub.conf –grub –copy-default –add-kernel=/boot/vmlinuz-2.6.32-220.el6.x86_64-mod ‘–title=CentOS release 6.2 (Final) 2.6.32-220.el6.x86_64 mod’ –initrd=/boot/initramfs-2.6.32-220.el6.x86_64.img-mod –make-default
# 修改grub.conf,使用新生成的initramfs-2.6.32-220.el6.x86_64.img-mod
6.镜像启动时,由grub引导到initrd,也就是我们新制作的initramfs-2.6.32-220.el6.x86_64.img-mod,执行用户空间的第一个进程init,此刻涉及到我们上面修改的init文件,上边我们插入了一个函数:
growroot()
{
root_part=$(echo ${root} |sed “s/block://”)
root_dev=$(readlink ${root_part}| sed “s/[^a-z]//g”)
part_num=$(readlink ${root_part}| sed “s/[^0-9]//g”)
growpart -v /dev/${root_dev} ${part_num}
if [ $? -eq 0 ]; then
partx -a /dev/${root_dev}
e2fsck -f /dev/${root_dev}${part_num}
resize2fs -p /dev/${root_dev}${part_num}
fi
}
调用这个函数,就会对root分区resize: growpart -v /dev/vda 3
partx -a /dev/vda
e2fsck -f /dev/vda3
resize2fs -p /dev/vda3
转载请注明:爱开源 » 调整虚拟机磁盘大小原理