上下文: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