====== Hibernation with LVM, LUKS and a Swapfile ======
With this How To you can use a swap file instead a swap partition as described [[http://slackware.osuosl.org/slackware-14.0/README_CRYPT.TXT|here]].
First create a swap file (you can choose another name and / or size if you want):
dd if=/dev/zero of=/swapfile bs=1M count=4096
mkswap /swapfile
Activate the swap:
swapon /swapfile
Check if the swap file is recognized by the system:
cat /proc/swaps
Filename Type Size Used Priority
/swapfile file 4194300 0 -1
Add to the fstab
/swapfile none swap defaults 0 0
For suspend/resume you need to append 2 kernel parameter in /etc/lilo.conf resume and resume_offset.
''resume'' is the partition where the swap file is located (e.g /dev/sda, /dev/cryptslack/root)
''resume_offset'' is the beginning of the swap file on the resume partition, you can get the offset with:
sudo /sbin/filefrag -v /swapfile | head -n -3 | tail -n 1 | awk ' {print $3 }'
Your ''lilo'' entry should look like this:
# Append any additional kernel parameters:
append="vt.default_utf8=1 resume=/dev/cryptslack/root resume_offset=1134591"
You need to patch the initrd to recognize the resume_offset parameter
--- init.orig 2012-12-01 14:03:39.344538490 +0100
+++ init 2012-12-01 14:01:12.526373970 +0100
@@ -69,6 +69,7 @@
LUKSDEV=$(cat /luksdev)
LUKSKEY=$(cat /lukskey)
RESUMEDEV=$(cat /resumedev)
+RESOFFSET=$(cat /resoffset)
WAIT=$(cat /wait-for-root)
KEYMAP=$(cat /keymap)
INIT=/sbin/init
@@ -269,18 +270,35 @@
umount -l /mountkey
rmdir /mountkey 2>/dev/null
fi
-
- # Resume state from swap
- if [ "$RESUMEDEV" != "" ]; then
- if ls -l $RESUMEDEV | grep -q "^l" ; then
- #RESUMEDEV=$(ls -l $RESUMEDEV | awk '{ print $NF }')
- RESUMEDEV=$(readlink -f $RESUMEDEV)
- fi
- echo "Trying to resume from $RESUMEDEV"
- RESMAJMIN=$(ls -l $RESUMEDEV | tr , : | awk '{ print $5$6 }')
- echo $RESMAJMIN > /sys/power/resume
- fi
-
+
+if [ "$RESUMEDEV" != "" ]; then
+ # be lvm aware
+ RESUMEDEV=$(readlink -f ${RESUMEDEV} | awk -F '/' '{ print $3 }')
+ if [ -r "/sys/class/block/${RESUMEDEV}/dev" ] ; then
+ # try sysfs
+ read RESMAJMIN < "/sys/class/block/${RESUMEDEV}/dev"
+ elif [ -r "/proc/partitions" ] ; then
+ # otherwise run through /proc/partitions
+ while read m n b d jnk ; do
+ if [ "$d" = "${RESUMEDEV}" ] ; then
+ RESMAJMIN="$m:$n"
+ break
+ fi
+ done < "/proc/partitions"
+ fi
+ if [ -z "${RESMAJMIN}" ] ; then
+ # Device does not exist (not found in /proc/partitions)
+ exit 99
+ fi
+
+ if [ -n "${RESOFFSET}" ]; then
+ echo "Try resume from ${RESMAJMIN}:${RESOFFSET}"
+ echo "${RESMAJMIN}:${RESOFFSET}" > /sys/power/resume
+ else
+ echo "${RESMAJMIN}" > /sys/power/resume
+ fi
+fi
+
mkdir patched_initrd
cd patched_initrd
cp -r /boot/initrd-tree .
echo "1134591" > resoffset
patch < init-swapfile.patch
After successful patching, pack the initrd to ''/boot/initrd-swapfile.gz'':
find . -print0 | cpio -ov -0 --format=newc | gzip -9 > /boot/initrd-swapfile.gz
I recommend to test this initrd first with another boot entry
image = /boot/vmlinuz
initrd = /boot/initrd-swapfile.gz
root = /dev/cryptslack/root
label = "Linux Swapfile"
read-only
Then you need to run lilo to save the changes
lilo
After a reboot you can suspend to your swap file as with your swap partition
You need the reboot, suspend also uses resume_offset to find the swap file
====== Sources ======
* [[https://wiki.archlinux.org/index.php/Swap]]
* [[https://answers.launchpad.net/ubuntu/+source/initramfs-tools/+question/193862]]
* Originally written by [[wiki:user:fl0]]
{{tag>howtos,swapfile,hibernation,suspend}}