
2026/09/24 3:07
NixOS でのスワップ、ZRAM、Zswap、およびハイバネーションについて
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
概要:本ガイドは、NixCon 2026 で発表されたデスクトップおよびノートパソコン向けの簡素化された NixOS のサスペンド構成を示しています。中心的な戦略としては、バッテリー持続時間とデータ保存のバランスを取るために、ACPI S3 スリープを優先し、后备として S4 のハイバネーションを行うことを採用しています。ハイバネーションには initramfs に可視化されるスワップ領域が必要であり(UEFI 上で EFI 変数を通じて)、構成ではデスクトップ向けに単純なスワップパーティションまたはノートパソコン向けに LUKS で暗号化された btrfs および 32GB のスワップファイルを使用しています。両方のアプローチとも現在 zswap を有効にし(
boot.zswap.enable = true)、SSD 上では Chris Down が推奨する通り vm.swappiness = 100 を設定しています。本ガイドの主要な改善点は、zswap の圧縮アルゴリズムを lz4 から zstd に切り替えることであり、これは ArchWiki および NixOS のデフォルトにも一致しており、圧縮比率を向上させプールのメモリページ数を増やすことを可能にします。また、ガイドは zramSwap.enable の誤った利用を是正し、それを boot.zswap に置き換えることで、boot.initrd.systemd.enable の新しいデフォルトを活用して initrd 構成を簡素化しています。本文
NixOS におけるスワップと ZSwap の実践的設定
注記: 私は NixCon 2026 に参加予定です!同様に出席される方がいれば、お会いできることを楽しみにしています。
本記事では、デスクトップ環境におけるスワップ(swap)、zram、zswap の有効活用について、私の経験と設定をまとめました。
スワップの有効化:なぜ必要か?
ネット上の議論は古くからありますが、サーバー用とワークステーション(デスクトップ)用の推奨事項が混同されがちです。ここではデスクトップ・ラップトップに焦点を当てて解説します。
私は スワップを使用しています。その主な理由は以下の通りです。
- KDE の「Standby, then hibernate」動作の活用
- まず ACPI S3(RAM スリープ)に入り、一定時間後に S4(休止状態/Hibernate)へ移行する設定を採用。
- 良いバランス: 少し離れる場合は再起動不要で、完全に電源を落とすことを忘れた場合でもシステムが安全にシャットダウンできる。
- 休止状態を実現するには、システムの状態をディスクに保存する必要があり、スワップ領域の確保は必須。
スワップファイルかパーティションか?
スワップ実装には「ファイル」と「パーティション」の対立があります。休止状態(hibernate)を正しく動作させる場合、以下の注意点があります。
- スワップファイルの難点:
- 休止状態から復元する際、ファイルシステムがマウントされる前に
がスワップ領域の場所を特定する必要があるため設定が複雑化しやすいためです。initramfs - UEFI システムでは詳細情報を EFI 変数に保存する必要があります。
- 休止状態から復元する際、ファイルシステムがマウントされる前に
私の構成案
デスクトップ:単純なスワップパーティション
swapDevices = [ {device = "/dev/disk/by-uuid/f2fc399a-9703-450b-88df-5671b776fc71";} ];
ラップトップ:LUKS 暗号化 + スワップファイル(Btrfs サブボリューム)
disko の luks-btrfs-subvolumes テンプレートに基づいています。NixOS はスワップファイルを使用した休止状態を正しくサポートしており、オフセットの特定も自動的に行えます。
fileSystems."/.swapvol" = { device = "/dev/disk/by-uuid/33682d1d-87c4-4166-8d3b-66d900387e42"; fsType = "btrfs"; options = ["subvol=swap"]; }; swapDevices = [ { device = "/.swapvol/swapfile"; size = 32 * 1024; } ];
推奨設定:zswap を採用する
Chris Down の記事(「スワップ擁護」と「zswap と zram の神話を解き明かす」)を起点に、ディスクベースのスワップに対して zswap を使用するのが最適です。
私の現在の最小構成
設定が簡素であっても重要性は変わりません。以下の 2〜3 行のみで済みます。
boot.zswap.enable = true; boot.kernel.sysctl."vm.swappiness" = 100;
swappiness
の値について
swappiness- 役割: スワップとファイルシステムページの移動コストのバランスを制御します。
- 推奨値: Chris Down はSSD 搭載システムでは
を推奨しています。100 - 注意点: 異なる値を実際にテストして最適な値を見つける必要があります。
- 現状: 私の SSD では
が良好に機能しています(ワークステーションでのテスト手順は未確認)。swappiness = 100
過去の教訓:zram と zswap の混乱
以前、Chris の記事を誤って解釈し、
zramSwap.enable を使用していました。これはディスクベースのスワップが必要な休止状態の実現において不適切でした。
修正プロセス
- 発見: 2024 年 4 月まで誤った設定(
)を維持していたが、zramSwap
の導入を機に見直した。boot.zswap - 対応:
を削除し、正しくzramSwap.enable
に切り替えた。boot.zswap
圧縮アルゴリズムの選択 (compressor
)
compressor| アルゴリズム | デフォルト (Linux) / NixOS | メリット・判断理由 |
|---|---|---|
| lzo | Linux カーネルデフォルト | 速度と圧縮率の良いバランス。 |
| zstd | NixOS デフォルト | 最も優れた圧縮比率。ディスクアクセス頻度を大幅に低減できるため最適。 |
| lz4 | ArchWiki の傾向 | 速度は早いも圧縮率は劣る。ボトルネックになりにくい場合でも、zstd が優位。 |
最終的な構成(簡素化後)
当初は
boot.initrd.systemd.enable = true が必要でしたが、現在はデフォルトで有効のため削除可能です。これにより構成は以下の通りになりました。
boot.zswap = { enable = true; compressor = "lz4"; # または zstd }; boot.kernel.sysctl."vm.swappiness" = 100;
現在推奨: NixOS のデフォルトである
を使用することが最も効果的です。zstd
まとめ
何か新しいことを学び、それを共有する姿勢こそが重要です。スパムや第三者への共有は一切行わず、二人三脚で知識を深めていこうと思います。