为 OpenStack Nova 制作 CentOS 镜像

做 CentOS 镜像的过程和去年写的那篇为 OpenStack Nova 制作 Ubuntu 镜像的步骤差不多,不过这半年 OpenStack 发展神速,比以前要稳定多了,有些步骤可以省了,而且有些命令工具、参数、功能都有改动,比如以前的 uec-publish-image 改成了现在的 cloud-publish-image,功能也有变化。下面的制作镜像步骤在 Ubuntu 11.10 + OpenStack Diablo Release 上完成。

安装 CentOS 镜像

下载要安装的 CentOS 版本,这里选用最新的 CentOS 6.2:

$ wget http://mirrors.kernel.org/centos/6.2/isos/x86_64/CentOS-6.2-x86_64-minimal.iso

创建一个 10GB 大小的 “硬盘”(raw 格式),最好用一个较小的 “硬盘”,体积太大提交到云里会花很长时间,而且每次运行实例也会花很长时间:

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

使用刚才下载的 CentOS “安装盘” 和刚创建的 “硬盘” 引导启动系统,用 -vnc 参数打开 vnc 访问,这样可以从其他机器登录到这个界面安装系统:

$ sudo kvm -m 512 -cdrom CentOS-6.2-x86_64-minimal.iso \
-drive file=centos.img -boot d -net nic -net tap -nographic -vnc :0

用 vncviewer 登录后按照屏幕提示完成 CentOS 安装。需要注意的是在分区阶段把 10GB 硬盘全部划分成一个 ext4 root 分区,不要创建多个分区也不要创建 swap 区:

$ vncviewer 172.16.39.111:5900

安装完后会自动重启,如果没有重启的话按照下面的命令启动刚刚安装好的虚拟机镜像 centos.img,如果出现 failed to find romfile “pxe-rtf8139.bin” 的错误提示可以通过安装 kvm-pxe 解决:

$ sudo kvm -m 512 -drive file=centos.img -boot c -net nic -net tap \
-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

# yum update
# yum upgrade
# yum install openssh-server
# chkconfig sshd on

修改分区加载表(/etc/fstab),注释或删除以前的,加上 LABEL=cec-rootfs 一行:

# vi /etc/fstab
#UUID=47a90bea-2d88-4c82-a335-09c1533b1538 / ext4 defaults 1 1
LABEL=cec-rootfs                           / ext4 defaults 0 0

在网络接口配置里面注释或删除这行 #HWADDR= 一行,启用 DHCP:

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
#HWADDR="00:11:22:12:34:56"
#NM_CONTROLLED="yes"
BOOTPROTO=dhcp
ONBOOT="yes"

注射 ssh key 以便外界可以用 ssh -i mykey.priv root@host 的形式无密码登录到虚拟机实例,在 /etc/rc.local 文件中加入下面这些:

# vi /etc/rc.local
...
mkdir -p /root/.ssh
echo >> /root/.ssh/authorized_keys
curl -m 10 -s http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
| grep 'ssh-rsa' >> /root/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
echo "AUTHORIZED_KEYS:"
echo "--------------------"
cat /root/.ssh/authorized_keys
echo "--------------------"

别忘了还需要修改 sshd 的配置实现无密码登录:

# vi /etc/ssh/sshd_config
...
RSAAuthentication yes
PubkeyAuthentication yes
PermitRootLogin without-password
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no

需要关闭 SELINUX,否则即使上面 ssh 设定允许 root 无密码登录也无效:

# vi /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted

70-persistent-net.rules 会自动添加其他的网络接口,需要删除这个文件避免自动添加除了 eth0 以外的接口,关闭虚拟机准备发布镜像:

# rm -rf /etc/udev/rules.d/70-persistent-net.rules

# shutdown -h now

发布 CentOS 镜像

CentOS 镜像已经做好了,现在可以发布到云里了:

$ cloud-publish-image amd64 centos.img mybucket
ami-00000007    mybucket/centos.img.manifest.xml

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

$ euca-describe-images
IMAGE	ami-00000008	images/centos.img.manifest.xml		available	private		x86_64	machine	 	 	instance-store

第一个 CentOS 虚拟机实例

有了 CentOS 镜像(模板)以后我们就可以以这个 “镜像” 为模板来为云计算用户创建 n 个 CentOS 虚拟机(操作系统)实例,不过在运行实例之前需要 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.small ami-00000008
RESERVATION	r-hzwwif81	vpseecloud	default
INSTANCE	i-0000002a	ami-00000008	pending	vpsee (vpseecloud, None)	0		m1.small	2012-02-01T14:26:51Z	unknown zone	aki-00000001	ami-00000000

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

$ euca-describe-instances 
RESERVATION	r-z973l7mm	vpseecloud	default
INSTANCE	i-0000002a	ami-00000008	172.16.39.200	172.16.39.200	running	vpsee (vpseecloud, cloud00)	0		m1.small	2012-02-01T13:56:02Z	nova	ami-00000000	ami-00000000

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

$ sudo nova-manage network list
id   	IPv4              	IPv6           	start address  	DNS1           	DNS2           	VlanID         	project        	uuid           
1    	172.16.38.0/23    	None           	172.16.38.2    	8.8.4.4        	None           	None           	None           	None

刚才用 euca-run-instances 启动的一个 ubuntu 虚拟机实例的 IP 就是从 172.16.38.2 开始的,目前分配的 IP 是 172.16.39.200(从 euca-describe-instances 可以看出来),所以 ssh 登录这个 IP 就登上了我们的 CentOS 云虚拟机:

$ ssh -i mykey.priv [email protected]
[root@server-25 ~]# 

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

评论 (35 Comments)

  1. 两个问题:
    1 是不是少了给硬盘加label的命令?LABEL=cec-rootfs
    2 为什么“只要root 分区,不要创建多个分区也不要创建 swap 区”?

  2. @mweijh
    1、label 不是必须的(系统也可以启动),不过加 label 显得更完整一些;
    2、swap 区可以在外部创建,这样更加灵活,比如某天想增加 swap 区到 2GB,而不想动 /(系统)怎么办?只创建1个分区纯粹是为了灵活,不是必须的。

  3. 请问安装openstack必须安装到ubuntu server版本里吗?可不可以使用ubuntu desktop?后者感觉使用起来更方便些。谢谢

  4. @xuxu
    可以在ubuntu desktop上安装openstack..跟图形界面没什么关系

  5. @xuxu
    desktop 版本也可以。

  6. 求教vpsee大神
    centos6.2 安装openstack,并制作windows虚拟机之后。windows虚拟机里面,ping 外网如sohu.com 可以进行域名解析,但是无法ping通,请问这是为什么。
    简单说来,就是windows虚拟机里面无法上网。

  7. 求教vpsee大神

    CentOS 6.2 + KVM + libvirt 时
    执行
    virsh –connect qemu:///system
    时,不能连上

    ———————————————————–
    vi ifcfg-eth0

    DEVICE=”eth0″
    NM_CONTROLLED=”yes”
    ONBOOT=yes
    HWADDR=00:0C:29:8A:66:0C
    TYPE=Ethernet
    BOOTPROTO=none
    IPADDR=192.168.1.220
    PREFIX=24
    GATEWAY=192.168.1.10
    DOMAIN=SmartMap
    DEFROUTE=yes
    IPV4_FAILURE_FATAL=yes
    IPV6INIT=no
    NAME=”System eth0″
    UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03

    vi ifcfg-eth1

    DEVICE=”eth1″
    # TYPE=Ethernet
    # NM_CONTROLLED=”no”
    ONBOOT=yes
    HWADDR=00:0C:29:8A:66:16
    BRIDGE=br100
    NAME=”eth1″

    vi ifcfg-br100

    DEVICE=”br100″
    # NM_CONTROLLED=”no”
    ONBOOT=yes
    TYPE=Bridge
    BOOTPROTO=static
    IPADDR=192.168.3.1
    NETMASK=255.255.255.0
    # PREFIX=24
    # GATEWAY=192.168.3.1
    # DEFROUTE=yes
    # IPV4_FAILURE_FATAL=yes
    # IPV6INIT=no
    NAME=”br100″

    ——————————————–

    ifconfig

    br100 Link encap:Ethernet HWaddr 00:0C:29:8A:66:16
    inet addr:192.168.3.1 Bcast:192.168.3.255 Mask:255.255.255.0
    inet6 addr: fe80::20c:29ff:fe8a:6616/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:56 errors:0 dropped:0 overruns:0 frame:0
    TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:5818 (5.6 KiB) TX bytes:6707 (6.5 KiB)

    eth0 Link encap:Ethernet HWaddr 00:0C:29:8A:66:0C
    inet addr:192.168.1.220 Bcast:192.168.1.255 Mask:255.255.255.0
    inet6 addr: fe80::20c:29ff:fe8a:660c/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:1140 errors:0 dropped:0 overruns:0 frame:0
    TX packets:800 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:96219 (93.9 KiB) TX bytes:124014 (121.1 KiB)

    eth1 Link encap:Ethernet HWaddr 00:0C:29:8A:66:16
    inet6 addr: fe80::20c:29ff:fe8a:6616/64 Scope:Link
    UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
    RX packets:1949 errors:0 dropped:0 overruns:0 frame:0
    TX packets:94 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:225721 (220.4 KiB) TX bytes:8091 (7.9 KiB)

    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Mask:255.0.0.0
    inet6 addr: ::1/128 Scope:Host
    UP LOOPBACK RUNNING MTU:16436 Metric:1
    RX packets:123031 errors:0 dropped:0 overruns:0 frame:0
    TX packets:123031 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:15050434 (14.3 MiB) TX bytes:15050434 (14.3 MiB)

    virbr0 Link encap:Ethernet HWaddr 52:54:00:DA:41:89
    inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:49 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:0 (0.0 b) TX bytes:5825 (5.6 KiB)

  8. 请教,我在发布上传image的时候,即执行$ cloud-publish-image amd64 centos.img mybucket这条命令时,报出如下错误:139655907084064:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:696:Expecting: CERTIFICATE
    请指教一下如何解决。谢谢

  9. @Kevin Yu
    你在 cloud-publish-image 之前 source novarc 了没有?或者因为弄混了不同的 novarc,当前的 novarc 不是对应当前的 openstack project?novarc 里面的环境变量在认证的时候需要用到。

    # cat novarc

    export EC2_PRIVATE_KEY=${NOVA_KEY_DIR}/pk.pem
    export EC2_CERT=${NOVA_KEY_DIR}/cert.pem
    export NOVA_CERT=${NOVA_KEY_DIR}/cacert.pem
    export EUCALYPTUS_CERT=${NOVA_CERT} # euca-bundle-image seems to require this set
    alias ec2-bundle-image=”ec2-bundle-image –cert ${EC2_CERT} –privatekey ${EC2_PRIVATE_KEY} –user 42 –ec2cert ${NOVA_CERT}”
    alias ec2-upload-bundle=”ec2-upload-bundle -a ${EC2_ACCESS_KEY} -s ${EC2_SECRET_KEY} –url ${S3_URL} –ec2cert ${NOVA_CERT}”

  10. 安装的时候是文本模式没有分区的那个步骤啊,怎么处理呢?
    sudo kvm -m 512 -cdrom CentOS-6.2-x86_64-minimal.iso \
    > -drive file=centos.img -boot d -net nic -net tap -nographic -vnc :0
    can’t add tap0 to bridge eth0: Operation not supported
    /etc/qemu-ifup: could not launch network script
    kvm: -net tap: Device ‘tap’ could not be initialized
    提示以上错误,这个是什么原因啊?请指教一下如何解决?

  11. @sole
    试一下 -net user 选项:
    kvm -m 512 -cdrom CentOS-6.0-i386-bin-DVD.iso -drive file=centos.img -boot d -net nic -net user -nographic -vnc :1

  12. 安装的时候是文本模式没有分区的那个步骤啊,怎么处理呢?

  13. 不需要像制作ubuntu镜像时那样调整镜像吗,抽取ext4部分

  14. @icycola
    不需要,centos 6 已经是 ext4 了。

  15. 请问centos6.2跟xen能否做到像OpenStack Nova 那样,建立镜像(Amazon AMI)?

  16. 还有这个是full virtualization还是paravirtualization

  17. 如果我的电脑比较旧,cpu不支持VT,根据官网说的,不能用kvm去创建了。可以说明一下如何创建xen环境中的镜像吗

  18. @Tony
    可以做镜像,KVM 是 full virtualization 的。

  19. @vpsee
    做出来的镜像Xen能运行吗

  20. @Tony
    不能直接运行。这个是制作 KVM 的镜像,换个 Linux Xen 内核后应该可以当作 Xen domU 用。

  21. @vpsee
    这个有安装boot loader吗?在官方文件说这些镜像不能有bootable 标签,那一步是做这个的?
    如果可以,发个xen的教程可以吗?

  22. 发布镜像的时候发生错误
    ERROR [glance.api.v1.images] Traceback (most recent call last):
    File “/usr/lib/python2.7/dist-packages/glance/api/v1/images.py”, line 369, in _upload
    image_size)
    File “/usr/lib/python2.7/dist-packages/glance/store/swift.py”, line 410, in add
    raise glance.store.BackendException(msg)
    BackendException: Failed to add object to Swift.
    Got error from Swift: put_object(‘glance’, ‘1’, …) failure and no ability to reset contents for reupload.
    有高手帮助吗

  23. ERROR nova.image.s3 [-] Failed to upload bucket1/centos-no-swap.img.manifest.xml to /tmp/tmpo0N0UL
    (nova.image.s3): TRACE: Traceback (most recent call last):
    (nova.image.s3): TRACE: File “/usr/lib/python2.7/dist-packages/nova/image/s3.py”, line 265, in delayed_create
    (nova.image.s3): TRACE: metadata, image_file)
    (nova.image.s3): TRACE: File “/usr/lib/python2.7/dist-packages/nova/image/glance.py”, line 287, in update
    (nova.image.s3): TRACE: image_meta = client.update_image(image_id, image_meta, data)
    (nova.image.s3): TRACE: File “/usr/lib/python2.7/dist-packages/glance/client.py”, line 174, in update_image
    (nova.image.s3): TRACE: res = self.do_request(“PUT”, “/images/%s” % image_id, body, headers)
    (nova.image.s3): TRACE: File “/usr/lib/python2.7/dist-packages/glance/common/client.py”, line 140, in do_request
    (nova.image.s3): TRACE: method, action, body=body, headers=headers, params=params)
    (nova.image.s3): TRACE: File “/usr/lib/python2.7/dist-packages/glance/common/client.py”, line 230, in _do_request
    (nova.image.s3): TRACE: raise exception.Invalid(res.read())
    (nova.image.s3): TRACE: Invalid: 400 Bad Request
    (nova.image.s3): TRACE:
    (nova.image.s3): TRACE: The server could not comply with the request since it is either malformed or otherwise incorrect.
    (nova.image.s3): TRACE:
    (nova.image.s3): TRACE: Error uploading image: (BackendException): Failed to add object to Swift. Got error from Swift: put_object(‘glance’, ‘1’, …) failure and no ability to reset contents for reupload.

  24. @Tony
    建议不要用 Swift,会增加难度。

  25. 制作镜像的服务器是不是也必须安装openstack呢 还是有kvm组建的系统都可以?

  26. @aufemercury
    镜像是基于 kvm 的,用任何一台装有 kvm 的机器都可以。

  27. @Vpsee
    我在修改fstab 后会出现无法启动的情况,提示 fsck.ext4: Unable to resolve ‘UUID=cec-rootfs’ 望指教!

  28. @rex
    不是 UUID=cec-rootfs,应该是 LABEL=cec-rootfs
    也可以用 UUID,但是要保证 UUID 和 /etc/fstab 里面的 UUID 匹配:
    # vol_id -u /dev/sda1
    b257f084-cu83-9332-9635-177812ff360b

    # cat /etc/fstab
    UUID=b257f084-cu83-9332-9635-177812ff360b …

  29. 制作完suse10sp2的镜像成功上传并启动实例,但是却无法ping通,确认安全组都开放了所有端口,还有可能问题出在哪?恳请赐教。

  30. 请问我执行vncviewer之后报can’t open display是啥原因啊?谢谢!

    root@OpenStacky:/# vncviewer 135.251.246.140:5900
    Error: Can’t open display:
    root@OpenStacky:/#

  31. 你好!
    请问我执行了cloud-publish-image amd64 centos.img mybucket后,报错:

    failed: euca-bundle-image –destination /tmp/cloud-publish-image.BOhWS8 –arch x86_64 –image /tmp/cloud-publish-image.BOhWS8/.rename.XBWxkY/centos.img
    Environment variable: EC2_CERT not found
    failed to bundle image centos.img

    这个EC2_CERT该怎么设呢?谢谢!

  32. 你好!
    请问我按照您的做法做了img并修改好centos的参数后,虽然没有使用euca工具,但是直接用nova boot启动镜像后,nova show的结果是系统active的,但无法ssh进入,ip地址也ping不通。请问有没有其他的办法进入到系统中去?或者如何知道我的系统是否真的起来了?会不会系统起来了但是ip没有获取到所以无法ssh呢?启动结果如下。谢谢!
    root@OpenStacky:/# nova show “Server 11”
    +————————————-+———————————————————-+
    | Property | Value |
    +————————————-+———————————————————-+
    | OS-DCF:diskConfig | MANUAL|
    | OS-EXT-SRV-ATTR:host | OpenStacky|
    | OS-EXT-SRV-ATTR:hypervisor_hostname | None|
    | OS-EXT-SRV-ATTR:instance_name | instance-0000000b|
    | OS-EXT-STS:power_state | 1|
    | OS-EXT-STS:task_state | None|
    | OS-EXT-STS:vm_state | active|
    | accessIPv4 ||
    | accessIPv6 |
    | config_drive ||
    | created | 2012-09-04T07:30:54Z|
    | flavor | m1.tiny |
    | hostId | 23bf731db9771f8f4b0d5e3451877e342e744b369d27073e2254d1fa |
    | id | b4214425-5445-4e6e-84a2-9ae5e8bae4da|
    | image | CentOS 6.3 clouding x86_64|
    | key_name | key1 |
    | metadata | {} |
    | name | Server 11 |
    | private network | 192.168.1.34 |
    | progress | 0 |
    | status | ACTIVE |
    | tenant_id | 9d225f29786c41468ff061942f8111fb |
    | updated | 2012-09-04T07:31:06Z|
    | user_id | c324d6d14eee40118c6d2c4b4ea08516|
    +————————————-+———————————–

  33. @kiko
    EC2_CERT 在那个 novarc 里面,用任何 euca-* 相关命令之前都要 source novarc

  34. @kiko
    用 virsh 啊,openstack 开的虚拟机就是 kvm 虚拟机啊,用 virsh 相关命令可以查看虚拟机列表 virsh list, virsh console 进入虚拟机等。

  35. 请教vpsee大神,我也遇到了6楼的问题,但是没找到答案,就是我给实例分配了floating ip,外网可以ping实例,但是实例ping不通外网,,ping 外网如sohu.com 可以进行域名解析但是ping不通,很纠结,请指教一下如何解决?

发表评论