13c906059b
This commit adds support for uefi localboot in deploy-ironic element. The change is to mount the efi system partition (created by Ironic) in /boot/efi. The corresponding Ironic change is I00ac31da325676ea4ea1ac4185f5ac3a52c5809a Implements: blueprint local-boot-support-with-partition-images Change-Id: Idf7ac5987e14e1d31311834196ca7283deec15c6
133 lines
3.9 KiB
Plaintext
133 lines
3.9 KiB
Plaintext
readonly IRONIC_API_URL=$(get_kernel_parameter ironic_api_url)
|
|
readonly IRONIC_BOOT_OPTION=$(get_kernel_parameter boot_option)
|
|
readonly IRONIC_BOOT_MODE=$(get_kernel_parameter boot_mode)
|
|
|
|
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
|
|
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
|
|
if [ $? -ne 0 ]; then
|
|
err_msg "Failed to start iscsi target."
|
|
troubleshoot
|
|
fi
|
|
|
|
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\"}'"
|
|
|
|
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"
|
|
|
|
stop_iscsi_target
|
|
|
|
# If localboot is set, install a bootloader
|
|
if [ "$IRONIC_BOOT_OPTION" = "local" ]; then
|
|
echo "Installing bootloader"
|
|
|
|
# We need to run partprobe to ensure all partitions are visible
|
|
partprobe $target_disk
|
|
|
|
# root partition is always the last partition of the disk
|
|
readonly root_part=$(ls $target_disk* | tr " " "\n" | tail -n1)
|
|
readonly root_part_mount=/mnt/rootfs
|
|
|
|
mkdir -p $root_part_mount
|
|
|
|
mount $root_part $root_part_mount
|
|
mount -o bind /dev $root_part_mount/dev
|
|
mount -o bind /sys $root_part_mount/sys
|
|
mount -o bind /proc $root_part_mount/proc
|
|
|
|
# If boot mode is uefi, then mount the system partition in /boot/efi.
|
|
# Grub expects the efi system partition to be mounted here.
|
|
if [ "$IRONIC_BOOT_MODE" = "uefi" ]; then
|
|
|
|
# efi system partition is labelled as "efi-part" by Ironic.
|
|
# lsblk output looks like this:
|
|
# NAME="sda1" LABEL="efi-part"
|
|
readonly efi_system_part=$(lsblk -Pio NAME,LABEL $target_disk | \
|
|
awk -F'"' '/"efi-part"/{print $2}')
|
|
readonly efi_system_part_dev_file="/dev/$efi_system_part"
|
|
readonly efi_system_part_mount="$root_part_mount/boot/efi"
|
|
mkdir -p $efi_system_part_mount
|
|
mount $efi_system_part_dev_file $efi_system_part_mount
|
|
fi
|
|
|
|
# TODO(lucasagomes): Add extlinux as a fallback
|
|
# Find grub version
|
|
V=
|
|
if [ -x $root_part_mount/usr/sbin/grub2-install ]; then
|
|
V=2
|
|
fi
|
|
|
|
# Install grub
|
|
ret=1
|
|
if chroot $root_part_mount /bin/bash -c "/usr/sbin/grub$V-install ${target_disk}"; then
|
|
echo "Generating the grub configuration file"
|
|
|
|
# tell GRUB2 to preload its "lvm" module to gain LVM booting on direct-attached disks
|
|
if [ "$V" = "2" ]; then
|
|
echo "GRUB_PRELOAD_MODULES=lvm" >> $root_part_mount/etc/default/grub
|
|
fi
|
|
|
|
chroot $root_part_mount /bin/bash -c "/usr/sbin/grub$V-mkconfig -o /boot/grub$V/grub.cfg"
|
|
ret=$?
|
|
fi
|
|
|
|
# If we had mounted efi system partition, umount it.
|
|
if [ "$IRONIC_BOOT_MODE" = "uefi" ]; then
|
|
umount $efi_system_part_mount
|
|
fi
|
|
|
|
umount $root_part_mount/dev
|
|
umount $root_part_mount/sys
|
|
umount $root_part_mount/proc
|
|
umount $root_part_mount
|
|
|
|
if [ $ret -eq 0 ]; then
|
|
echo "Bootloader successfully installed"
|
|
fi
|
|
fi
|