summaryrefslogtreecommitdiffstats
path: root/builder/modules.d/dnbd3-rootfs/hooks/prepare-root-partition.sh
diff options
context:
space:
mode:
authorJonathan Bauer2019-07-24 11:45:44 +0200
committerJonathan Bauer2019-07-24 11:45:44 +0200
commit9976b7469f43239a5e6a128f676c7ecd2e5686b3 (patch)
treeaa519c12d23459f883ba5d614cf0f4614f7057be /builder/modules.d/dnbd3-rootfs/hooks/prepare-root-partition.sh
parent[slx-clock] remove deprecated file (diff)
downloadsystemd-init-9976b7469f43239a5e6a128f676c7ecd2e5686b3.tar.gz
systemd-init-9976b7469f43239a5e6a128f676c7ecd2e5686b3.tar.xz
systemd-init-9976b7469f43239a5e6a128f676c7ecd2e5686b3.zip
[dnbd3-rootfs] various improvements
* use slx-tools to download the config * use slx-network module instead of systemd-networkd * remove container_unpack_xmount scripts and make it a function * and more small things I can't think of ... :)
Diffstat (limited to 'builder/modules.d/dnbd3-rootfs/hooks/prepare-root-partition.sh')
-rwxr-xr-xbuilder/modules.d/dnbd3-rootfs/hooks/prepare-root-partition.sh83
1 files changed, 49 insertions, 34 deletions
diff --git a/builder/modules.d/dnbd3-rootfs/hooks/prepare-root-partition.sh b/builder/modules.d/dnbd3-rootfs/hooks/prepare-root-partition.sh
index 2d9e059c..ca572458 100755
--- a/builder/modules.d/dnbd3-rootfs/hooks/prepare-root-partition.sh
+++ b/builder/modules.d/dnbd3-rootfs/hooks/prepare-root-partition.sh
@@ -1,49 +1,64 @@
#!/usr/bin/env bash
# region imports
+type emergency_shell > /dev/null 2>&1 || source /lib/dracut-lib.sh
+source /etc/openslx
source '/usr/lib/rebash/core.sh'
-core.import '/usr/lib/openslx/tools.sh'
core.import exceptions
-core.import utils
core.import logging
-type emergency_shell >/dev/null 2>&1 || source /lib/dracut-lib.sh
# endregion
+
+# region globals/helper
+logging.set_log_file "${SLX_LOG_FILE_PATH:-/var/log/openslx}"
+# hardcode dnbd device path
+declare -rg _dnbd3_dev="/dev/dnbd0"
+
+# all outputs are redirected to stderr, since this functions should
+# only echo the path to the unpacked container to stdout.
+container_unpack_xmount() {
+ local in_device="$1"
+ local out_path="/mnt/xmount"
+ mkdir -p "$out_path"
+ # check tools first
+ if ! hash xmount systemd-preserve-process-marker; then
+ logging.warn "Missing xmount deps, will try raw..." 1>&2
+ elif ! systemd-preserve-process-marker xmount \
+ --in qemu "$in_device" \
+ --out raw "$out_path" &>/dev/null; then
+ logging.warn "xmount call failed, assuming raw image." 1>&2
+ else
+ in_device="${out_path}/${_dnbd3_dev##*/}.dd"
+ fi
+ local loop_device="$(losetup -f)"
+ losetup "$loop_device" "$in_device" --partscan
+ udevadm settle
+ echo "$loop_device"
+}
+# endregion
+
exceptions.try
{
-source /etc/openslx
-logging.set_commands_level debug
-logging.set_level debug
-[[ "$SLX_LOG_FILE_PATH" == "" ]] && SLX_LOG_FILE_PATH=/var/log/openslx
-logging.set_log_file "$SLX_LOG_FILE_PATH"
-
# region connect dnbd3 image
-IFS_backup="$IFS"
+(
IFS=", "
-return_code=1
-for host in ${SLX_DNBD3_SERVERS}; do
+for host in ${SLX_DNBD3_SERVERS} FAIL; do
+ if [ "$host" = "FAIL" ]; then
+ emergency_shell "Failed to connect '${SLX_DNBD3_IMAGE}' "\
+ "${SLX_DNBD3_RID:+(revision: $SLX_DNBD3_RID)} "
+ "from one of '$SLX_DNBD3_SERVERS' to '$_dnbd3_dev'."
+ fi
logging.info "Trying host \"$host\"."
- if systemd-preserve-process-marker dnbd3-client --host "$host" --image \
- "${SLX_DNBD3_IMAGE}" --device "$SLX_DNBD3_DEVICE" \
- --rid "$SLX_DNBD3_RID"; then
- return_code=0
+ if systemd-preserve-process-marker dnbd3-client \
+ --host "$host" \
+ --image "${SLX_DNBD3_IMAGE}" \
+ --device "$_dnbd3_dev" \
+ ${SLX_DNBD3_RID=+--rid "$SLX_DNBD3_RID"}; then
break
fi
done
-IFS="$IFS_backup"
-
-if [[ $return_code != 0 ]]; then
- logging.warn "Failed to connect \"${SLX_DNBD3_IMAGE}\" (revision" \
- "\"$SLX_DNBD3_RID\") from one of \"$SLX_DNBD3_SERVERS\" to" \
- "\"$SLX_DNBD3_DEVICE\"."
- exit 1
-fi
+)
# endregion
# region unpack dnbd3 image with xmount
-if [ "$SLX_LOG_FILE_PATH" != "" ]; then
- read_only_device="$(container-unpack-xmount "$SLX_DNBD3_DEVICE" \
- 2>>"$SLX_LOG_FILE_PATH")"
-else
- read_only_device="$(container-unpack-xmount "$SLX_DNBD3_DEVICE")"
-fi
+read_only_device="$(container_unpack_xmount "$_dnbd3_dev")"
# Fail fast if unpacking dnbd3 image failed.
[ -z "$read_only_device" ] && exit 1
@@ -56,7 +71,7 @@ if [ -z "$SLX_SYSTEM_PARTITION_PREPARATION_SCRIPT" ]; then
read_only_partition="$read_only_device"
true
else
- read_only_partition="$(get-partitions-by-id \
+ read_only_partition="$(slx-tools dev_find_partitions \
"$read_only_device" "$SLX_SYSTEM_PARTITION_IDENTIFIER")"
fi
else
@@ -69,11 +84,11 @@ if [[ ! $? || -z "$read_only_partition" ]]; then
exit 1
fi
logging.info "Using read-only partition: $read_only_partition"
-
# endregion
-# region RW layer through slx-partitioner
-dmsetup-slx-device $read_only_partition
+# region add rw layer to dnbd3 image
+# don't be fooled to think we are done, the next part is crucial
+dmsetup-slx-device "$read_only_partition"
# endregion
}