上下文:api
在工做中客户要求作一个openstack的镜像,这个操做系统的配置要求很是的高,最小须要8核96GB内存1TB硬盘。普通的系统能够经过分区扩展脚本作一个20GB的镜像而后在云平台上扩展,可是因为这个系统是封闭的,无法把脚本放进去,因此镜像只能一口气作成1TB大小。ide
该镜像若是制做成qcow只有5GB的大小。若是作成raw格式的镜像则有1TB大。ui
原来的设想是将镜像作成qcow2格式而后上传到glance中,没想到qcow2的镜像在建立虚拟机的时候会临时在计算节点上转换成raw格式,这样致使计算节点由于一会儿多出了一个1TB文件,占满了磁盘把信息队列堵死了。spa
无奈在计算节点上将qcow转换成raw的话,也没法放下一个1TB的文件。故此最后决定将镜像上传到存储中去,而后在存储中将qcow转换成raw格式,而后再传到glance中去。操作系统
因为这个状况很是复杂,状况特殊,因此我把操做的记录写下来。orm
参数:队列
在本文中会牵涉到一些参数,这个参数在实际的环境中会有变化故此在这里解释一下。ip
<pool.name> ceph的池名,能够经过命令:ceph osd lspools查看到。内存
不知道为何本环境中全部关于ceph的命令都须要加上--id cinder参数才能显示。ci
<rbd.id> rbd的id,id是内容是随机生成的,能够经过命令uuidgen来生成,而后镜像就使用这个id来表示本身。在ceph中的镜像都是用uuid来命名。
uuidgen
首先我先运行了uuidgen命令来生成id来用于接下来的一条命令中使用。
rbd import --path <*.raw> --dest-pool <pool.name> --dest <rbd.id> --id cinder
import命令将本地的镜像文件<*.raw>上传到了<pool.name>中,而<rbd.id>就是前面的uuidgen生成的字符串。
rbd -p <pool.name> info <rbd.id> --id cinder
这条命令是查看池中有没有这个id的镜像,确认上传成功。在完成上传后,咱们就要准备将这个raw转换成qcow。因此要为qcow文件准备一个名字,依旧是一个uuid
uuidgen
这一次生成的uuid是给qcow文件准备的。
qemu-img convert -O raw rbd:<pool.name>/<old.rbd.id>:id=cinder rbd:<pool.name>/<new.rbd.id>:id-cinder
这个是一个qemu-img转换镜像格式的命令,不事后面的路径是rbd的。
rbd -p <pool.name> info <new.rbd.id> --id cinder
检查池中有没有新生成的镜像文件。
qemu-img info rbd:<pool.name>/<new.rbd.id>:id=cinder
能够经过qemu-img查看这个文件,看到这个文件是否为raw文件。
rbd --pool <pool.name> snap create --snap snap <rbd.id> --id cinder
rbd --pool <pool.name> snap protect --image <rbd.id> --snap snap --id cinder
rbd -p <pool.name> snap ls <rbd.id> --id cinder
最后是上传镜像(这个命令有点怪,貌似是上一个版本的openstack命令,我用的是m版本)
glance --os-image-api-version 1 image-create --id <rbd.id> --name <image.name> --store rbd --disk-format raw --container-format bare --location rbd://$(ceph fsid --id cinder)/<pool.name>/<rbd.ip>/snap