MAC實現睡眠和休眠喚醒



因為蘋果默認為休眠文件加密,Clover 是無法解密的。所以需要經過一些設置才能破除這無節操的加密文件sleepimage。在這之前不得不提下EmuVariableUefi-64.efi 這個驅動。我們知道UEFI 主板一般都支持NVRAM 保存功能,也就是保存亮度,音量等信息,這樣開機后就能還原到和關機前一樣的狀態。蘋果機器也是如此。但是一些主板是沒有NVRAM 功能的,這時候EmuVariableUefi 就派上用處了(Emulated Variable 模擬變量)。它能在內存中模擬NVRAM 中所有變量並保存到內存里,在關機時寫入到硬盤上,也就是大家熟悉的Nvram.plist 文件。但是這根本不是蘋果所設計的。在休眠過程中,內存是處於斷電狀態,也就是說內存中模擬的NVRAM 將會消失。所以為了避免這個問題,我強烈建議大家能刪除EmuVariableUefi 的盡量刪除,以達到更接近蘋果機的方式。

下面言歸正傳,破解休眠加密的方法因EmuVariableUefi 存在與否略有不同。
如果你的機器不需要EmuVariableUefi,終端輸入:

  1. sudo pmset -a hibernatemode 57
復制代碼

*這是最好的模式,是帶休眠預覽的。

如果你的機器需要EmuVariableUefi,終端輸入:

  1. sudo pmset -a hibernatemode 29
復制代碼

*無休眠預覽。

可能有些人好奇上面的數字是怎么來的,我就順便介紹些hibernatemode 每個數字的意義吧。首先hibernatemode 長度是一個字節,也就是8個2進制數字組成。從蘋果官網可以查到某些數字的定義,也就是:

  1. ____ ___1 (bit 0) 開啟休眠,如果為0則是睡眠。
  2. ____ __1_ (bit 1) 和bit 0 一起使用。當休眠開啟后,系統會先進行睡眠,這樣能夠快速喚醒。但當電量低於臨界值時自動斷電休眠。這也是蘋果默人的方式,安全休眠模式。
  3. ____ 1___ (bit 3) 利用動態空間管理去除非活躍空間進行休眠,占用更少的空間。
  4. ___1 ____ (bit 4) 利用動態空間管理去除更多的空間進行休眠,占用更少的空間。
復制代碼


后來大神們又從kernel源代碼中發現了當hibernatemode 含有0x20(也就是bit 5)時,kernel 才會設定boot-switch-vars。休眠文件加密則是由bit 2 控制,設為1 時會取消加密。

現在我們就可以分析上面hibernatemode 數字的意義了。29 = 0b0001 1101,其中bit 0,2,3,4 全部為1,也就是直接休眠(而不是事先睡眠),並盡量減少睡眠文件的大小,使用不加密的格式。這樣Clover 在喚醒時就能直接讀取休眠文件,從而實現喚醒。但是缺點是Clover 無法支持休眠預覽功能。而boot-switch-vars 必須由EmuVariableUefi 驅動管理,不是kernel,所以bit 5 是0。

推薦的57 = 0b0011 1001,bit 0,3,4,5 設定為1,這樣的好處是boot-switch-vars 交給kernel 而不是Clover。休眠文件也可以是加密的,因為喚醒由kernel 完成。

推薦的59 = 0b0011 1011,bit 0,1,3,4,5 設定為1,這樣的好處是boot-switch-vars 交給kernel 而不是Clover,先是睡眠,在經過一段時間之后休眠。休眠文件也可以是加密的,因為喚醒由kernel 完成。

 

在10.11.x,pmset不能直接修改hibernatemode,如果想自由切換hibernatemode,直接修改/Library/Preferences/SystemConfiguration/com.apple.PowerManagement.plist,重新啟動即可。

在10.12.x,pmset不能直接修改hibernatemode,如果想自由切換hibernatemode,直接修改/Library/Preferences/com.apple.PowerManagement-xxxxxxxxxxx.plist,重新啟動即可。

 

到此為止休眠部分結束!

 

在我的x220上,設置hibernatemode=3,standby=1,standbydelay=3600,clover中boot參數增加NeverHibernate=true,這是最好的方式。可能是clover對休眠恢復支持不好,只能禁止這個功能。

一段時間空閑后,機器進入睡眠狀態,只有內存帶電,電源鍵燈進入呼吸狀態,此時可按Fn健,從睡眠喚醒。

在睡眠狀態,經過3600秒后,將內存中的數據寫入硬盤后,進入休眠狀態,此時機器全部斷電,需要按電源鍵啟動,恢復到機器當初工作的狀態。

可按Fn+F4直接進入休眠狀態。

 

----------------------------------

 

macOS的睡眠和休眠

 

蘋果的睡眠指的是僅僅內存供電,電腦可快速喚醒,斷電后,所有未保存的數據丟失。

蘋果的休眠(安全睡眠或者叫深度睡眠)指的是電腦完全斷電,內存中的內容寫入磁盤,休眠喚醒后可從磁盤恢復上次工作時的內容,數據不會丟失。

 

使用的命令是pmset,相關的參數有:

lidwake: 當屏幕掀開的時候喚醒Mac,1是開啟  0是關閉

autopoweroff: 如果Mac處於睡眠狀態經過指定的時間后,自動把內存數據寫入硬盤,並切斷所有部件的電源,進入休眠狀態,1是開啟  0是關閉。但是LZ發現就算是處於開啟狀態,這個功能也並沒有起作用,你可以不管它,也可以關掉

autopoweroffdelay:啟用autopoweroff功能的時間,也就是上面說的那個“指定的時間”,單位是秒

standby:功能跟autopoweroff一樣,不過僅在hibernatemode為3的時候起作用,1是開啟 0是關閉。不過LZ一直沒搞明白autopoweroff跟standby有什么不一樣,按理說應該是不一樣的

standbydelay:啟用standby功能的時間,單位也是秒

ttyskeepawake:遠程用戶正在活動時防止Mac進入睡眠,1是開啟  0是關閉

hibernatemode:睡眠模式

darkwakes:這個就是Power Nap,你可以在系統偏好設置里選擇開或關,跟在這里設置是一樣的,1是開啟  0是關閉

hibernatefile:內存鏡像存放的地址,這個也可以更改,不過路徑必需是root下的路徑

displaysleep:Mac閑置多長時間后進入顯示器睡眠,2013款Air的系統偏好設置里已經沒有這個選項了,Pro是有的,不過其實你可以通過pmset來修改。單位是分鍾,這個時間不能長於sleep下設置的時間

sleep:Mac閑置多長時間后進入睡眠,這個系統偏好設置里也有,單位是分鍾

acwake:電源改變時喚醒,也就是插上或者拔掉外置電源時喚醒Mac,1是開啟  0是關閉

halfdim:顯示器睡眠時使顯示器亮度改變為當前亮度的一半,1是開啟  0是關閉。如果關閉這個功能的話,顯示器睡眠會直接關掉顯示器。

lessbright:使用電池時使顯示器亮度暗一點,系統偏好設置里也有這個,1是開啟  0是關閉

disksleep:Mac閑置多長時間后關閉硬盤。這個系統偏好里也有,只不過換了一個字眼—如果可能,使硬盤進入睡眠—勾上這個的話系統就會自動根據sleep的時間設一個合適的時間。單位是秒,這個時間不能長於sleep下設置的時間

sleepservice:LZ還沒搞清楚這個是干嘛的,請知道的鋒友解釋下。

womp:網絡遠程喚醒,1是開啟  0是關閉

networksleep:這個設置影響Mac在睡眠的過程中如何提供網絡共享服務,最好就不要動。

 

要更改某一項設置的話也很簡單,打開終端,按下面的格式輸入命令:

sudo pmset -# $ &

 

其中#號有4個參數,分別是:c   b    u    a,作用是表明這個命令修改的是哪個電源設置下的參數。c代表外接電源、b代表電池、u代表UPS、a代表所有電源。

$就是具體的某一項參數,例如你想修改睡眠模式,那就是hibernatemode;修改睡眠閑置時間,是sleep。

&是參數的值

 

例如你想修改外接電源是Mac的顯示器睡眠閑置時間為10分鍾,那就輸入:

sudo pmset -c displaysleep 10

 

想修更改所有電源下的硬盤睡眠閑置時間為15分鍾,那就是:

sudo pmset -a disksleep 15

 

比較有興趣的參數:

hibernatemode

standby

standbydelay

autopoweroff 

autopoweroffdelay

這幾個參數組成了 OSX 的睡眠模式。

 

hibernatemode = 0 by default on desktops. The system will not back memory up to persistent storage. The system must wake from the contents of memory; the system will lose context on power loss. This is, historically, plain old sleep.

 

hibernatemode = 3 by default on portables. The system will store a copy of memory to persistent storage (the disk), and will power memory during sleep. The system will wake from memory, unless a power loss forces it to restore from hibernate image.

 

hibernatemode = 25 is only settable via pmset. The system will store a copy of memory to persistent storage (the disk), and will remove power to memory. The system will restore from disk image. If you want "hibernation" - slower sleeps, slower wakes, and better battery life, you should use this setting.

 

standby causes kernel power management to automatically hibernate a machine after it has slept for a specified time period. This saves power while asleep. This setting efaults to ON for supported hardware. The setting standby will be visible in pmset -g if the feature is supported on this machine.

 

standbydelay specifies the delay, in seconds, before writing the hibernation image to disk and powering off memory for Standby.

 

autopoweroff is enabled by default on supported platforms as an implementation of Lot 6 to the European Energy-related Products Directive. After sleeping for <autopoweroffdelay> seconds, the system will write a hibernation image and go into a lower power chipset sleep. Wakeups from this state will take longer than wakeups from regular sleep.

 

autopoweroffdelay specifies the delay, in seconds, before entering autopoweroff mode.

 

可見,Apple 的安全睡眠其實是個統稱,具體是由2個參數激發的,這2個參數都可以在普通睡眠一段時間后讓電腦進入深度睡眠狀態。

對於平常的使用,建議設置

sudo pmset -a hibernatemode 3 

sudo pmset -a standby 1 

sudo pmset -a standbydelay 1800 

這樣電腦在睡眠1800秒之后,內存中的數據全部會保存到硬盤,然后進入休眠,下次啟動后可恢復到原先的工作狀態。

 

當然如果你不想將內存中的數據寫入硬盤,可以如下設置:

sudo pmset -a hibernatemode 0 

sudo pmset -a autopoweroff 0 

sudo pmset -a standby 0 

sudo rm /var/vm/sleepimage

然后不管你怎么重啟,睡眠n久,都不會再生成內存鏡像文件了,當然你的電腦就無法再進入深度睡眠模式,Apple 官方說電池待機能力可能會稍稍降低,但我看也未必,普通睡眠狀態下電壓已經非常小了。

 

另外,Clover啟動sleepimage文件似乎並不是特別的好,可以對Clover中boot參數增加NeverHibernate=true,禁止這個功能。從Clover重新啟動后,仍然能夠恢復到原先的工作內容。

 

在X220中的實驗結果,設置:

sudo pmset -a hibernatemode 3 

sudo pmset -a standby 1 

sudo pmset -a standbydelay 1800 

Clover中boot參數增加NeverHibernate=true

睡眠、休眠正常,從Clover啟動后,恢復睡眠前的工作內容。並且可以直接按Fn+F4直接進入休眠,此時電源燈停止呼吸,電腦全部斷電,按電源鍵恢復原先的工作內容。

 

如果各位對Clover的休眠恢復,有什么好的建議,可以跟帖回復。

謝謝!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM