diff --git a/nixos/modules/system/boot/stage-1-init.sh b/nixos/modules/system/boot/stage-1-init.sh
index 73fc6ce543c..f14f105ef23 100644
--- a/nixos/modules/system/boot/stage-1-init.sh
+++ b/nixos/modules/system/boot/stage-1-init.sh
@@ -168,9 +168,24 @@ if test -e /sys/power/tuxonice/resume; then
fi
fi
-if test -n "@resumeDevice@" -a -e /sys/power/resume -a -e /sys/power/disk; then
- echo "@resumeDevice@" > /sys/power/resume 2> /dev/null || echo "failed to resume..."
- echo shutdown > /sys/power/disk
+if test -e /sys/power/resume -a -e /sys/power/disk; then
+ if test -n "@resumeDevice@"; then
+ resumeDev="@resumeDevice@"
+ else
+ for sd in @resumeDevices@; do
+ # Try to detect resume device. According to Ubuntu bug:
+ # https://bugs.launchpad.net/ubuntu/+source/pm-utils/+bug/923326/comments/1
+ # When there are multiple swap devices, we can't know where will hibernate
+ # image reside. We can check all of them for swsuspend blkid.
+ if [ "$(udevadm info -q property "$sd" | sed -n 's/^ID_FS_TYPE=//p')" = "swsuspend" ]; then
+ resumeDev="$sd"
+ break
+ fi
+ done
+ fi
+ if test -n "$resumeDev"; then
+ echo "$resumeDev" > /sys/power/resume 2> /dev/null || echo "failed to resume..."
+ fi
fi
diff --git a/nixos/modules/system/boot/stage-1.nix b/nixos/modules/system/boot/stage-1.nix
index 6977880fa28..1ec11e70e84 100644
--- a/nixos/modules/system/boot/stage-1.nix
+++ b/nixos/modules/system/boot/stage-1.nix
@@ -181,6 +181,9 @@ let
inherit (config.boot.initrd) checkJournalingFS
preLVMCommands postDeviceCommands postMountCommands kernelModules;
+ resumeDevices = map (sd: if sd ? device then sd.device else "/dev/disk/by-label/${sd.label}")
+ (filter (sd: sd ? label || hasPrefix "/dev/" sd.device) config.swapDevices);
+
fsInfo =
let f = fs: [ fs.mountPoint (if fs.device != null then fs.device else "/dev/disk/by-label/${fs.label}") fs.fsType fs.options ];
in pkgs.writeText "initrd-fsinfo" (concatStringsSep "\n" (concatMap f fileSystems));
@@ -220,13 +223,14 @@ in
options = {
boot.resumeDevice = mkOption {
- type = types.nullOr types.str;
- default = null;
- example = "8:2";
+ type = types.str;
+ default = "";
+ example = "/dev/sda3";
description = ''
- Device for manual resume attempt during boot, specified using
- the device's major and minor number as
- major:minor.
+ Device for manual resume attempt during boot. This should be used primarily
+ if you want to resume from file. Specify here the device where the file
+ resides. You should also use boot.kernelParams to specify
+ resume_offset.
'';
};