summaryrefslogtreecommitdiffstats
path: root/testModule/scripts/prepare-disks
diff options
context:
space:
mode:
authorJonathan Bauer2015-05-07 17:29:03 +0200
committerJonathan Bauer2015-05-07 17:29:03 +0200
commit9f715701236bdc418a174828cccf27a8ab63874c (patch)
tree734a657d86ff99d4768c141724e5a3b8f631bec9 /testModule/scripts/prepare-disks
parentminor - flag names ... (diff)
downloadsystemd-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-xtestModule/scripts/prepare-disks145
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
#