summaryrefslogtreecommitdiffstats
path: root/hooks/resume
diff options
context:
space:
mode:
Diffstat (limited to 'hooks/resume')
-rwxr-xr-xhooks/resume112
1 files changed, 112 insertions, 0 deletions
diff --git a/hooks/resume b/hooks/resume
new file mode 100755
index 0000000..0cd78fe
--- /dev/null
+++ b/hooks/resume
@@ -0,0 +1,112 @@
+#!/bin/sh
+
+PREREQ=""
+
+prereqs()
+{
+ echo "$PREREQ"
+}
+
+case $1 in
+# get pre-requisites
+prereqs)
+ prereqs
+ exit 0
+ ;;
+esac
+
+. /usr/share/initramfs-tools/scripts/functions
+
+# First check if a location is set and is a valid swap partition.
+# If so, the config file will be copied in and there is nothing to do.
+if [ -n "$RESUME" ] && [ "$RESUME" != auto ]; then
+ if [ "$RESUME" = none ]; then
+ exit 0
+ fi
+ if resume_dev_node="$(resolve_device "$RESUME")" && \
+ blkid -p -n swap "$resume_dev_node" >/dev/null 2>&1; then
+ exit 0
+ fi
+
+ echo >&2 "W: initramfs-tools configuration sets RESUME=$RESUME"
+ echo >&2 "W: but no matching swap device is available."
+fi
+
+# If we were not explicitly requested to select a device, or the -v
+# option is used, report that we are doing so
+report_auto()
+{
+ test "${verbose?}" != y && test "$RESUME" = auto || echo "I: $*"
+}
+
+# Report in excruciating detail if the -v option is used
+report_verbose()
+{
+ test "${verbose?}" != y || echo "I: $*"
+}
+
+report_verbose "Configuration sets RESUME=$RESUME"
+
+# Try to autodetect the RESUME partition, using biggest swap device that
+# is not ephemeral. We need to be able to read the listed swap partitions.
+resume_auto=
+if ! ischroot && [ -r /proc/swaps ]; then
+ # shellcheck disable=SC2013
+ for resume_auto in $(grep ^/dev/ /proc/swaps | sort -rnk3 | cut -d " " -f 1); do
+ report_verbose "Checking swap device $resume_auto"
+ ephemeral=false
+ dm_name="$(dmsetup info -c --noheadings -o name "$resume_auto" 2>/dev/null)"
+
+ # dm-crypt is ephemeral if the key file is /dev/urandom
+ if [ -n "$dm_name" ] && [ -e /etc/crypttab ]; then
+ report_verbose "$resume_auto has device-mapper name $dm_name; checking crypttab"
+ # shellcheck disable=SC2034
+ while read -r cryptdev srcdev keyfile junk; do
+ report_verbose "Found cryptdev=$cryptdev keyfile=$keyfile"
+ if [ "$cryptdev" = "$dm_name" ] && [ "$keyfile" = /dev/urandom ]; then
+ report_verbose "Rejecting $resume_auto since it has no permanent key"
+ ephemeral=true
+ fi
+ done < /etc/crypttab
+ fi
+
+ # zram is ephemeral
+ case "$resume_auto" in
+ /dev/zram*)
+ report_verbose "Rejecting $resume_auto since it is zram"
+ ephemeral=true
+ ;;
+ esac
+
+ $ephemeral || break
+ done
+
+ if $ephemeral; then
+ resume_auto=
+ fi
+ if [ -n "$resume_auto" ]; then
+ if [ -n "$dm_name" ]; then
+ resume_auto_canon="/dev/mapper/$dm_name"
+ elif UUID=$(blkid -s UUID -o value "$resume_auto"); then
+ resume_auto_canon="UUID=$UUID"
+ else
+ resume_auto_canon=
+ fi
+ report_auto "The initramfs will attempt to resume from $resume_auto"
+ if [ -n "$resume_auto_canon" ]; then
+ report_auto "($resume_auto_canon)"
+ resume_auto="$resume_auto_canon"
+ fi
+ report_auto "Set the RESUME variable to override this."
+ fi
+fi
+
+# Write selected resume device to intramfs conf.d
+if [ "$RESUME" = auto ] || [ -n "$resume_auto" ]; then
+ # If we were explicitly requested to select a device, and we failed,
+ # report that
+ if [ -z "$resume_auto" ]; then
+ echo >&2 "W: initramfs-tools failed to select a resume device"
+ fi
+ echo "RESUME=${resume_auto}" > "${DESTDIR}/conf/conf.d/zz-resume-auto"
+fi