声明:
本博客欢迎转载,但请保留原作者信息!
作者:姜飞
团队:华为杭州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做了什么事情,请看下一篇。

本文详细介绍了物理单板重启后通过PXE启动的过程,包括磁盘识别、TFTP获取token文件、调用ironic API等关键步骤。重点分析了init启动脚本的作用与实现过程,特别关注了如何通过脚本进行磁盘操作、获取并使用token文件,以及与iSCSI设备的交互。同时,提供了启动脚本的核心逻辑与执行流程,为深入理解PXE启动与初始化提供了技术支持。
5225

被折叠的 条评论
为什么被折叠?



