掛起睡眠和休眠的區別
三種存儲當前運行狀態數據(前后台進程服務,不包含buff cache等)的方式
-
掛起suspend 存儲到內存 設備通電 低功耗
-
睡眠hybrid-sleep 存儲到內存和磁盤 設備通電 低功耗
-
休眠hibernate 存儲到磁盤 設備斷電 即設備會關機
三者其實都是suspend,只是存儲位置和通電狀態不同,三者分別可稱為suspend to ram、suspen to ram and disk和suspend to disk,簡稱str、strd和std,意思很直白。
掛起也被稱為暫停或待機,一般的,系統一段時間沒有操作,系統就會掛起(到內存中),多數外圍設備會關閉,某些設備會運行(如鍵盤鼠標),可以快速響應這些設備從而喚醒系統。
休眠也被稱為冬眠(hibernate實為冬眠之意),保存運行狀態存到硬盤中,然后關機。下次開機后,系統從硬盤中讀取存儲的數據並恢復到關機前的狀態。
睡眠更准確的名稱應該是混合睡眠,所謂混合即存儲方式上包含了掛起和休眠兩種方式,喚醒時會優先從內存中讀取數據,如果設備在此狀態下斷電,就和休眠一樣了。
linux休眠配置
一些linux發行版的休眠需要用戶進行配置才能使用。
開啟休眠
按照以下步驟設置。
-
合適大小的swap分區
休眠(hibernate)需要將內存中的內容寫入磁盤的swap分區,如果swap分區大小比當前休眠所需空間小,則無法保證能夠正確地休眠。具體的swap的大小根據個人使用情況(要休眠時的內存占用)而定。
因此,如果 swap 分區過小,需增大 swap分區或減小/sys/power/image_size
。注意:brtfs格式無法設置swap分區;這里的swap是swap分區而不包括swap file的情況。
-
在bootloader 中增加resume內核參數
需要添加
resume=/dev/sdxY
(sdxY 是 swap分區的名字) ,讓系統在啟動時讀取swap分區中的內容。例如,使用了grub2作為bootloader,swap的分區是/dev/sda3。
編輯/etc/default/grub
文件,在GRUB_CMDLINE_LINUX_DEFAULT
中添加resume=/dev/sda3
,假如該行的原有內容是:GRUB_CMDLINE_LINUX_DEFAULT=”quiet intel_pstate=enable”
添加resume參數后就是:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_pstate=enable resume=/dev/sda3"
然后更新 grub 配置
grub-mkconfig -o /boot/grub/grub.cfg
-
配置 initramfs的resume鈎子
編輯 /etc/mkinitcpio.conf
,在HOOKS
行中添加resume
鈎子:
例如該行原有內容是:
HOOKS="base udev autodetect modconf block filesystems keyboard fsck"
添加resume
后就是:
HOOKS="base udev resume autodetect modconf block filesystems keyboard fsck"
注意:如果使用lvm分區,需要將resume
放在lvm
后面,示例:
HOOKS="base udev autodetect modconf block lvm2 resume filesystems keyboard fsck"
重新生成 initramfs 鏡像: mkinitcpio -p linux
設置低電量休眠
當電池電量極低時,使其休眠,以免丟失數據。
修改/etc/UPower/UPower.conf
相關配置,示例,在電量低至%5時自動休眠:
PercentageLow=15 #<=15%低電量
PercentageCritical=10 #<=10%警告電量
PercentageAction=5 #<=5%執行動作(即CriticalPowerAction)的電量
CriticalPowerAction=Hibernate #(在本示例中是電量<=5%)執行休眠
當電池低至5%,設備會自動休眠。
CriticalPowerAction的取值有Poweroff、Hibernate和Hybid-sleep。
更多配置項參考該文件中的說明。
設置蓋上蓋子或按下電源鍵休眠
編輯/etc/systemd/logind.conf ,
蓋上蓋子休眠,添加:
HandleLidSwitch=hibernate
按下電源鍵休眠,添加:
HandlePowerKey=hibernate
執行 systemctl restart systemd-logind
使其立即生效。
更加詳細的設置參看下文。
systemd 能夠處理某些電源相關的事件,編輯 /etc/systemd/logind.conf 可進行配置,其主要包含以下事件:
- HandlePowerKey:按下電源鍵
- HandleSleepKey:按下掛起鍵
- HandleHibernateKey: 按下休眠鍵
- HandleLidSwitch:合上筆記本蓋
- HandleLidSwitchDocked:插上擴展塢或者連接外部顯示器情況下合上筆記本蓋子
取值可以是 ignore、poweroff、reboot、halt、suspend、hibernate、hybrid-sleep、lock 或 kexec。
其中:
-
poweroff和halt均是關機(具體實現有區別)
-
supspend是掛起(暫停),設備通電,內容保存在內存中
-
hybernate是休眠,設備斷電(同關機狀態),內容保存在硬盤中
-
hybrid-sleep是混合睡眠,設備通電,內容保存在硬盤和內存中
-
lock是鎖屏
-
kexec是從當前正在運行的內核直接引導到一個新內核(多用於升級了內核的情況下)
-
ignore是忽略該動作,即不進行任何電源事件響應
注意,系統默認設置為:
HandlePowerKey=poweroff #按下電源鍵關機
HandleSuspendKey=suspend #按下掛起鍵掛起(暫停)
HandleHibernateKey=hibernate #按下休眠鍵休眠
HandleLidSwitch=suspend #蓋上筆記本蓋子掛起
例如要設置蓋上筆記本蓋子進行休眠,在該文件中配置:
HandleLidSwitch=hibernate
保存文件后,執行 systemctl restart systemd-logind
使其生效。