| Rafael J. Wysocki | ecbd0da | 2006-12-06 20:34:13 -0800 | [diff] [blame] | 1 | Using swap files with software suspend (swsusp) | 
|  | 2 | (C) 2006 Rafael J. Wysocki <rjw@sisk.pl> | 
|  | 3 |  | 
|  | 4 | The Linux kernel handles swap files almost in the same way as it handles swap | 
|  | 5 | partitions and there are only two differences between these two types of swap | 
|  | 6 | areas: | 
|  | 7 | (1) swap files need not be contiguous, | 
|  | 8 | (2) the header of a swap file is not in the first block of the partition that | 
|  | 9 | holds it.  From the swsusp's point of view (1) is not a problem, because it is | 
|  | 10 | already taken care of by the swap-handling code, but (2) has to be taken into | 
|  | 11 | consideration. | 
|  | 12 |  | 
|  | 13 | In principle the location of a swap file's header may be determined with the | 
|  | 14 | help of appropriate filesystem driver.  Unfortunately, however, it requires the | 
|  | 15 | filesystem holding the swap file to be mounted, and if this filesystem is | 
|  | 16 | journaled, it cannot be mounted during resume from disk.  For this reason to | 
|  | 17 | identify a swap file swsusp uses the name of the partition that holds the file | 
|  | 18 | and the offset from the beginning of the partition at which the swap file's | 
|  | 19 | header is located.  For convenience, this offset is expressed in <PAGE_SIZE> | 
|  | 20 | units. | 
|  | 21 |  | 
|  | 22 | In order to use a swap file with swsusp, you need to: | 
|  | 23 |  | 
|  | 24 | 1) Create the swap file and make it active, eg. | 
|  | 25 |  | 
|  | 26 | # dd if=/dev/zero of=<swap_file_path> bs=1024 count=<swap_file_size_in_k> | 
|  | 27 | # mkswap <swap_file_path> | 
|  | 28 | # swapon <swap_file_path> | 
|  | 29 |  | 
|  | 30 | 2) Use an application that will bmap the swap file with the help of the | 
|  | 31 | FIBMAP ioctl and determine the location of the file's swap header, as the | 
|  | 32 | offset, in <PAGE_SIZE> units, from the beginning of the partition which | 
|  | 33 | holds the swap file. | 
|  | 34 |  | 
|  | 35 | 3) Add the following parameters to the kernel command line: | 
|  | 36 |  | 
|  | 37 | resume=<swap_file_partition> resume_offset=<swap_file_offset> | 
|  | 38 |  | 
|  | 39 | where <swap_file_partition> is the partition on which the swap file is located | 
|  | 40 | and <swap_file_offset> is the offset of the swap header determined by the | 
| Rafael J. Wysocki | bf73bae | 2006-12-06 20:34:16 -0800 | [diff] [blame] | 41 | application in 2) (of course, this step may be carried out automatically | 
| Matt LaPlante | 01dd2fb | 2007-10-20 01:34:40 +0200 | [diff] [blame] | 42 | by the same application that determines the swap file's header offset using the | 
| Rafael J. Wysocki | bf73bae | 2006-12-06 20:34:16 -0800 | [diff] [blame] | 43 | FIBMAP ioctl) | 
|  | 44 |  | 
|  | 45 | OR | 
|  | 46 |  | 
|  | 47 | Use a userland suspend application that will set the partition and offset | 
|  | 48 | with the help of the SNAPSHOT_SET_SWAP_AREA ioctl described in | 
|  | 49 | Documentation/power/userland-swsusp.txt (this is the only method to suspend | 
|  | 50 | to a swap file allowing the resume to be initiated from an initrd or initramfs | 
|  | 51 | image). | 
| Rafael J. Wysocki | ecbd0da | 2006-12-06 20:34:13 -0800 | [diff] [blame] | 52 |  | 
|  | 53 | Now, swsusp will use the swap file in the same way in which it would use a swap | 
| Rafael J. Wysocki | bf73bae | 2006-12-06 20:34:16 -0800 | [diff] [blame] | 54 | partition.  In particular, the swap file has to be active (ie. be present in | 
|  | 55 | /proc/swaps) so that it can be used for suspending. | 
| Rafael J. Wysocki | ecbd0da | 2006-12-06 20:34:13 -0800 | [diff] [blame] | 56 |  | 
|  | 57 | Note that if the swap file used for suspending is deleted and recreated, | 
|  | 58 | the location of its header need not be the same as before.  Thus every time | 
|  | 59 | this happens the value of the "resume_offset=" kernel command line parameter | 
|  | 60 | has to be updated. |