From ba9b0250b392c4cbaa4a9f85d89e4c4a84797065 Mon Sep 17 00:00:00 2001 From: jandob Date: Thu, 7 Jan 2016 15:16:37 +0100 Subject: change hooks variable scoping; introduce /etc/openslx config --- .../hooks/pre-mount/prepare-root-partition.sh | 76 +++++++++++++++------- 1 file changed, 53 insertions(+), 23 deletions(-) (limited to 'builder/dnbd3-rootfs/hooks/pre-mount/prepare-root-partition.sh') diff --git a/builder/dnbd3-rootfs/hooks/pre-mount/prepare-root-partition.sh b/builder/dnbd3-rootfs/hooks/pre-mount/prepare-root-partition.sh index 2e62434d..4e70db35 100755 --- a/builder/dnbd3-rootfs/hooks/pre-mount/prepare-root-partition.sh +++ b/builder/dnbd3-rootfs/hooks/pre-mount/prepare-root-partition.sh @@ -1,4 +1,7 @@ +#!/usr/bin/env bash +( # subshell for variable scoping # region imports +source /lib/dracut-lib.sh source "/usr/lib/rebash/core.sh" core.import exceptions exceptions.activate @@ -8,54 +11,82 @@ logging.set_commands_log_level debug logging.set_log_level debug # endregion +SLX_SERVER_BASE="$(getargs slxbase=)" +source /etc/openslx + # region connect dnbd3 -local IFS_backup="$IFS" +IFS_backup="$IFS" IFS="," -local host +return_code=1 for host in ${SLX_DNBD3_SERVERS}; do logging.info "Trying host '$host'." if systemd-preserve-process-marker dnbd3-client --host "$host" --image \ "${SLX_SERVER_BASE#/}${SLX_DNBD3_IMAGE}" --device "$SLX_DNBD3_DEVICE" \ --rid "$SLX_DNBD3_RID" then + return_code=0 break fi done IFS="$IFS_backup" if [[ $return_code != 0 ]]; then - warn "Failed to connect '${SLX_SERVER_BASE#/}${SLX_DNBD3_IMAGE}' from" \ + logging.warn "Failed to connect '${SLX_SERVER_BASE#/}${SLX_DNBD3_IMAGE}' from" \ "one of '$SLX_DNBD3_SERVERS' to '$SLX_DNBD3_DEVICE'." - emergency_shell -n "Error in $0" - return 1 + exit 1 fi # endregion # region detect read-only partition -local read_only_device="$SLX_DNBD3_DEVICE" +read_only_device="$SLX_DNBD3_DEVICE" if ! qemu-img info --output json "$read_only_device" | grep '"format": "raw"' then read_only_device='/dev/nbd0' systemd-preserve-process-marker qemu-nbd --connect="$read_only_device" \ - "$SLX_DNBD3_DEVICE" --read-only + "$SLX_DNBD3_DEVICE" --read-only --persistent + + # XXX better way to wait for the device to be made? + i=0 + while [ ! -b "$read_only_device" ]; do + [ $i -ge 20 ] && exit 1 + if [ $UDEVVERSION -ge 143 ]; then + udevadm settle --exit-if-exists="$read_only_device" + else + sleep 0.1 + fi + i=$(($i + 1)) + done + + # NBD doesn't emit uevents when it gets connected, so kick it + echo change > /sys/block/nbd0/uevent + udevadm settle # wait for partitions TODO make nicer :) + #touch $read_only_device + #udevadm settle +else + # workaround to detect partitions on raw disks + # can be omited when the dnbd3 kernel module supports it (like the nbd + # kernel module with parameter 'max_part') + loop_device="$(losetup -f)" touch $read_only_device + losetup "$loop_device" "$read_only_device" --partscan udevadm settle + read_only_device="$loop_device" fi -local read_only_partition -if ! read_only_partition=$(utils.find_block_device \ - "$SLX_SYSTEM_PARTITION_IDENTIFIER" "$read_only_device"); then - logging.warn "Failed to find unique device with identifier" \ +while ! read_only_partition=$(utils.find_block_device \ + "$SLX_SYSTEM_PARTITION_IDENTIFIER" "$read_only_device"); do +#if ! read_only_partition=$(utils.find_block_device \ + #"$SLX_SYSTEM_PARTITION_IDENTIFIER" "$read_only_device"); then + logging.warn "Trying to find unique device with identifier" \ "'${SLX_SYSTEM_PARTITION_IDENTIFIER}'; matched devices:" \ "'${read_only_partition}'" - emergency_shell -fi + sleep 0.5 +done # endregion # region detect writable partition -local persistent_device if ! persistent_device=$(utils.find_block_device \ "$SLX_WRITABLE_DEVICE_IDENTIFIER"); then logging.warn "Failed to find unique device with identifier" \ @@ -64,22 +95,21 @@ if ! persistent_device=$(utils.find_block_device \ fi # TODO move somewhere else -#local tmp_device="$(utils.find_block_device \ +#tmp_device="$(utils.find_block_device \ #'$SLX_TMP_PARTITION_IDENTIFIER')" #if [ -n $tmp_device ]; then #mount --type auto "$tmp_device" "$NEWROOT/tmp" #fi -local persistent='N' # 'P' for persistent storage, 'N' for not persistent -local writable_device +persistent='N' # 'P' for persistent storage, 'N' for not persistent if [ -n "$persistent_device" ]; then writable_device="$persistent_device" if [ "$SLX_WRITABLE_DEVICE_PERSISTENT" = "yes" ]; then persistent='P' fi else - local ramdisk_size="$SLX_RAMDISK_SIZE" + ramdisk_size="$SLX_RAMDISK_SIZE" if [ "$ramdisk_size" = "" ]; then ramdisk_size="$(cat /proc/meminfo | awk '/MemTotal/ {print $2}')" fi @@ -97,18 +127,18 @@ fi # endregion # region combine devices with device mapper -local partition_size="$(blockdev --getsz "$read_only_partition")" -local writable_partition_name='root' +partition_size="$(blockdev --getsz "$read_only_partition")" +writable_partition_name='root' logging.info "Using read-only device: $read_only_partition" logging.info "Using writable device $writable_device, persistency: $persistent" -local chunksize='1' +chunksize='1' modprobe dm_snapshot dmsetup create "$writable_partition_name" --noudevsync --table \ "0 $partition_size snapshot $read_only_partition $writable_device $persistent $chunksize" dmsetup mknodes --noudevsync "$writable_partition_name" exceptions.deactivate -# enregion - +# endregion +) || exit $? # region vim modline # vim: set tabstop=4 shiftwidth=4 expandtab: -- cgit v1.2.3-55-g7522