为 OpenStack Nova 制作 CentOS 镜像
2012年02月2日 | 标签: centos, cloud, kvm, nova, openstack | 作者:vpsee
做 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 镜像。
两个问题:
1 是不是少了给硬盘加label的命令?LABEL=cec-rootfs
2 为什么“只要root 分区,不要创建多个分区也不要创建 swap 区”?
@mweijh
1、label 不是必须的(系统也可以启动),不过加 label 显得更完整一些;
2、swap 区可以在外部创建,这样更加灵活,比如某天想增加 swap 区到 2GB,而不想动 /(系统)怎么办?只创建1个分区纯粹是为了灵活,不是必须的。
请问安装openstack必须安装到ubuntu server版本里吗?可不可以使用ubuntu desktop?后者感觉使用起来更方便些。谢谢
@xuxu
可以在ubuntu desktop上安装openstack..跟图形界面没什么关系
@xuxu
desktop 版本也可以。
求教vpsee大神
centos6.2 安装openstack,并制作windows虚拟机之后。windows虚拟机里面,ping 外网如sohu.com 可以进行域名解析,但是无法ping通,请问这是为什么。
简单说来,就是windows虚拟机里面无法上网。
求教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)
请教,我在发布上传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
请指教一下如何解决。谢谢
@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}”
…
安装的时候是文本模式没有分区的那个步骤啊,怎么处理呢?
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
提示以上错误,这个是什么原因啊?请指教一下如何解决?
@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
安装的时候是文本模式没有分区的那个步骤啊,怎么处理呢?
不需要像制作ubuntu镜像时那样调整镜像吗,抽取ext4部分
@icycola
不需要,centos 6 已经是 ext4 了。
请问centos6.2跟xen能否做到像OpenStack Nova 那样,建立镜像(Amazon AMI)?
还有这个是full virtualization还是paravirtualization
如果我的电脑比较旧,cpu不支持VT,根据官网说的,不能用kvm去创建了。可以说明一下如何创建xen环境中的镜像吗
@Tony
可以做镜像,KVM 是 full virtualization 的。
@vpsee
做出来的镜像Xen能运行吗
@Tony
不能直接运行。这个是制作 KVM 的镜像,换个 Linux Xen 内核后应该可以当作 Xen domU 用。
@vpsee
这个有安装boot loader吗?在官方文件说这些镜像不能有bootable 标签,那一步是做这个的?
如果可以,发个xen的教程可以吗?
发布镜像的时候发生错误
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.
有高手帮助吗
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.
@Tony
建议不要用 Swift,会增加难度。
制作镜像的服务器是不是也必须安装openstack呢 还是有kvm组建的系统都可以?
@aufemercury
镜像是基于 kvm 的,用任何一台装有 kvm 的机器都可以。
@Vpsee
我在修改fstab 后会出现无法启动的情况,提示 fsck.ext4: Unable to resolve ‘UUID=cec-rootfs’ 望指教!
@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 …
制作完suse10sp2的镜像成功上传并启动实例,但是却无法ping通,确认安全组都开放了所有端口,还有可能问题出在哪?恳请赐教。
请问我执行vncviewer之后报can’t open display是啥原因啊?谢谢!
root@OpenStacky:/# vncviewer 135.251.246.140:5900
Error: Can’t open display:
root@OpenStacky:/#
你好!
请问我执行了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该怎么设呢?谢谢!
你好!
请问我按照您的做法做了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|
+————————————-+———————————–
@kiko
EC2_CERT 在那个 novarc 里面,用任何 euca-* 相关命令之前都要 source novarc
@kiko
用 virsh 啊,openstack 开的虚拟机就是 kvm 虚拟机啊,用 virsh 相关命令可以查看虚拟机列表 virsh list, virsh console 进入虚拟机等。
请教vpsee大神,我也遇到了6楼的问题,但是没找到答案,就是我给实例分配了floating ip,外网可以ping实例,但是实例ping不通外网,,ping 外网如sohu.com 可以进行域名解析但是ping不通,很纠结,请指教一下如何解决?