使用交换文件进行软件挂起 (swsusp)

  1. 2006 Rafael J. Wysocki <rjw@sisk.pl>

Linux 内核处理交换文件的方式与处理交换分区几乎相同,这两种类型的交换区域只有两个区别:(1) 交换文件不需要是连续的,(2) 交换文件的头部不在保存它的分区的第一个块中。从 swsusp 的角度来看,(1) 不是问题,因为它已经被交换处理代码处理过了,但是 (2) 必须加以考虑。

原则上,可以使用相应的 文件系统驱动程序 来确定交换文件头的位置。 然而,不幸的是,这需要挂载包含交换文件的文件系统,如果此文件系统已记录日志,则在从磁盘恢复期间无法挂载它。 因此,为了识别交换文件,swsusp 使用包含该文件的分区的名称以及从分区开头到交换文件头所在位置的偏移量。 为了方便起见,此偏移量以 <PAGE_SIZE> 为单位表示。

为了将交换文件与 swsusp 一起使用,您需要

  1. 创建交换文件并使其处于活动状态,例如。

    # 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> 为单位。

  1. 将以下参数添加到内核命令行

    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=” 内核命令行参数的值。