NixOSにおけるスワップ、ZRAM、Zswap、およびハイバネーション
Swap, ZRAM, Zswap and Hibernate on NixOS (blog.matthewbrunelle.com)
要約
この記事は、NixOS環境におけるスワップ、ZRAM、Zswap、およびハイバネーションの設定について解説しています。著者は、デスクトップやラップトップでの「サスペンド・アンド・ハイバネート」機能のためにスワップを利用しており、スワップファイルとパーティションの違い、ハイバネーション時の注意点、そしてNixOSでの具体的な設定方法を共有しています。特に、zswapの有効化とswappinessの値設定に焦点を当て、自身の経験に基づいた設定の変遷と推奨設定を紹介しています。
全文翻訳
NixOSにおけるSwap、ZRAM、Zswap、およびハイバネーション
この記事は、私の非自明なNixOS設定の断片から独立させたものです。
注: 私はNixCon 2026に参加します。もし参加される方がいれば、ぜひ声をかけてください!
ああ、スワップ、zram、zswapについて話すことになるなんて…
スワップを使うべきかどうかは、オンラインで常に議論の的となります。サーバー向けとワークステーション向けの推奨事項を混同すると、議論はしばしば混乱します。私の場合は、デスクトップとラップトップに焦点を当てます。
私は、KDEの設定にある「サスペンド・トゥ・ハイバネーション」、または「スタンバイ、そしてハイバネーション」を使用するためにスワップを使っています。
![[画像: KDEの設定画面で「サスペンド・トゥ・ハイバネーション」が選択されている様子]]
これはまずACPI S3でRAMにサスペンドし、その後遅延を経てS4ハイバネーションに入ります。これにより、少しの間離席しても起動を待つ必要がなく、完全に電源を切るのを忘れても心配する必要がないという、良いバランスが取れていると思います。
ハイバネーションを使用するには、システムの状態をディスクに保存するためのスワップが必要です。
さらに議論に火をつけましょう
スワップファイルとスワップパーティションのどちらが良いかという議論もあります。私は主に、スワップファイルはハイバネーションを複雑にする可能性があることを指摘したいです。なぜなら、ハイバネーションから復帰する際に、ファイルシステムがマウントされる前にinitramfsがスワップ領域の場所を知る必要があるからです。UEFIシステムでは、ハイバネーション開始時に詳細がEFI変数に保存されます。
私はデスクトップをシンプルなスワップパーティションでセットアップしました。
swapDevices = [
{device = "/dev/disk/by-uuid/f2fc399a-9703-450b-88df-5671b776fc71";}
];
私はラップトップをLUKS暗号化とスワップファイルでセットアップしました。
fileSystems."/.swapvol" = {
device = "/dev/disk/by-uuid/33682d1d-87c4-4166-8d3b-66d900387e42";
fsType = "btrfs";
options = ["subvol=swap"];
};
...
swapDevices = [
{
device = "/.swapvol/swapfile";
size = 32 * 1024;
}
];
これはdiskoのluks-btrfs-subvolumesテンプレートに基づいています。
良いニュースは、NixOSはしばらく前からスワップファイル上でのハイバネーションのニュアンスを理解しており、オフセットの特定を処理できるようになったことです。
現在使用している設定
スワップを使用するなら、正しく使いたいものです。In Defence of Swapという記事とその続編であるDebunking zswap and zram mythsは、多くの重要な文脈を提供しています。出発点として、Chris Downはディスクベースのスワップとzswapの併用を推奨しています。
したがって、私の現在設定は非常にシンプルです。
boot.zswap.enable = true;
boot.kernel.sysctl."vm.swappiness" = 100;
はい、文字通りこれだけです。設定が長くて複雑でないところが気に入っています。数行だからといって、その重要性が低いわけではありません。
なぜその特定のswappiness値なのか? Swappinessは、スワッピングとファイルシステムページングの相対的なコストを制御するため、特定のハードウェアに依存します。Chrisは、SSDを搭載したシステムではswappiness 100がうまく機能すると示唆していますが、「直感だけでこの値を調整するのは簡単ではない」とも述べており、異なる値をテストすべきだと述べています。カーネルドキュメントも同様に、SSDではさらに高くすることも可能だと述べています。
しかし、特にワークステーション用途で、異なるswappiness値をテストおよび比較する方法について、明確な指示はどこにも見つかっていません。もし何か推奨事項があれば、ぜひ教えていただきたいです。今のところ、SSDでは100でうまくいっています。
これまで犯した間違い
Chrisの2番目の記事を読む前は、彼がそれを推奨していると思っていたのでzramSwap.enableを使用していました。しかし、それは間違いで、実際には逆でした。boot.zswapが追加された今年の4月まで、このことに気づいていませんでした。したがって、明確にしておくと、zramSwapは通常zramと呼ばれるものです。ディスクベースのスワップを使用している場合は、おそらくこれは望ましくないでしょう。私の場合はハイバネーションが必要だったので、これは間違った選択でした。
この間違いに気づいた後、zramSwap.enableを削除し、boot.zswapを使用し始めました。
boot.initrd.systemd.enable = true;
boot.zswap = {
enable = true;
compressor = "lz4";
};
boot.kernel.sysctl."vm.swappiness" = 100;
zswapの圧縮アルゴリズムはboot.zswap.compressorを通じて制御できることがわかります。Linuxカーネルは、速度と圧縮のバランスが良いlzoをデフォルトとしています。一方、NixOSは、最高の圧縮率を持ち、Nixビルドにも適しているという理由でzstdをデフォルトとしています。
最近まで、最も高速な圧縮と低遅延を持つlz4を実行していました。ArchWikiを読んで、主にそれをコンプレッサーとして使用していることを知った後、この決定を下しました。しかし現実には、メモリがディスクにスピルオーバーしている場合、圧縮速度が制限要因となることはめったにありません。より良い圧縮率により、メモリ内の圧縮プールにより多くのページを収めることができ、ディスクの使用頻度が減ります。
そのため、現在はNixOSのデフォルトであるzstdを使用しています。また、その設定を追加したとき、lz4はboot.initrd.systemd.enableを必要としました。この設定は現在デフォルトでtrueになっているため、その行は削除できます。これにより、設定はわずか2行になります。
私は様々なプロジェクト、イベント、考えについて書いていますが、それらすべてに共通する側面があります。それは、私が何かを学び、その経験を他の人と共有したいということです。
スパムなし、第三者への共有なし。あなたと私だけです。