システムが十分なメモリを持たない時点に達する可能性があることが既にわかっている場合にスワップを無効にすることは、悪い考えです。 .システムを割り当てるためのメモリがカーネルにない瞬間は、おそらく very-very になるでしょう。 応答しないかハングするだけなので、再起動する必要があります。ハングによってデータが失われたり、場合によってはファイル システムが破損する可能性があります。自動的に修正できるファイルシステム (ext* ファミリー、fat ファミリー、btrfs など) によって異なりますが、すべての FS がこの機能をサポートしているわけではありません。おそらく fsck
を実行したくないでしょう。 破損するたびにシングル ユーザー モードで...
カーネルは、必要なものすべてを SSD に書き込むだけではそれほど愚かではありません。HDD とは動作が異なり、TRIM などを使用して書き込みを最小限に抑えようとします。あなたが思っているほどドライブに害はありません。
休止状態は組み込みです 低レベルで動作するカーネル サブシステム。メモリの完全なスナップショットを作成できるように、サイズがRAMサイズ以上の別のパーティションが必要です。ここでは、Linux が休止状態を管理する方法を読むことができます。メモリ イメージを永続的に保存する場所がない場合、休止状態は機能しません。空中にデータを保存することはできません。永続的な物理ストレージがない =ハイバネーションなし。これがあなたの質問に対する答えでもあります:linux ではスワップなしでハイバネーションを使用することはできません .
したがって、私のポイントは、もちろん、スワップなしで生きて、休止状態のみを有効にすることができますが、システムが稼働している時間の 99.9% がすべてに十分なメモリを持っていることが確実な場合に限ります。そうでない場合は、swap を使用する必要があります。
考えられる解決策へ:
systemctl hibernate
を実行すると systemd は systemd-hibernate.service というサービスを開始します .ユニット ファイルは通常 /usr/lib/systemd/system/ にあります ディレクトリ
Debian では次のようになります:
# SPDX-License-Identifier: LGPL-2.1+
#
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Hibernate
Documentation=man:systemd-suspend.service(8)
DefaultDependencies=no
Requires=sleep.target
After=sleep.target
[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-sleep hibernate
ご覧のとおり、Requires があります。 そして後 オプション。スワップを有効にする別のユニットを作成し、その名前をこれらのフィールドに追加できます。これを swap-on.service と呼びます /etc/systemd/system/ に配置します ディレクトリ
ファイルは次のようになります:
# Unit filed is not required in our case so you can skip it
[Unit]
Description=Enable swap partition
[Service]
# This line means that service will be executed just once and immediately stop when
# swapon enables swap on /dev/sda3
Type=oneshot
# Change /dev/sda3 with device named after your swap partition
# like /dev/sdb3 or /dev/nvme0n1p3
# Use lsblk to determine your swap partition (partition with [SWAP] as mountpoint)
# Of course you can think of a more complex solution like running external script
# that determines your swap partition automatically every time service is executed
# but for now I'll go with simple /dev/sda3
ExecStart=/sbin/swapon /dev/sda3
ここで、システムの systemd-hibernate.service を変更する必要があります :
# SPDX-License-Identifier: LGPL-2.1+
#
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Hibernate
Documentation=man:systemd-suspend.service(8)
DefaultDependencies=no
Requires=sleep.target swap-on.service <--
After=sleep.target swap-on.service <--
[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-sleep hibernate
swap-on.service を複製しています in After で、systemd が休止状態を after に開始するようにします スワップはオンであり、その逆ではなく、swap-on.service の場合に systemd が休止状態にならないようにするために必要です。 失敗しました。
systemctl hibernate
を実行すると systemd は、変更された systemd-hibernate.service を実行します swap-on.service を実行する スワップを可能にします。スワップが有効で、必須フィールドと後フィールドの両方が満たされると、systemd は最終的にシステムを休止状態にすることができます。
ハイバネーションから復帰した後に systemd でスワップを無効にするために、swap-off.service という別のサービス ファイルを作成する必要はありません。 swap-on.service と同じことを行います 、「on」サービスと同じディレクトリ (/etc/systemd/system/) に配置します。唯一の違いは、このサービスが swapoff を実行することです スワップの代わりに :
[Unit]
Description=Disable swap partition
[Service]
Type=oneshot
# again, change /dev/sda3 to your swap partition /dev file
ExecStart=/sbin/swapoff /dev/sda3 <--
次のステップは、[email protected] というサービス ファイルを変更することです。 同じ /usr/lib/systemd/system にあります ディレクトリ:
[Unit]
Description=Resume from hibernation using device %f
Documentation=man:[email protected](8)
DefaultDependencies=no
BindsTo=%i.device
Wants=local-fs-pre.target
After=%i.device
Before=local-fs-pre.target
ConditionPathExists=/etc/initrd-release
[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-hibernate-resume %f
Before を変更する必要があります 今フィールド。 swap-off.service を追加 local-fs-pre.target の横 :
...
After=%i.device
Before=local-fs-pre.target swap-off.service <--
ConditionPathExists=/etc/initrd-release
...
ハイバネーションから再開すると、systemd は swap-off.service を実行します スワップ イメージがメモリにロードされた後 (実際には少し後ですが、それは問題ではありません)
これは完全に理論的な解決策であることを覚えておいてください。私はまだ試していませんが、systemd について知っていることに基づいて、これはうまくいくはずです。 UPower は systemd に休止状態を要求するので、説明したように systemd-hibernate.service を実行します。これはおそらくあなたが探しているものです