I decided not to clutter my partitioning scheme anymore with a swap partition so from now on I’m using a swap file instead. This shows how to do use a create and use swap file during installation.
Create the Swap File
Boot the install disk and load Linux (for Ubuntu use the ‘Try Ubuntu’ to get to a functioning environment). Partition now (if required, GParted recommended) as it is generally easier than using the installer partitioner. When partitioning is done open the terminal so the swap file can be created.
You’ll need the kernel-defined root partition name (if you don’t already know it):
sudo fdisk -l | grep ^/dev
To simplify tasks define the root partition as a variable. For example, if your root partition is sda2:
Create the mount point and mount the partition:
sudo mkdir /mnt/$root_part && sudo mount /dev/$root_part /mnt/$root_part
Create the swap file (this is created before doing the install so it's at the beginning of the partition) by doing:
fallocate -l 1G /mnt/$root_part/swapfile # G = Gigabyte, M = Megabyte chmod 600 /mnt/$root_part/swapfile mkswap /mnt/$root_part/swapfile
Unmount, then install your system:
Install your System
Install as normal. With the installer, define the partition(s) to the desired mount point (for example, sda2 to be / (root), sda3 to be /home?,...).
List the Swap File
After the install has completed, the swap file information will need to be listed in the static filesystem configuration file (fstab).
To do this, the partition will likely need to be mounted again:
sudo mount /dev/$root_part /mnt/$root_part
Add the swap file to root partition fstab file using the editor of choice (for example: gksudo gedit /mnt/$root_part/etc/fstab) and adding:
/swapfile none swap defaults 0 0
Define the Kernel Options
After the install has completed, the swap file location will need to be defined as a kernel option to the bootloader.
Change apparent root (to be able to update the bootloader later):
for i in /dev /dev/pts /proc /sys; do sudo mount -B $i /mnt$root_part$i; done chroot /bin/bash /mnt/$root_part
Get root parition UUID (partition Unique IDentifier):
blkid | grep /dev/STORAGE-DEVICE-ROOT-PARTITION
Get the swap file first block physical location on the partition by running the command (the value needed is given on the first row of the 'physical' column):
filefrag -v /swapfile
The bootloader will need the kernel options defining the swap file partition UUID and first block physical location of the swap file (resume_offset) in this form:
These will need to be added to the configuration file. For the original GRUB (GRUB Legacy), edit /boot/grub/menu.lst and add to the kernel line the above kernel options. For GRUB2, edit /etc/default/grub and add the kernel options to the GRUB_CMDLINE_LINUX_DEFAULT="..." line, then:
Also the initial ram filesystem (basically a device/software loader for items that need initialized during kernel boot) may need this information as well. For Ubuntu, define the kernel options by doing:
echo "resume=UUID=the-root-partition-UUID resume_offset=the-swap-file-physical-address" | sudo tee /etc/initramfs-tools/conf.d/resume sudo update-initramfs -u
Exit chroot, unmount, and reboot to new system:
exit for i in /sys /proc /dev/pts /dev; do sudo umount /mnt$root_part$i; done umount /mnt/$root_part
Test now if hibernation works. If it doesn't you can try to add and switch to the 'userspace' suspend framework instead.
uswsusp is a rewrite of the kernel suspend framework for use as a 'userspace' tool. It generally has better support for suspending to a swap file so using it here is generally necessary.
Reboot into the new operating system and install uswsusp.
Ubuntu pre-configures uswsusp (defines the root partition, gets the swap file size, runs sudo swap-offset /swapfile, places these values in the configuration file /etc/uswsusp.conf, then creates a new initramfs) so all that needed to do is install it. Other distributions may need to configure it. Once installed and configured, reboot again and test.