1 |
3 |
xianfeng |
Using swap files with software suspend (swsusp)
|
2 |
|
|
(C) 2006 Rafael J. Wysocki
|
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
|
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= bs=1024 count=
|
27 |
|
|
# mkswap
|
28 |
|
|
# swapon
|
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 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= resume_offset=
|
38 |
|
|
|
39 |
|
|
where is the partition on which the swap file is located
|
40 |
|
|
and is the offset of the swap header determined by the
|
41 |
|
|
application in 2) (of course, this step may be carried out automatically
|
42 |
|
|
by the same application that determines the swap file's header offset using the
|
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).
|
52 |
|
|
|
53 |
|
|
Now, swsusp will use the swap file in the same way in which it would use a swap
|
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.
|
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.
|