diff options
author | Jonathan Bauer | 2015-05-07 17:29:03 +0200 |
---|---|---|
committer | Jonathan Bauer | 2015-05-07 17:29:03 +0200 |
commit | 9f715701236bdc418a174828cccf27a8ab63874c (patch) | |
tree | 734a657d86ff99d4768c141724e5a3b8f631bec9 /testModule/scripts/prepare-disks | |
parent | minor - flag names ... (diff) | |
download | systemd-init-9f715701236bdc418a174828cccf27a8ab63874c.tar.gz systemd-init-9f715701236bdc418a174828cccf27a8ab63874c.tar.xz systemd-init-9f715701236bdc418a174828cccf27a8ab63874c.zip |
prepare-disk: check state of disk detection when an instance sees another
Diffstat (limited to 'testModule/scripts/prepare-disks')
-rwxr-xr-x | testModule/scripts/prepare-disks | 145 |
1 files changed, 123 insertions, 22 deletions
diff --git a/testModule/scripts/prepare-disks b/testModule/scripts/prepare-disks index 2e7dd673..1992a262 100755 --- a/testModule/scripts/prepare-disks +++ b/testModule/scripts/prepare-disks @@ -3,7 +3,15 @@ # GLOBALS # -declare -rg FLAG="/tmp/openslx.disk" +# flag file containing pids of running instances for concurrency checks +declare -rg OPENSLX_DISK_FLAG="/tmp/openslx.disk" +# file that will contain the name of the device used for the /tmp partition +# - label 'OPENSLX_TMP' in GPT / type '0x44' in MBR +declare -rg OPENSLX_TMP_MARKER="/tmp/openslx.disk.tmp" +# file that will contain the name of the device used for storing qcow2 +# - label 'OPENSLX_SYS' in GPT / type '0x46' in MBR +declare -rg OPENSLX_SYS_MARKER="/tmp/openslx.disk.sys" +# mount point for system partition declare -rg OPENSLX_SYS_MOUNT="/opt/openslx/system" # @@ -17,8 +25,7 @@ declare -rg OPENSLX_SYS_MOUNT="/opt/openslx/system" # Usage: mount_sys_part <path_to_sys_partition> mount_sys_part() { if [ ! -b "$1" ]; then - warn "'$1' is not a block device?" - echo "!block: $1" >> /tmp/openslx.disk.log + warn "Refusing to mount '$1' as its not a block device!" return 1 fi @@ -26,13 +33,42 @@ mount_sys_part() { mkdir -p ${OPENSLX_SYS_MOUNT} if ! mount -t auto "${OPENSLX_SYS_DEVICE}" "${OPENSLX_SYS_MOUNT}"; then warn "Mounting '${OPENSLX_SYS_DEVICE}' to '${OPENSLX_SYS_MOUNT}' failed." - echo "mount phail" >> /tmp/openslx.disk.log return 1 fi return 0 } # +# generic helper to format the given partition with the given filesystem or +# from the prefdefined list of xfs, ext4, ... +# Usage: format_disk <dev> <fs> +# e.g. format_disk /dev/sda1 xfs +format_disk () { + local TARGET_DEVICE="$1" + local fslist="xfs ext4" + # if we have a second arguments, its the filesystem of choice + local fs + [ $# -ge 2 ] && fslist="$2" + for fs in $fslist ; do + unset found + local MKFS="$(busybox which mkfs.$fs)" + if [ -n $MKFS ]; then + found=yes + case "mkfs.$fs" in + mkfs.xfs) fopt="-fq" ;; + mkfs.ext4) fopt="-Fq" ;; + esac + info "Formatting $TARGET_DEVICE as $fs" + return $(${MKFS} ${fopt} "${TARGET_DEVICE}") + fi + [ -n "$found" ] && break + done + # still here? then we didn't find a proper formatter... + warn "Could not format $PART_DEV as $fs." + return 1 +} + +# # END FUNCTION DEFINITIONS ############################################################################### @@ -45,51 +81,116 @@ command -v warn >/dev/null || . /lib/dracut-lib.sh # let check the arguments if [ "$#" -ne 2 ]; then warn "'$0' need 2 arguments: '$0 [OPENSLX_SYS|OPENSLX_TMP] <dev_path>'" - echo "Not enough args!" >> /tmp/openslx.disk.log exit 1 fi # $1 sane? if [ "x$1" != "xOPENSLX_SYS" ] && [ "x$1" != "xOPENSLX_TMP" ]; then - warn "First arg needs to be either 'OPENSLX_SYS' or 'OPENSLX_TMP'." - warn "Given: $1" - echo "OPENSLX? $1" >> /tmp/openslx.disk.log + warn "First arg needs to be either 'OPENSLX_SYS' or 'OPENSLX_TMP', given: $1" exit 1 fi # $2 sane? if [ ! -b "/dev/$2" ]; then warn "Second arg appears not to be a block device!" - echo "block? $2" >> /tmp/openslx.disk.log exit 1 fi -# ok all seems well +# ok all seems well, set the arguments PART_TYPE="$1" PART_DEV="/dev/$2" +unset OPENSLX_TMP_DEVICE +unset OPENSLX_SYS_DEVICE + # lets check if we are already running -INSTANCES="$(grep "$PART_TYPE" "$FLAG" | busybox wc -l)" +INSTANCES="$(grep "$PART_TYPE" "$OPENSLX_DISK_FLAG" | busybox wc -l)" if [ "$INSTANCES" -ge 1 ]; then - # uhoh we are not alone! - warn "'$0' already running for $PART_TYPE ... ignoring." - echo "already running for $PART_TYPE" >> /tmp/openslx.disk.log - exit 1 + # uhoh we are not alone! Need to check + # if the other instance actually did its job + warn "'$0' already running for $PART_TYPE ... checking state." + # here two/three cases depending on which PART_TYPE we are + # currently processing. + for timeout in 1 1 2; do + # always give the other instance time to finish + # but only check 3 times overall + sleep $timeout + case "$PART_TYPE" in + OPENSLX_TMP) + # was the tmp partition marker created with a device? + [ -f "${OPENSLX_TMP_MARKER}" ] || continue + # it was, is it a valid block device? + OPENSLX_TMP_DEVICE="$(cat ${OPENSLX_TMP_MARKER})" + [ -b $OPENSLX_TMP_DEVICE ] || continue + # its detected, its a block device and as mounting is + # done later, we can not check for more at this point + info "Valid state for $OPENSLX_TMP_DEVICE" + exit 0 + ;; + OPENSLX_SYS) + # was the system partition marker created with a device? + [ -f "${OPENSLX_SYS_MARKER}" ] || continue + # it was, is it a valid block device? + OPENSLX_SYS_DEVICE="$(cat ${OPENSLX_SYS_MARKER})" + [ -b $OPENSLX_SYS_DEVICE ] || continue + # its detected, its a block device, is it mounted? + if mount | grep -qE "^$OPENSLX_SYS_DEVICE\ on $OPENSLX_SYS_MOUNT"; then + info "Valid state for $OPENSLX_SYS_DEVICE" + exit 0 + fi + # if its not mounted, we want to keep on, so no exit! + ;; + *) + # weird case which should never happen + warn "If you see this, then $0 was called with a bad PART_TYPE: $@" + continue + ;; + esac + done + warn "'$PART_TYPE' was found but not device was associated to it!" fi -# now comes the funny part. We write our pid to $FLAG in order to make sure +# We write our pid to $OPENSLX_DISK_FLAG in order to make sure # we are the only instance of this script running. -echo "$PART_TYPE.$$" >> "$FLAG" +info "Processing: $PART_TYPE -> $PART_DEV ($$)" +echo "$PART_TYPE.$$" >> "$OPENSLX_DISK_FLAG" # if we are still here, then we can go on and process the partition -echo "Processing: $PART_TYPE -> $PART_DEV" >> /tmp/openslx.disk.log - if [ "$PART_TYPE" = "OPENSLX_TMP" ]; then - # mark it for later mounting! - echo "$PART_DEV" > /tmp/openslx.disk.tmp + # always format /tmp partition + if ! format_disk "${PART_DEV}" xfs; then + # error while formatting, cleanup + warn "Error formatting $PART_DEV ... removing $$" + sed -i "/^${PART_TYPE}\.$$/d" "${OPENSLX_DISK_FLAG}" + exit 1 + fi + info "Using '$PART_DEV' as '$PART_TYPE'" + # mark it for later: in pre-pivot we will check this file + # and mount it as $NEWROOT/tmp + echo "$PART_DEV" > "$OPENSLX_TMP_MARKER" + # remove our pid from OPENSLX_DISK_FLAG + sed -i "/^${PART_TYPE}\.$$/d" "${OPENSLX_DISK_FLAG}" exit 0 fi if [ "$PART_TYPE" = "OPENSLX_SYS" ]; then + # TODO make the formatting of the system partition configurable + if ! format_disk "${PART_DEV}" xfs; then + # error while formatting, cleanup + warn "Error formatting $PART_DEV ... removing $$" + sed -i "/^${PART_TYPE}\.$$/d" "${OPENSLX_DISK_FLAG}" + exit 1 + fi + # mark it # mount it now, since qemu-nbd needs it asap! - exit $(mount_sys_part "$PART_DEV") + if mount_sys_part "$PART_DEV"; then + # mount worked, mark it as done + info "Using '$PART_DEV' as '$PART_TYPE'" + echo "$PART_DEV" > "$OPENSLX_SYS_MARKER" + sed -i "/^${PART_TYPE}\.$$/d" "${OPENSLX_DISK_FLAG}" + exit 0 + else + warn "'mount_sys_part' failed in $0" + sed -i "/^${PART_TYPE}\.$$/d" "${OPENSLX_DISK_FLAG}" + exit 1 + fi fi # |