使用交換檔案進行軟體掛起 (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=” 核心命令列引數的值。