使用交换文件进行软件挂起 (swsusp)¶
2006 Rafael J. Wysocki <rjw@sisk.pl>
Linux 内核处理交换文件的方式几乎与处理交换分区的方式相同,这两种类型的交换区域之间只有两个区别:(1) 交换文件不必是连续的,(2) 交换文件的头部不在包含它的分区的第一块。 从 swsusp 的角度来看,(1) 不是问题,因为它已经被交换处理代码处理,但 (2) 必须加以考虑。
原则上,可以使用适当的文件系统驱动程序确定交换文件头的位置。 然而,不幸的是,这需要挂载保存交换文件的文件系统,如果该文件系统是日志文件系统,则在从磁盘恢复期间无法挂载它。 因此,为了识别交换文件,swsusp 使用保存该文件的分区的名称以及交换文件头所在的分区起始位置的偏移量。 为了方便起见,此偏移量以 <PAGE_SIZE> 为单位表示。
为了将交换文件与 swsusp 一起使用,您需要
创建交换文件并使其处于活动状态,例如:
# dd if=/dev/zero of=<swap_file_path> bs=1024 count=<swap_file_size_in_k> # mkswap <swap_file_path> # swapon <swap_file_path>
2) 使用一个应用程序,该应用程序将使用 FIBMAP ioctl 来 bmap 交换文件,并确定该文件的交换头的位置,作为从保存交换文件的分区开始的偏移量,以 <PAGE_SIZE> 为单位。
将以下参数添加到内核命令行
resume=<swap_file_partition> resume_offset=<swap_file_offset>
其中 <swap_file_partition> 是交换文件所在的分区,<swap_file_offset> 是应用程序在 2) 中确定的交换头偏移量(当然,此步骤可以通过同一个应用程序使用 FIBMAP ioctl 确定交换文件头的偏移量来自动完成)
或者
使用用户态挂起应用程序,该应用程序将借助 用户态软件挂起接口文档 中描述的 SNAPSHOT_SET_SWAP_AREA ioctl 设置分区和偏移量(这是挂起到交换文件的唯一方法,允许从 initrd 或 initramfs 映像启动恢复)。
现在,swsusp 将以与使用交换分区相同的方式使用交换文件。 特别是,交换文件必须是活动的(即出现在 /proc/swaps 中),以便可以用于挂起。
请注意,如果用于挂起的交换文件被删除并重新创建,则其头的位置可能与以前不同。 因此,每次发生这种情况时,都必须更新“resume_offset=”内核命令行参数的值。