ふたを閉じるとき、またはメニューから「サスペンド」を選択するとき、サスペンドの代わりにハイブリッドサスペンドメソッドを使用したいと思います。
Pm-suspendスクリプトを変更して自動的に変更することを想像できますが、もっと保守的で簡単な方法があるかもしれません。
これは古い方法です。最初にサスペンドしてから、遅延(デフォルトでは15分)後にスリープ解除します。 3.6より前のLinuxカーネルでこれを使用するか、必要に応じて15分後に電力を使用しないようにします。
ファイル/etc/pm/config.d/00-use-suspend-hybrid
を追加します。
# Always use suspend_hybrid instead of suspend
if [ "$METHOD" = "suspend" ]; then
METHOD=suspend_hybrid
fi
# The delay after which hibernation gets triggered (default: 900 seconds, 15 minutes):
PM_HIBERNATE_DELAY=900
次のコードを使用して、ハイブリッド方式がシステムでサポートされていることを確認する必要がある場合があります。 「0」と表示されている場合、動作するはずです。
Sudo pm-is-supported --suspend-hybrid && echo $?
Linux 3.6カーネルを使用している場合は、次のものを使用できます。これにより、ディスクとRAMの両方が最初から中断されます。
ファイル/etc/pm/config.d/00-use-suspend-hybrid
を追加します。
# WORKAROUND: always set the default hibernate mode first (normal mode)
# (not required if you have the patch mentioned by Rohan below (http://askubuntu.com/a/344879/169))
HIBERNATE_MODE=platform
# Always use hibernate instead of suspend, but with "suspend to both"
if [ "$METHOD" = "suspend" ]; then
METHOD=hibernate
HIBERNATE_MODE=suspend
fi
# Make sure to use the kernel's method, in case uswsusp is installed etc.
SLEEP_MODULE=kernel
これにより、常にイメージがディスクに書き込まれ、RAMに一時停止されます。再開は常に高速で(バッテリーが切れない限り)、マシンは短時間(PM_HIBERNATE_DELAY後)ウェイクアップしないという利点があります。実際に休止状態にします。
欠点は、プロセスがより長くかかり(常にディスクに休止状態になるため)、長時間実行すると(たとえば12時間後)バッテリーがなくなる可能性があることです。
buntu 18.04には新しい時間オプションがあります。 systemd
では、新しいモードsuspend-then-hibernate
を使用できます。これはスリープモードで開始され、一定時間後に休止状態モードに移行します。
hybrid-sleep
モードでは、バッテリーが非常に少なくなり、システムがシャットダウンした場合にのみ、休止状態部分が有効になります。
この関数の使用を開始するには、次のコンテンツでファイル/etc/systemd/sleep.conf
を作成する必要があります。
[Sleep]
HibernateDelaySec=3600
これは、1時間のスリープの後、スリープから休止状態に移行します。 HibernateDelaySec
を編集して、遅延を休止状態に変更できます。
最初に、systemdを使用してsuspend-then-hibernateが動作するかどうかをテストします
を押して端末を開きます Ctrl+Alt+T そして入力:
Sudo systemctl suspend-then-hibernate
動作する場合、永続的にします。
任意のエディターを使用して、ファイル/etc/systemd/logind.conf
を開きます。このファイルを編集するには、Sudo
、gksudo
、または pkexec
によって管理権限を呼び出す必要があります。
2行を見つけます。
#HandleSuspendKey=suspend
#HandleLidSwitch=suspend
注、これらの行は、その前に#
でコメント化されています。 suspend
はデフォルトのアクションです。 #
を削除し、これらの2行でsuspend
をsuspend-then-hibernate
に変更して、次のようにします。
HandleSuspendKey=suspend-then-hibernate
HandleLidSwitch=suspend-then-hibernate
ファイルを保存します。次のコマンドでログアウトしてから再度ログインするか、logind
サービスを再起動します。
systemctl restart systemd-logind.service
warning!ユーザーセッションが再開されます
ソース: Lid Closed Suspend then Hibernate
solution by blueyedLinux 3.6以降でサスペンドするリアルハイブリッドの場合は機能しませんでした。これは、Ubuntu 16.04がsystemd
を使用し、/etc/pm/config.d/00-use-suspend-hybrid
ファイルを使用しないためだと思われます。
最初に、systemdを使用して休止状態とハイブリッドスリープが機能するかどうかをテストします
を押して端末を開きます Ctrl+Alt+T そして入力:
Sudo systemctl hibernate
これにより、コンピューターが休止状態になります。ハイブリッドスリープを試すには、次のように入力します。
Sudo systemctl hybrid-sleep
動作する場合、永続的にします。
任意のエディターを使用して、ファイル/etc/systemd/logind.conf
を開きます。このファイルを編集するには、Sudo
、gksudo
、または pkexec
によって管理権限を呼び出す必要があります。
2行を見つけます。
#HandleSuspendKey=suspend
#HandleLidSwitch=suspend
注、これらの行は、その前に#
でコメント化されています。 suspend
はデフォルトのアクションです。 #
を削除し、これらの2行でsuspend
をhybrid-sleep
に変更して、次のようにします。
HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep
ファイルを保存します。ログアウトしてからログインし直します。
注意:
suspend
またはhybrid-sleep
以外に、3番目のオプションhibernate
があります。Suspend
をクリックすると、コンピューターはハイブリッドスリープではなく通常のサスペンドになります。これが役立つことを願っています
12.04で、休止状態が(PM_HIBERNATE_DELAY=XX
を使用して)トリガーされたときに、シェルスクリプトの再開/解凍がgrub recordfail変数を設定解除しないことに気付きました。したがって、grubは自動起動しません。
タイムアウトは-1に設定され、ユーザーの選択を待機します。これには/etc/pm/sleep.d/10_grub-common
のスクリプトの編集が必要だと思います。初心者なので、残念ながら正確な変更を理解するために手を出していない。
この質問はGoogleで頻繁に出てくるので、ぶつかる価値があると思います。ここで説明する方法は、(imo)notハイブリッドサスペンドです。 「X分のサスペンド後の休止」です。真のハイブリッドサスペンドは、RAMをディスクに書き込み、低電力状態(スリープモード)にします。時間がかかりますが、マシンのバッテリーが残っている間は再開されますが、そうでない場合はハードディスクから再開されます。この動作は、ほとんどの人がハイブリッドスリープとして知っており、新しいWindowsおよびMacラップトップでデフォルトで使用されています。
realハイブリッドサスペンドを有効にする方法は次のとおりです。
%cat /etc/pm/config.d/00-use-suspend-hybrid #suspend ではなく、常にsuspend_hybridを使用if ["$ METHOD" = "suspend" ]; then METHOD = suspend_hybrid fi
この方法は、Sony Vaio SVSで機能します。
PS:ファイルが将来削除される場合に備えて、ここでパッチを再現します。
diff --git a/pm/pm-functions.in b/pm/pm-functions.in --- a/pm/pm-functions.in + ++ b/pm/pm-functions.in @@ -316,8 +316,28 @@ if [-z "$ HIBERNATE_MODULE"] &&\ { [-n "$ {HIBERNATE_MODE}"] &&\ grep -qw "$ {HIBERNATE_MODE}"/sys/power/disk &&\ + HIBERNATE_MODE_SAVE = $(cat/sys/power /ディスク)&&\ + HIBERNATE_MODE_SAVE = "$ {HIBERNATE_MODE_SAVE ## * [}" &&\ + HIBERNATE_MODE_SAVE = "$ {HIBERNATE_MODE_SAVE %%] *}" &&\ echo -n "$ {HIBERNATE_MODE}"> /sys/power/disk echo -n "disk"> /sys/power/state + RET = $? + echo -n "$ HIBERNATE_MODE_SAVE"> /sys/power/disk + return "$ RET" +} + fi + + #両方へのサスペンドをサポートするカーネル(ハイブリッドサスペンド) +#カーネル3.6 + if [-z "$ SUSPEND_HYBRID_MODULE"] &&\ + [-f/sys/power/disk] &&\ + grep -q disk/sys/power/state &&\ + grep -q suspend/sys/power/disk; then + SUSPEND_HYBRID_MODULE = "kernel" + do_suspend_hybrid() + { + HIBERNATE_MODE = "suspend" + do_hibernate } fi
ソース:
/ sys/class/rtc/rtc0のwakealarmを使用するだけで、config.dにファイルを追加せずに別のソリューションがあります。カーネルが直接サポートしていないので、コメントの後にpm-functions(/ usr/lib/pm-utils)で廃止されたコードを使用します...((現在のカーネル(3.6以降)は直接サポートします)。そのコードを元に戻し、do_suspend_hybrid()の代わりにdo_suspend()部分を配置し、pm関数用のパッチを使用します(修正するまで)。
廃止されたコード(suspend_hybridが呼び出されたときにサスペンドしてから休止状態にする):
# since the kernel does not directly support hybrid sleep, we do
# something else -- suspend and schedule an alarm to go into
# hibernate if we have slept long enough.
# Only do this if we do not need to do any special video hackery on resume
# from hibernate, though.
if [ -z "$SUSPEND_HYBRID_MODULE" -a -w "$PM_RTC/wakealarm" ] && \
check_suspend && check_hibernate && ! is_set $HIBERNATE_RESUME_POST_VIDEO; \
then
SUSPEND_HYBRID_MODULE="kernel"
do_suspend_hybrid() {
WAKETIME=$(( $(cat "$PM_RTC/since_Epoch") + PM_HIBERNATE_DELAY))
echo >"$PM_RTC/wakealarm"
echo $WAKETIME > "$PM_RTC/wakealarm"
if do_suspend; then
NOW=$(cat "$PM_RTC/since_Epoch")
if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ]; then
log "Woken by RTC alarm, hibernating."
# if hibernate fails for any reason, go back to suspend.
do_hibernate || do_suspend
else
echo > "$PM_RTC/wakealarm"
fi
else
# if we cannot suspend, just try to hibernate.
do_hibernate
fi
}
fi
推奨。 uswsuspをさらに使いやすくすると同時に、s2bothの利点を最大限に活用します(つまり、サスペンド時のs2both)。復帰したコードをuswsuspモジュールのdo_suspend()部分(/usr/lib/pm-utils/module.d)に配置します。
元に戻されたコード(サスペンドが呼び出されたときのsuspend_hybrid):
WAKETIME=$(( $(cat "$PM_RTC/since_Epoch") + PM_HIBERNATE_DELAY))
echo >"$PM_RTC/wakealarm"
echo $WAKETIME > "$PM_RTC/wakealarm"
if do_suspend_hybrid; then
NOW=$(cat "$PM_RTC/since_Epoch")
if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ]; then
log "Woken by RTC alarm, hibernating."
# if hibernate fails for any reason, go back to suspend_hybrid.
do_hibernate || do_suspend_hybrid
else
echo > "$PM_RTC/wakealarm"
fi
else
# when do_suspend is being called, convert to suspend_hybrid.
do_suspend_hybrid
fi
Uswsuspを使用すると、サスペンド/ハイバネートの進行状況と逆プロセスがテキストで表示されます。バックスペースを押して中止することもできます。 uswsuspを使用しないと、特にwakealarmがトリガーされて休止状態(uswsuspのs2disk)を実行する場合に、サスペンド/休止状態がうっとうしく表示されます。休止状態になる前のスリープ期間をpm-functionsファイルの通常の場所に設定します。
# variables to handle hibernate after suspend support
PM_HIBERNATE_DELAY=900 # 15 minutes
PM_RTC=/sys/class/rtc/rtc0
Uswsusp modは次のとおりです(このモジュールはpm-functionsから呼び出されるため、挿入される変数は同じです)。
#!/bin/sh
# disable processing of 90chvt and 99video.
# s2ram and s2disk handle all this stuff internally.
uswsusp_hooks()
{
disablehook 99video "disabled by uswsusp"
}
# Since we disabled 99video, we need to take responsibility for proper
# quirk handling. s2ram handles all common video quirks internally,
# so all we have to do is translate the HAL standard options to s2ram options.
uswsusp_get_quirks()
{
OPTS=""
ACPI_SLEEP=0
for opt in $PM_CMDLINE; do
case "${opt##--quirk-}" in # just quirks, please
dpms-on) ;; # no-op
dpms-suspend) ;; # no-op
radeon-off) OPTS="$OPTS --radeontool" ;;
reset-brightness) ;; # no-op
s3-bios) ACPI_SLEEP=$(($ACPI_SLEEP + 1)) ;;
s3-mode) ACPI_SLEEP=$(($ACPI_SLEEP + 2)) ;;
vbe-post) OPTS="$OPTS --vbe_post" ;;
vbemode-restore) OPTS="$OPTS --vbe_mode" ;;
vbestate-restore) OPTS="$OPTS --vbe_save" ;;
vga-mode-3) ;; # no-op
save-pci) OPTS="$OPTS --pci_save" ;;
none) QUIRK_NONE="true" ;;
*) continue ;;
esac
done
[ $ACPI_SLEEP -ne 0 ] && OPTS="$OPTS --acpi_sleep $ACPI_SLEEP"
# if we were told to ignore quirks, do so.
# This is arguably not the best way to do things, but...
[ "$QUIRK_NONE" = "true" ] && OPTS=""
}
# Since we disabled 99video, we also need to handle displaying
# help info for the quirks we handle.
uswsusp_help()
{
echo # first echo makes it look nicer.
echo "s2ram video quirk handler options:"
echo
echo " --quirk-radeon-off"
echo " --quirk-s3-bios"
echo " --quirk-s3-mode"
echo " --quirk-vbe-post"
echo " --quirk-vbemode-restore"
echo " --quirk-vbestate-restore"
echo " --quirk-save-pci"
echo " --quirk-none"
}
# This idiom is used for all sleep methods. Only declare the actual
# do_ method if:
# 1: some other sleep module has not already done so, and
# 2: this sleep method can actually work on this system.
#
# For suspend, if SUSPEND_MODULE is set then something else has already
# implemented do_suspend. We could just check to see of do_suspend was
# already declared using command_exists, but using a dedicated environment
# variable makes it easier to debug when we have to know what sleep module
# ended up claiming ownership of a given sleep method.
if [ -z "$SUSPEND_MODULE" ] && command_exists s2ram && \
( grep -q mem /sys/power/state || \
( [ -c /dev/pmu ] && check_suspend_pmu; ); ); then
SUSPEND_MODULE="uswsusp"
do_suspend()
{
WAKETIME=$(( $(cat "$PM_RTC/since_Epoch") + PM_HIBERNATE_DELAY))
echo >"$PM_RTC/wakealarm"
echo $WAKETIME > "$PM_RTC/wakealarm"
if do_suspend_hybrid; then
NOW=$(cat "$PM_RTC/since_Epoch")
if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ]; then
log "Woken by RTC alarm, hibernating."
# if hibernate fails for any reason, go back to suspend_hybrid.
do_hibernate || do_suspend_hybrid
else
echo > "$PM_RTC/wakealarm"
fi
else
# when do_suspend is being called, convert to suspend_hybrid.
do_suspend_hybrid
fi
}
fi
if [ -z "$HIBERNATE_MODULE" ] && \
[ -f /sys/power/disk ] && \
grep -q disk /sys/power/state && \
[ -c /dev/snapshot ] &&
command_exists s2disk; then
HIBERNATE_MODULE="uswsusp"
do_hibernate()
{
s2disk
}
fi
if [ -z "$SUSPEND_HYBRID_MODULE" ] &&
grep -q mem /sys/power/state && \
command_exists s2both && \
check_hibernate; then
SUSPEND_HYBRID_MODULE="uswsusp"
do_suspend_hybrid()
{
uswsusp_get_quirks
s2both --force $OPTS
}
if [ "$METHOD" = "suspend_hybrid" ]; then
add_before_hooks uswsusp_hooks
add_module_help uswsusp_help
fi
fi
Ubuntu 16.04に対するuser68186による回答は、私にとってはうまくいきませんでした。しかし、解決策は here でした。
最初に、休止状態が機能することを確認します。それから
Ubuntu Softwareでdconf Editorを検索してインストールします。それを起動し、組織-> gnome->設定デーモン->プラグイン->電源に移動します。
「lid-close-ac-action」および「lid-close-battery-action」の値を変更します。
電源設定では、これらのオプションは空白として表示されますが、意図したとおりに機能します。
buntu 18.04では、はるかに簡単です。 systemdでは、新しいモードsuspend-then-hibernateが利用可能です。この関数の使用を開始するには、次のコンテンツを含むファイル/ etc/systemd/sleep.confを作成する必要があります。
[Sleep]
HibernateDelaySec=3600
次に、コマンドでテストできます。
Sudo systemctl suspend-then-hibernate
(HibernateDelaySecを編集して、休止状態への遅延を減らすことができます)。すべてが正常に機能する場合、Lid Close Actionを変更できます。変更するには、ファイルを編集する必要があります/ etc/systemd/logind.conf
オプションHandleLidSwitch =を見つけて、コメントを外してHandleLidSwitch = suspend-then-hibernate。次に、次のコマンドでlogindサービスを再起動する必要があります(警告!ユーザーセッションが再起動されます)。
systemctl restart systemd-logind.service
それで全部です!これで、このNice関数を使用できます。