blob: 2e62434d744180ba88cf03936a4dbe739afd008a (
plain) (
tree)
|
|
# region imports
source "/usr/lib/rebash/core.sh"
core.import exceptions
exceptions.activate
core.import utils
core.import logging
logging.set_commands_log_level debug
logging.set_log_level debug
# endregion
# region connect dnbd3
local IFS_backup="$IFS"
IFS=","
local host
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
break
fi
done
IFS="$IFS_backup"
if [[ $return_code != 0 ]]; then
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
fi
# endregion
# region detect read-only partition
local 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
# wait for partitions TODO make nicer :)
touch $read_only_device
udevadm settle
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" \
"'${SLX_SYSTEM_PARTITION_IDENTIFIER}'; matched devices:" \
"'${read_only_partition}'"
emergency_shell
fi
# 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" \
"'${SLX_WRITABLE_DEVICE_IDENTIFIER}'; matched devices:" \
"'${persistent_device}'"
fi
# TODO move somewhere else
#local 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
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"
if [ "$ramdisk_size" = "" ]; then
ramdisk_size="$(cat /proc/meminfo | awk '/MemTotal/ {print $2}')"
fi
modprobe brd max_part=1 rd_size="$ramdisk_size"
writable_device='/dev/ram0'
persistent='N'
fi
# persistent storage on a filesystem (e.g. usb stick)
# writable_device="$(losetup -f)"
#dd if=/dev/zero of=persistent_storage.img bs=1k count=1000
#losetup "$writable_device" persistent_storage.img
#persistent='P'
# endregion
# region combine devices with device mapper
local partition_size="$(blockdev --getsz "$read_only_partition")"
local 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'
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
# region vim modline
# vim: set tabstop=4 shiftwidth=4 expandtab:
# vim: foldmethod=marker foldmarker=region,endregion:
# endregion
|