Solar

openstack 系列--利用Vmware workstation手动制作 openstack centos镜像简记

目录结构:

准备工作

创建虚拟机

安装Centos系统

配置系统

上传镜像

自动创建镜像工具

参考文章

tips:在制作镜像的时候最好先知晓镜像所要满足的要求,比如:是否支持磁盘分区,重设根分区大小,密码初始化等等。最常见的需求有如下几种:

  • Disk partitions and resize root partition on boot (cloud-init)
  • No hard-coded MAC address information
  • SSH server running
  • Disable firewall
  • Access instance using ssh public key (cloud-init)
  • Process user data and other metadata (cloud-init)
  • Paravirtualized Xen support in Linux kernel (Xen hypervisor only with Linux kernel version < 3.0)

这部分内容可参考官方文档,Image requirements

准备工作

  • 下载Vmware workstation,并安装Centos7,配置好网络。注:刚开始是用的virtualbox,发现不支持nested KVM,Vmware workstation 10+版本以上应该都可以,注意开启workstation的虚拟化设置。
  • 宿主机(刚装好的Centos)安装libvirt系列工具:
1
2
3
4
yum groupinstall Virtualization "Virtualization Client" 
yum install libvirt
yum install libguestfs-tools
service libvirtd restart
1
wget - O http://mirrors.163.com/centos/7.2.1511/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso

创建虚拟机

  • 创建一个容量为5G的磁盘,并更改所属者:

    1
    2
    3
    cd /image
    qemu-img create -f qcow2 centos.qcow2 5G
    chown qemu:qemu /image/centos.qcow2 -R
  • 创建并启动虚拟机

    1
    2
    3
    4
    5
    6
    sudo virt-install --virt-type kvm --name centos7 --ram 1024 \  # name 是自己取得
    --disk centos.qcow2,format=qcow2 \ #disk参数为上面创建的磁盘
    --network network=default \ # 采用KVM虚拟机网络为nat,其实更建议用bridge模式,删除本行,默认即为bridge模式,不过bridge模式需要自己手动配置宿主机网桥
    --graphics vnc,listen=0.0.0.0 --noautoconsole \
    --os-type=linux --os-variant=rhel7 \
    --cdrom=/image/CentOS-7-x86_64-Minimal-1511.iso #下载的镜像
  • 用“virsh list” 命令查看虚拟机是否启动,如果没有启动的话用“virsh start $NAME” 启动。

  • 执行 “virsh vncdisplay $NAME” ,之后就可以利用vnc-client 访问该虚拟机了。

安装Centos系统

  • 利用vnc-viewer 连接 虚拟机,默认是宿主机IP+5900端口。并进行虚拟机的安装。安装时注意大多数配置默认即可,SOFTWARE SELECTION选择Minimal Install,INSTALLATION DESTINATION需要选择手动配置分区,我们只需要一个根分区即可,不需要swap分区,文件系统选择ext4,存储驱动选择Virtio Block Device。
  • 安装完成后,为了能够联外网,以及用宿主机直接SSH 虚拟机,还要进行网络的配置。KVM虚拟机的网络配置方式主要有两种,Bridge模式和NAT 模式,关于两种模式的介绍可以参考这篇文章,KVM虚拟机网络配置 Bridge方式,NAT方式。我们这里使用默认的NAT模式,但是NAT模式有个弊端就是无法从宿主机SSH虚拟机,这样我们还要做些额外的工作实现该功能。
  • 通过端口转发来实现宿主机直连虚拟机,具体参考这里
1
2
3
4
5
6
7
echo 1 >/proc/sys/net/ipv4/ip_forward  # 打开ip转发功能,这种方法是暂时的,可以直接修改/etc/sysctl.conf 文件,增加net.ipv4.ip_forward = 1 达到永久效果,文件修该完毕后,要使用sysctl –p使其生效

iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE # 开启KVM服务器的IPtables的转发功能

iptables -t nat -A PREROUTING -d 192.168.1.102 -p tcp -m tcp --dport 8022 -j DNAT --to-destination 192.168.122.173:22

iptables -t nat -A POSTROUTING -s 192.168.122.0/255.255.255.0 -d 192.168.122.173 -p tcp -m tcp --dport 22 -j SNAT --to-source 192.168.122.1

配置系统

  • SSH到虚拟机后就可以开始一系列的配置工作,首先修改yum源为国内源。
  • 安装acpid服务,并设置开机自启动(acpid服务是用于hypervisor与虚拟机的交互)。

    1
    2
    yum install -y acpid
    systemctl enable acpid
  • 虚拟机需要打开boot日志功能,并指定console,这样nova console-log才能获取虚拟机启动时的日志。修改配置文件/etc/default/grub,设置GRUB_CMDLINE_LINUX为:

    1
    GRUB_CMDLINE_LINUX=" vconsole.keymap=us console=tty0 vconsole.font=latarcyrheb-sun16 console=ttyS0,115200"

执行以下语句:

1
grub2-mkconfig -o /boot/grub2/grub.cfg

ubuntu 的话执行 update-grub。

  • 手动安装qemu-guest-agent(版本必须是2.3+,L 版的动态修改密码需要用到):
1
yum install -y qemu-guest-agent

配置qemu-ga,修改/etc/sysconfig/qemu-ga,配置内容为:

1
2
3
4
5
6
TRANSPORT_METHOD="virtio-serial"
DEVPATH="/dev/virtio-ports/org.qemu.guest_agent.0"
LOGFILE="/var/log/qemu-ga/qemu-ga.log"
PIDFILE="/var/run/qemu-ga.pid"
BLACKLIST_RPC=""
FSFREEZE_HOOK_ENABLE=0
  • 为了使虚拟机能够和外部的metadata service通信,需要禁用默认的zeroconf route:

    1
    echo "NOZEROCONF=yes" >> /etc/sysconfig/network
  • 最后安装cloud-init:

1
yum install -y cloud-init
  • 为了实现自动扩容, 需要安装growpart:
1
2
3
4
yum update -y
yum install -y epel-release
yum install -y cloud-utils-growpart
rpm -qa kernel | sed 's/^kernel-//' | xargs -I {} dracut -f /boot/initramfs-{}.img {}
  • 基本完成,虚拟机关机。

  • 宿主机上进行清理工作:

1
2
virt-sysprep -d centos7 # 移除mac地址信息
virsh undefine centos7 # 删除虚拟机

上传镜像

  • 镜像格式转换(ceph只支持raw格式)
1
qemu-img convert -f qcow2 -O raw centos.qcow2 centos.raw
  • 直接用glance上传镜像就不赘述了,这里有个窍门就是如果后端是ceph的话可以利用rbd import 的方式来加快速度,如下。
  • 首先glance create 一条记录,但没有执行镜像上传操作,只是新建一条数据库记录。并记录下image-id。
1
glance image-create
  • 利用ceph import 镜像并执行快照
1
2
3
rbd --pool=volumes import  centos.raw  --image=$IMAGE_ID --new-format --order 24
rbd --pool=volumes --image=$IMAGE_ID --snap=snap snap create
rbd --pool=volumes --image=$IMAGE_ID --snap=snap snap protect
  • 完善镜像的必要属性
1
2
3
4
glance image-update --name="centos-7.2-64bit" --disk-format=raw --container-format=bare $IMAGE_ID

# 配置qemu-ga,该步骤是必须的,否则libvert启动虚拟机时不会生成qemu-ga配置项,导致虚拟机内部的qemu-ga由于找不到对应的虚拟串行字符设备而启动失败,提示找不到channel
glance image-update --property hw_qemu_guest_agent=yes $IMAGE_ID
  • 设置镜像的location url
    1
    glance location-add --url rbd://$FS_ROOT/glance_images/$IMAGE_ID/snap $IMAGE_ID#这里的$FS_ROOT 可以通过查看ceph -s 中的cluster.

具体参考手动制作Openstack镜像 的上传镜像部分。

自动创建镜像工具

openstack 文档提供了几个类似的工具,没有尝试,Tool support for image creation.

参考文章

openstack doc:Example: CentOS image

手动制作Openstack镜像

制作openstack用的centos6.5镜像

KVM虚拟机网络配置 Bridge方式,NAT方式

烂泥:KVM使用NAT联网并为VM配置iptables端口转发,kvmiptables

谈谈Openstack的CentOS镜像

Image requirements

本篇文章由pekingzcc采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可,转载请注明。

END