zoukankan      html  css  js  c++  java
  • [zz]为 OpenStack Nova 制作 Ubuntu 镜像

    最近超级忙,被 Mesh Potato 的项目折腾的不行,发现只要什么东西沾上 “分布式、集群” 这些东西事情就变得格外复杂,一台 Asterisk 服务器做 VoIP 容易,n 台 Asterisk 服务器做集群就不容易;一台 Xen/KVM 服务器做虚拟机容易,n 台 Xen/KVM 服务器做云计算就不是那么容易。上星期我们介绍了在 Ubuntu 上安装和配置 OpenStack Nova,今天来进一步介绍如何在 OpenStack Nova 环境里制作虚拟机模板(镜像)以及创建虚拟机运行实例(以 Ubuntu 为例子)。为了和我们平时说的 “VMware/Xen/KVM/VirtualBox 虚拟机” 区分开,VPSee 在这里把在 OpenStack Nova、OpenNebula 这样的云计算平台上运行的虚拟机称为 “云虚拟机”。简单说在 OpenStack Nova 平台上运行一个 ubuntu 虚拟机的流程是:先制作一个 ubuntu 虚拟机镜像(模板),然后再以这个镜像为模板来创建 ubuntu 虚拟机(实例)。

    安装 Ubuntu 镜像

    首先下载要安装的 ubuntu 版本:

    $ wget http://releases.ubuntu.com/lucid/ubuntu-10.04.2-server-amd64.iso
    

    创建一个 10GB 大小的 “硬盘”(raw 格式):

    $ kvm-img create -f raw ubuntu.img 10G
    Formatting 'ubuntu.img', fmt=raw size=10737418240
    

    使用刚才下载的 ubuntu “安装盘” 和刚创建的 “硬盘” 引导启动系统,为了简单起见,VPSee 在这里使用 kvm 虚拟技术,避开 xen 繁琐的配置。-vnc 参数代表打开 vnc 访问,以便可以用其他机器远程登录到这个引导界面进行安装操作:

    $ sudo kvm -m 512 -cdrom ubuntu-10.04.2-server-amd64.iso \
    -drive file=ubuntu.img -boot d -nographic -vnc :0
    

    用 vncviewer 登录引导界面后按照屏幕的提示完成 ubuntu 的安装工作(和在自己电脑上安装 ubuntu 过程一样)。需要注意的是在分区阶段把 10GB 硬盘全部划分成一个 ext4 root 分区,不要创建多个分区也不要创建 swap 区:

    $ vncviewer 172.16.39.111:5900
    

    安装完后退出(必要时 kill 掉 kvm 进程),按照下面命令启动刚刚安装好的虚拟机镜像 ubuntu.img,如果出现 failed to find romfile “pxe-rtf8139.bin” 的错误提示可以通过安装 kvm-pxe 解决:

    $ sudo kvm -m 512 -drive file=ubuntu.img -boot c -nographic -vnc :0
    kvm: pci_add_option_rom: failed to find romfile "pxe-rtl8139.bin"
    
    $ sudo apt-get install kvm-pxe
    

    再次用 vnc 登录虚拟机镜像,安装一些必要工具(因为这个镜像将会是模板,所以最好保持最简最小化,不要乱装东西):

    $ vncviewer 172.16.39.111:5900
    
    $ sudo apt-get update
    $ sudo apt-get upgrade
    $ sudo apt-get install openssh-server cloud-init
    

    70-persistent-net.rules 会自动添加其他的网络接口,需要删除这个文件避免自动添加除了 eth0 以外的接口。删除后系统基本就准备好了,关闭虚拟机:

    $ sudo rm -rf /etc/udev/rules.d/70-persistent-net.rules
    
    $ sudo shutdown -h now
    

    调整 Ubuntu 镜像

    因为 OpenStack 只接受 ext4 文件系统格式的镜像,所以需要把上面创建的 raw 镜像(kvm-img create -f raw)转换成 ext4 镜像。下面的步骤用来找出镜像文件里面的分区起点是从哪里开始的:

    $ sudo losetup -f ubuntu.img
    $ sudo losetup -a
    /dev/loop0: [fb00]:24117291 (/home/vpsee/ubuntu.img)
    
    $ sudo fdisk -cul /dev/loop0
    
    Disk /dev/loop0: 10.7 GB, 10737418240 bytes
    255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000502e6
    
          Device Boot      Start         End      Blocks   Id  System
    /dev/loop0p1   *        2048    20969471    10483712   83  Linux
    

    上面最后一行显示分区是从扇区(sector)2048开始的,每个扇区是512个字节,所以是从 2048 x 512 = 1048576个字节开始的。记住这个1048576,下面会用到。

    卸载 loop 后重新从1048576字节开始挂载:

    $ sudo losetup -d /dev/loop0
    
    $ sudo losetup -f -o 1048576 ubuntu.img
    $ sudo losetup -a
    /dev/loop0: [fb00]:24117291 (/home/vpsee/ubuntu.img), offset 1048576
    

    把这整个分区拷贝到一个新文件就是一个我们要的 ext4 文件系统镜像:

    $ sudo dd if=/dev/loop0 of=ubuntutemplate.img
    20969472+0 records in
    20969472+0 records out
    10736369664 bytes (11 GB) copied, 107.455 s, 99.9 MB/s
    

    用完 loop 后记得卸载:

    $ sudo losetup -d /dev/loop0
    

    挂载(mount)刚创建的 ext4 文件系统镜像,并修改分区加载表(/etc/fstab),注释或删除以前的,加上 UUID=uec-rootfs 一行:

    $ sudo mount -o loop ubuntutemplate.img /mnt
    
    $ sudo vi /mnt/etc/fstab
    #UUID=1dc3a59e-faab-41ee-b232-3300163676bf / ext4 errors=remount-ro 0 1
    UUID=uec-rootfs                           / ext4 defaults          0 0
    

    把内核(vmlinuz)和内存盘(initrd)文件拷贝出来以便后面和虚拟机镜像一起发布到OpenStack 云里。使用完虚拟机镜像后记得卸载(unmount):

    $ sudo cp /mnt/boot/vmlinuz-2.6.32-28-server /home/vpsee/
    $ sudo cp /mnt/boot/initrd.img-2.6.32-28-server /home/vpsee/
    
    $ sudo umount /mnt
    

    把刚才的虚拟机镜像 ubuntutemplate.img 的文件系统标志改成 ‘uec-rootfs’:

    $ sudo tune2fs -L uec-rootfs ubuntutemplate.img
    tune2fs 1.41.14 (22-Dec-2010)
    

    发布 Ubuntu 镜像

    好了,ubuntu 镜像已经做好了,现在可以发布到云里了,需要3个东西,虚拟机的内核文件、虚拟机的内存盘文件和虚拟机镜像文件:

    $ uec-publish-image -t image --kernel-file vmlinuz-2.6.32-28-server \
    --ramdisk-file initrd.img-2.6.32-28-server amd64 ubuntutemplate.img mybucket
    ami-00000006	mybucket/ubuntutemplate.img.manifest.xml
    

    等待一段时间后出现 ami-00000006 mybucket/ubuntutemplate.img.manifest.xml 表示我们刚制作的 ubuntu 镜像已经正式发布到云里,以后就可以以这个镜像为模板来快速生成虚拟机实例(instance)。可以通过 euca-describe-images 来查看:

    $ euca-describe-images
    
    IMAGE	aki-00000001	mybucket/vmlinuz-2.6.32-28-server.manifest.xml		availablpublic		x86_64	kernel
    IMAGE	ari-00000002 	mybucket/initrd.img-2.6.32-28-server.manifest.xml		available	public		x86_64	ramdisk
    IMAGE	ami-00000003	mybucket/ubuntutemplate.img.manifest.xml		untarring	public		x86_64	machine	aki-00000001	ari-00000002
    

    第一个 Ubuntu 虚拟机实例

    有了 ubuntu 镜像(模板)以后我们就可以以这个 “镜像” 为模板来为云计算用户创建 n 个 ubuntu 虚拟机(操作系统)实例,不过在运行实例之前需要 key:

    $ euca-add-keypair mykey > mykey.priv
    $ chmod 600 mykey.priv 
    
    $ euca-describe-keypairs
    KEYPAIR	mykey	76:7d:93:88:a0:e5:3e:5d:4b:62:cd:85:c5:23:7a:05
    
    $ euca-run-instances -k mykey -t m1.tiny ami-00000003
    RESERVATION	r-n0lpdme5	vpseecloud	default
    INSTANCE	i-00000001	ami-00000003			scheduling	mykey (vpseecloud, None)	0		m1.tin2011-05-20T14:00:34Z	unknown zone
    

    上面使用 euca-run-instances 创建一个实例后可以用 nova-manage 命令看到:

    $ sudo nova-manage vm list
    instance   node            type       state      launched            image        kernel       ramdisk       project    user       zone       index
    i-00000001 node01           launching  None                3            1            2             vpseecloud    vpsee       None       0
    

    还记得上篇:在 Ubuntu 上安装和配置 OpenStack Nova 的创建网络部分吗?可以看看现在的云里面 IP 分配情况:

    $ sudo nova-manage network list
    network           	netmask        	start address  	DNS
    192.168.3.0/25    	255.255.255.128	192.168.3.3    	None
    

    刚才用 euca-run-instances 启动的一个 ubuntu 虚拟机实例的 IP 就是从 192.168.3.3 开始的,所以 ssh 登录这个 IP 就登上了我们的第一个云虚拟机:)

    $ ssh 192.168.3.3
    vpsee@i-00000001:~$
    

    想制作 CentOS 虚拟机镜像的话可以看:为 OpenStack Nova 制作 CentOS 镜像;想制作 Windows 虚拟机镜像的话可以看:为 OpenStack Nova 制作 Windows 镜像

  • 相关阅读:
    1.20
    1.18
    4.16python安装
    4.15Android学习
    4.14Android学习
    4.13Android学习
    4.12Android学习
    4.11Android学习
    4.10Android学习
    4.09Android学习
  • 原文地址:https://www.cnblogs.com/zhangzhang/p/2353253.html
Copyright © 2011-2022 走看看