diff --git a/Dockerfile b/Dockerfile index 9cf9d99d6..c9d671a85 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ RUN echo 'APT::Default-Release "jessie";' > /etc/apt/apt.conf.d/10default && \ # image on disk RUN apt-get update && \ apt-get -y upgrade && \ - apt-get install -y --no-install-recommends python2.7 python2.7-dev \ + apt-get install -y --no-install-recommends gdisk python2.7 python2.7-dev \ python-pip qemu-utils parted hdparm util-linux genisoimage git gcc \ bash coreutils tgt dmidecode ipmitool && \ apt-get --only-upgrade -t testing install -y qemu-utils diff --git a/ironic_python_agent/shell/copy_configdrive_to_disk.sh b/ironic_python_agent/shell/copy_configdrive_to_disk.sh index 1095a6d02..8b74e29de 100755 --- a/ironic_python_agent/shell/copy_configdrive_to_disk.sh +++ b/ironic_python_agent/shell/copy_configdrive_to_disk.sh @@ -35,6 +35,8 @@ usage() { exit 1 } +MAX_DISK_PARTITIONS=128 + CONFIGDRIVE="$1" DEVICE="$2" @@ -57,13 +59,41 @@ if [[ $? == 0 ]]; then log "Existing configdrive found on ${DEVICE} at ${EXISTING_PARTITION}" ISO_PARTITION=$EXISTING_PARTITION else - # Create small partition at the end of the device - log "Adding configdrive partition to $DEVICE" - parted -a optimal -s -- $DEVICE mkpart primary ext2 -64MiB -0 || fail "creating configdrive on ${DEVICE}" - # Find partition we just created - # Dump all partitions, ignore empty ones, then get the last partition ID - ISO_PARTITION=`sfdisk --dump $DEVICE | grep -v ' 0,' | tail -n1 | awk '{print $1}'` || fail "finding ISO partition created on ${DEVICE}" + # Check if it is GPT partition and needs to be re-sized + partprobe $DEVICE print 2>&1 | grep "fix the GPT to use all of the space" + if [[ $? == 0 ]]; then + log "Fixing GPT to use all of the space on device $DEVICE" + sgdisk -e $DEVICE || fail "move backup GPT data structures to the end of ${DEVICE}" + + # Need to create new partition for config drive + # Not all images have partion numbers in a sequential numbers. There are holes. + # These holes get filled up when a new partition is created. + TEMP_DIR="$(mktemp -d)" + EXISTING_PARTITION_LIST=$TEMP_DIR/existing_partitions + UPDATED_PARTITION_LIST=$TEMP_DIR/updated_partitions + + gdisk -l $DEVICE | grep -A$MAX_DISK_PARTITIONS "Number Start" | grep -v "Number Start" > $EXISTING_PARTITION_LIST + + # Create small partition at the end of the device + log "Adding configdrive partition to $DEVICE" + sgdisk -n 0:-64MB:0 $DEVICE || fail "creating configdrive on ${DEVICE}" + + gdisk -l $DEVICE | grep -A$MAX_DISK_PARTITIONS "Number Start" | grep -v "Number Start" > $UPDATED_PARTITION_LIST + + CONFIG_PARTITION_ID=`diff $EXISTING_PARTITION_LIST $UPDATED_PARTITION_LIST | tail -n1 |awk '{print $2}'` + ISO_PARTITION="${DEVICE}${CONFIG_PARTITION_ID}" + else + log "Working on MBR only device $DEVICE" + + # Create small partition at the end of the device + log "Adding configdrive partition to $DEVICE" + parted -a optimal -s -- $DEVICE mkpart primary ext2 -64MiB -0 || fail "creating configdrive on ${DEVICE}" + + # Find partition we just created + # Dump all partitions, ignore empty ones, then get the last partition ID + ISO_PARTITION=`sfdisk --dump $DEVICE | grep -v ' 0,' | tail -n1 | awk '{print $1}'` || fail "finding ISO partition created on ${DEVICE}" + fi fi # This writes the ISO image to the config drive.