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:
root_part=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:
umount /mnt/$root_part
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:
resume=UUID=the-root-partition-UUID resume_offset=the-swap-file-physical-address
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:
update-grub
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.
Userspace Suspend/Hibernation
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.
References
Just a small correction:
From fstab(5)
The second field (fs_file).
This field describes the mount point for the filesystem. For swap partitions, this field should be specified as `none’.
So the correct fstab-entry should be:
/swapfile none swap defaults 0 0
How about putting your swapfile in /dev/shm? This’ll be mighty fast!
Does this works with hibernation? I remembered that hibernate to a swap file was not supported in the past.
Good to know. Thanks for the detail; updated the Arch wiki too.
Yeah, still doesn’t work in Ubuntu 11.10. Hadn’t realized this so: good point. Ubuntu boots almost as quickly as hibernate so will have to see if this becomes a deal with me.
I cheded the arch wiki, it says you can get hibernation working with swap file, please test it and let us know :)
https://wiki.archlinux.org/index.php/Swap#Resume_from_Swap_file
Updated post, thanks for comments.