GNU/Linux >> Linux の 問題 >  >> Linux

スワップを有効にせずにハイバネーション

<オール>
  • システムが十分なメモリを持たない時点に達する可能性があることが既にわかっている場合にスワップを無効にすることは、悪い考えです。 .システムを割り当てるためのメモリがカーネルにない瞬間は、おそらく 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 を実行します。これはおそらくあなたが探しているものです


    Linux
    1. Linux OS サービス「ネットワーク」

    2. Linux OS サービス「ポートマップ」

    3. Linux OS サービス「auditd」

    1. Linux OS サービス「nfs」

    2. Linux OS サービス「microcode_ctl」

    3. Linux OS サービス「NetFS」

    1. Linux OS サービス「ldap」

    2. Linux OS サービス「yppasswdd」

    3. Linux OS サービス「xendomains」