Ubuntuでスワップパーティションからスワップファイルへ移行する試み.

背景

普段使いPCで運用しているUbuntu 22.04で, メモリ 8GB, スワップパーティション 8GB.

ブラウザを使っていると当たり前のようにスワップ含むメモリ使用量が8GBを超えるため, ハイバネートに失敗してしまう. そのため, パソコンを閉じるときにわざわざブラウザ等を閉じるようにしていたが, いい加減めんどうになってきたので, スワップ領域を増やすことにしてみた.

対応内容

  1. スワップファイルを作成する
  2. /etc/fstab を編集して, スワップファイルをスワップ領域としてマウントする
  3. grub 設定を変更して, スワップファイルにサスペンドイメージを保存するようにする
  4. 再起動する

やることとしてはこんな感じ.

注意点として, スワップ領域を増やすだけなら, スワップファイルを追加してマウントしてやるだけでいいが, サスペンドイメージは一つのパーティション, またはスワップファイルに保存する形にしないとだめ 1. そのため, 既存のパーティションに代えて大きめに指定するスワップファイルを使うことにする.

スワップファイルを作成する

ddコマンドでスワップファイルを作成する. 実メモリの倍の16GBにしています.

sudo dd \
    if=/dev/zero of=/swapfile \
    bs=(cat /proc/meminfo | awk '/MemTotal/ {print $2}') \
    count=2048 \
    conv=notrunc

スワップファイルとしてファイルをフォーマット.

sudo mkswap /swapfile

/etc/fstab を編集する

/etc/fstab にある次のエントリ.

UUID=c9e7ba59-90a6-4f71-8863-814d166064fa none swap sw 0 0

これを削除するかコメントアウトするなどして, 次のエントリに差し替える.

/swapfile none swap defaults 0 0

これで再起動すると, スワップ領域にパーティションではなく, /swapfile が使われるようになる.

grub設定を変更する

Ubuntuのgrub設定ファイルは /etc/default/grub.

サスペンドイメージの保存先をカーネルオプションで指定するようになっている.

既存の指定.

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=c9e7ba59-90a6-4f71-8863-814d166064fa"

これを, 次のように編集する.

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=208cb226-9265-43ed-b3a0-b6aa588e9e27 resume_offset=8992768"

resume=UUID=resume_offset= この2つの指定を書き換える.

resume=UUID= これはスワップファイルを置いたボリュームのUUID. スワップファイルは / に置いたので, /etc/fstab/ にマウントされているボリュームのUUIDがそれ.

resume_offset= これはスワップファイルがボリューム上の物理的に配置されている場所のこと. これを filefrag コマンドで確認することができる.

$ sudo filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 16414375936 (4007416 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..    2047:    8992768..   8994815:   2048:
   1:     2048..    4095:   10039296..  10041343:   2048:    8994816:
省略

physical_offset の先頭の値がそれ. つまり 8992768 です.

/etc/default/grub を編集し終えたら, /boot 以下にあるgrub.cfgを更新してやる必要がある. Ubuntuの場合は次のコマンドを実行する 2.

$ sudo update-grub

再起動する

ここまでできたら再起動する.

動作確認と所感

使用メモリを8GBを大きく超える状態でハイバネートし, 復帰までできた.

いまのところパフォーマンス的な影響もさほどなさそうだった.

ハイバネートを多用する運用はあまり好きではないんだけど, 古いノートパソコンでバッテリがよわよわであることや, そんなに使わんPCなので電源を繋ぎっぱなしにもしたくない. ということで引き続きハイバネートで運用していく.

参考

ArchWikiに載ってる内容でほとんどわかった.