參考文檔:
http://docs.openstack.org/essex/openstack-compute/admin/content/manually-creating-qcow2-images.html
https://github.com/rackerjoe/oz-image-build/blob/master/templates/centos60_x86_64.tdl
目前網上有許多爲OpenStack製作鏡像的方法,但大部分是通過命令行來創建的,其實在CentOS下有很方便的窗口程序Virual Machine Manager來爲OpenStack創建鏡像。接下來我以創建一個CentOS6.3鏡像爲例簡單說明一下這個創建過程。
啓動管理程序
管理程序需要以root用戶登錄桌面才能啓動,因此首先我們需要以root用戶直接或者通過vnc方式登錄以圖形界面方式登錄到服務器,然後在終端輸入virt-manager或者依次點擊應用》系統工具》Virtual Machine Manager啓動管理程序。當然前提是你已經安裝好了管理程序,如果沒有安裝請通過以下命令安裝
yum install virt-manager virt-viewer
創建虛擬機
點擊創建虛擬機按鈕打開創建虛擬機對話框,如下圖所示:
1.給要創建的虛擬機取一個名字如centos63,選擇安裝方式;
2.選擇安裝文件及操作系統類型、版本;
3.配置內存、CPU;
4.創建磁盤,這裏我選擇了第二項,單擊Browse,然後選擇New Volume創建一個7G大小的qcow2格式的磁盤,最後選擇創建的磁盤文件。如下所示:
繼續前進,直到完成彈出虛擬機界面,然後完成系統安裝。PS:在對磁盤進行分區時,我只創建了一個root分區,沒有創建boot及swap分區。
後期處理
安裝完系統並重啓後,安裝所需要的軟件,最後還需要對系統進行一些後期處理。
修改grub參數
如果不修改grub,鏡像上傳後啓動實例後,實例無法啓動,報“kernel panic - not syncing: Attempted to kill init!”錯誤,方法一:從網上查到修改/boot/grub/grub.conf文件,在kernel項參數quiet的後面添加一個參數enforcing=0即可網址。方法二:參考文檔https://github.com/rackerjoe/oz-image-build/blob/master/templates/centos60_x86_64.tdl運行以下命令:
sed -i 's/ rhgb//g' /boot/grub/grub.conf
sed -i 's/ quiet//g' /boot/grub/grub.conf
修改網卡配置文件
實例的MAC地址是在實例創建時由OpenStack分配的,因此我們要刪除/etc/sysconfig/network-scripts/ifcfg-eth0中的MAC信息。另外OpenStack通過dhcp方式給CentOS注入ip地址,請不要給鏡像配置靜態ip,可通過以下命令完成這一步操作
cat > /etc/sysconfig/network-scripts/ifcfg-eth0 <<EOF
DEVICE="eth0"
BOOTPROTO="dhcp"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
EOF
修改rc.local文件
要使實例能接受OpenStack注入的密鑰文件等信息,還要修改rc.local文件,命令如下:
cat >> /etc/rc.d/rc.local <<EOF
if [ ! -d /root/.ssh ]; then
mkdir -p /root/.ssh
chmod 700 /root/.ssh
fi
# Fetch public key using HTTP
ATTEMPTS=30
FAILED=0
while [ ! -f /root/.ssh/authorized_keys ]; do
curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /tmp/metadata-key 2>/dev/null
if [ $? -eq 0 ]; then
cat /tmp/metadata-key >> /root/.ssh/authorized_keys
chmod 0600 /root/.ssh/authorized_keys
restorecon /root/.ssh/authorized_keys
rm -f /tmp/metadata-key
echo "Successfully retrieved public key from instance metadata"
echo "*****************"
echo "AUTHORIZED KEYS"
echo "*****************"
cat /root/.ssh/authorized_keys
echo "*****************"
curl -f http://169.254.169.254/latest/meta-data/hostname > /tmp/metadata-hostname 2>/dev/null
if [ $? -eq 0 ]; then
TEMP_HOST=$(cat /tmp/metadata-hostname)
sed -i "s/^HOSTNAME=.*$/HOSTNAME=$TEMP_HOST/g" /etc/sysconfig/network
/bin/hostname $TEMP_HOST
echo "Successfully retrieved hostname from instance metadata"
echo "*****************"
echo "HOSTNAME CONFIG"
echo "*****************"
cat /etc/sysconfig/network
echo "*****************"
else
echo "Failed to retrieve hostname from instance metadata. This is a soft error so we'll continue"
fi
rm -f /tmp/metadata-hostname
else
FAILED=$(($FAILED + 1))
if [ $FAILED -ge $ATTEMPTS ]; then
echo "Failed to retrieve public key from instance metadata after $FAILED attempts, quitting"
break
fi
echo "Could not retrieve public key from instance metadata (attempt #$FAILED/$ATTEMPTS), retrying in 5 seconds..."
sleep 5
fi
done
EOF
上傳鏡像
到這裏鏡像就做好了,關閉虛擬機,通過glance命令上傳就是了
glance add name="centos63" is_public=true container_format=ovf disk_format=qcow2 < /var/lib/libvirt/images/centos63.img