Tripleo之nova-compute 和Ironic的代碼深入分析(四)

聲明:

本博客歡迎轉載,但請保留原作者信息!

作者:姜飛

團隊:華爲杭州OpenStack團隊


物理單板重啓進去PXE啓動,dhcp和tfpt獲取到當前deploy的內核和根文件系統在內存裏面啓動。啓動後運行init啓動腳本,那麼init啓動腳本是什麼樣子的。


首先,我們需要知道當前創建deploy-ironic的鏡像,使用的diskimage-build命令,參考diskimage-builder/elements/deploy-ironic這個元素,最重要的是init.d/80-deploy-ironic 這個腳本,這個腳本主要其實就是做以下幾個步驟:

1、  找到磁盤,以該磁盤啓動iSCSI設備

2、  Tftp獲取到ironic準備的token文件

3、  調用ironic的api接(POST v1/nodes/{node-id}/vendor_passthru/pass_deploy_info)

4、  啓動iSCSI設備, 開啓socket端口 10000等待通知PXE結束,停止iSCSI設備。

 

我們可以參考下tftp的pxe的config文件

default boot

label deploy
kernel /tftpboot/f02e3aae-762e-4a4e-afc2-64afb092cdc1/deploy_kernel
append initrd=/tftpboot/f02e3aae-762e-4a4e-afc2-64afb092cdc1/deploy_ramdisk rootfstype=ramfs selinux=0 disk=cciss/c0d0,sda,hda,vda iscsi_target_iqn=iqn-f02e3aae-762e-4a4e-afc2-64afb092cdc1 deployment_id=f02e3aae-762e-4a4e-afc2-64afb092cdc1 deployment_key=9ATNBQX1M8O9UQTXM8IEHJKX8J6QYV5H ironic_api_url=http://192.0.2.1:6385 troubleshoot=0 text nofb nomodeset vga=normal
ipappend 3

label boot
kernel /tftpboot/f02e3aae-762e-4a4e-afc2-64afb092cdc1/kernel
append initrd=/tftpboot/f02e3aae-762e-4a4e-afc2-64afb092cdc1/ramdisk root=UUID=66d0a496-1cbe-4375-8f2a-6a344a811922 ro text nofb nomodeset vga=normalroot@ubuntu:/tftpboot/pxelinux.cfg

那麼80-deploy-ironic的腳本其實很簡單

readonly IRONIC_API_URL=$(get_kernel_parameter ironic_api_url)

if [ -z "$ISCSI_TARGET_IQN" ]; then
  err_msg "iscsi_target_iqn is not defined"
  troubleshoot
fi

t=0
while ! target_disk=$(find_disk "$DISK"); do  # 獲取當前linux的本地硬盤
  if [ $t -eq 10 ]; then
    break
  fi
  t=$(($t + 1))
  sleep 1
done

if [ -z "$target_disk" ]; then
  err_msg "Could not find disk to use."
  troubleshoot
fi

echo "start iSCSI target on $target_disk"
start_iscsi_target "$ISCSI_TARGET_IQN" "$target_disk" ALL  #開啓iSCSI
if [ $? -ne 0 ]; then
  err_msg "Failed to start iscsi target."
  troubleshoot
fi
#獲取到相關的token文件,從tftp服務器上獲取,token文件在ironic在prepare階段就生成好的。
if [ "$BOOT_METHOD" = "$VMEDIA_BOOT_TAG" ]; then
  TOKEN_FILE="$VMEDIA_DIR/token"
  if [ -f "$TOKEN_FILE" ]; then
    TOKEN_HEADER="-H 'X-Auth-Token: $(cat $TOKEN_FILE)'"
  else TOKEN_HEADER=""
  fi
else
  TOKEN_FILE=token-$DEPLOYMENT_ID

  # Allow multiple versions of the tftp client
  if tftp -r $TOKEN_FILE -g $BOOT_SERVER || tftp $BOOT_SERVER -c get $TOKEN_FILE; then
      TOKEN_HEADER="-H 'X-Auth-Token: $(cat $TOKEN_FILE)'"
  else
      TOKEN_HEADER=""
  fi
fi

DATA="'{\"address\":\"$BOOT_IP_ADDRESS\",\"key\":\"$DEPLOYMENT_KEY\",\"iqn\":\"$ISCSI_TARGET_IQN\",\"error\":\"$FIRST_ERR_MSG\"}'"

#下面就是POST node的 /vendor_passthru/pass_deploy_info請求了
echo "request Ironic API to deploy image"
eval curl -i -X POST \
     "$TOKEN_HEADER" \
     "-H 'Accept: application/json'" \
     "-H 'Content-Type: application/json'" \
     -d "$DATA" \
     $IRONIC_API_URL/nodes/$DEPLOYMENT_ID/vendor_passthru/pass_deploy_info

echo "waiting for notice of complete"
nc -l -p 10000

echo "stop iSCSI target on $target_disk"
#停止iSCSI設備
stop_iscsi_target

那接下來我們來看下POST v1/nodes/{node-id}/vendor_passthru/pass_deploy_info做了什麼事情,請看下一篇。


發佈了51 篇原創文章 · 獲贊 48 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章