Wake from Sleep-修護修眠喚醒

前言

許多用戶經常詢問有關如何處理睡眠喚醒問題的問題,不管是在使用 Monterey 還是之前的系統版本中,這種情況都不罕見。在探討問題之前,我們需要注意的是,在 Hackintosh 上,睡眠喚醒問題的常見原因可能包括引導文件配置的 USB3.0 端口不正確、局域網唤醒、不兼容的 USB 設備等等。這些問題在過去的教學中已被多次討論,因此我不會在這裡再次重複。

接下來,我將詳細記錄我對這個問題的調查和整理,以幫助您更好地理解問題,以及我是如何得出解決方案的。如果您想直接跳轉到解決方案,請下滑到名為“阻止系統訪問 AutoWake plist 的方法”的部分。不過,我建議您在閱讀本文時全文閱讀,因為其中包含一些您可能不知道的重要信息和命令範例。

免責聲明:以下的調查、結論和解決方案僅代表我對這個問題的觀點。目前可能存在一些假設的問題,但我會盡力進一步調查和確認這些假設,並在需要時更新本文。

由於這個問題似乎是針對 MacOS Ventura 的固有特徵,一些真正的白蘋果用戶(Intel 和 AS)也受到了這個問題的影響。我在本文末尾提出的解決方案也應該適用於真正的 Mac。

調查ㄧ(Wake Reasons

透過以下終端命令快速獲取 MacOS 睡眠/喚醒系統的摘要:

pmset -g stats

這將產生類似以下的輸出:

Last login: Sun May 12 00:03:35 on console
sky@iMac ~ % pmset -g stats
Sleep Count:5
Dark Wake Count:10
User Wake Count:4

這告訴我們以下信息:

  • 我們將系統置於睡眠狀態的次數(睡眠次數)。
  • 系統在睡眠期間自動喚醒的次數(深度喚醒次數)。
  • 用戶喚醒系統的次數(用戶喚醒次數)。 大多數人都想阻止那些討厭的深度喚醒。

接下來,我們需要查看特定的喚醒原因,請輸入以下終端命令:

log show --last boot --style syslog | fgrep "Wake reason"

這將列出自上次啟動以來的所有喚醒事件,看起來會像這樣:

sky@iMac ~ % pmset -g
System-wide power settings:
Currently in use:
standby 1
Sleep On Power Button 1
womp 0
hibernatefile /var/vm/sleepimage
proximitywake 0
powernap 0
gpuswitch 2
networkoversleep 0
disksleep 10
standbydelayhigh 86400
sleep 1 (sleep prevented by sharingd)
hibernatemode 0
ttyskeepawake 1
displaysleep 60
highstandbythreshold 50
standbydelaylow 86400

如上面資料所示, 在列表中缺少了 tcpkeepalive 0。

當您發現 pmset -g 的輸出包括 tcpkeepalive,並且使用命令 sudo pmset -a tcpkeepalive 0 將其設置為 0,那麼您很可能不需要進行其他操作,因為這應該會禁用計劃的 PM 喚醒,但是由於這在我的系統上不起作用,我無法完全確定是否是這種情況。

假設您正在運行 MacOS Ventura,或者是您可以在下面的案例中確認 tcpkeepalive 是否在您的系統上工作,那將非常有用,因為這將有助於確定問題的程度,請說明您正在運行的 MacOS 版本以及您正在使用的 SMBIOS,如果您有多個系統,如果您能包括您使用的主機板和 CPU 世代,那也將有助於解決問題,請還包括 pmset -g 的輸出。

迄今為止的調查結果

已確認 TCPKEEPALIVE 不起作用的 SMBIOS

  • iMac18,1
  • iMac19,1
  • iMac20,2
  • MacPro6,1
  • MacPro7,1

** 已確認 TCPKEEPALIVE 正常工作的 SMBIOS

  • iMacPro1,1
  • MacPro7,1

** ** MacPro7,1 是一個有些奇怪的情況,因為我已經確認 TCPKEEPALIVE 有時候工作有時候不工作,所以不太確定如何處理??

當我測試過兩台不同 Z490黑果主機,運行 MacOS Ventura 13.1 系統,設定 iMac20,2 SMBIOS(iMac 5K, 27″ 2020)。

那麼我們可以從中得出什麼結論呢?

某些 Mac 型號上可以使用 pmset tcpkeepalive 命令,但在其他 SMBIOS 型號上不起作用,這讓我有希望可以通過核心補丁重新啟用它,類似於當運行不支持某些功能的 SMBIOS 時,FeatureUnlock kext 可以解鎖某些功能。這種方法需要對內核進行更深入的調查,但理論上應該是可行的。這裡有 acidanthera 開發團隊討論串鏈接:

https://github.com/acidanthera/bugtracker/issues/2208

調查三(定時的 PM 喚醒事件)

為證明了 pmset tcpkeepalive 命令在我的黑果主機不再起作用後,我將焦點轉移到了定時的 PM 事件本身。雖然我目前無法證明這一點,但我懷疑 Ventura 生成了比以前的 MacOS 版本更多的定時的 PM 喚醒事件,當我注意到自從升級到 Ventura 後,它在系統睡眠時白天和晚上醒來的次數要多得多,而過去在運行舊版本的 MacOS 時並沒有發生過。也有可能定時的喚醒次數與以前的 MacOS 版本相同,但由於 pmset tcpkeepalive 命令不再起作用,它們更加明顯。

我們可以通過查看系統信息 -> 電源來輕鬆檢查定時的 PM 喚醒事件。 定時的 PM 喚醒事件將在右側窗口的下部部分列出,如下所示:

我們還可以使用以下命令在終端中列出預定的電源事件:-

pmset -g sched

通過將列出的事件與使用命令 log show –last boot –style syslog | fgrep “Wake reason” 列出的 (ALARM) 喚醒事件進行比較,我們可以推斷 Ventura 中喚醒事件的主要原因是由以下兩個預定事件引起的:-

com.apple.alarm.user-visible-com.apple.CalendarNotification.EKTravelEngine.periodicRefreshTimer
com.apple.alarm.user-visible-com.apple.acmd.alarm

還有一些其他事件,但這兩個似乎出現的頻率更高,在以前的 MacOS 版本中,我們可以使用以下終端命令手動管理列出的預定 PM 喚醒事件:-

sudo pmset schedule cancelall

將取消當前列出的事件和 :-

sudo pmset repeat cancel

應該阻止 MacOS 創建任何新的電源管理事件。

如果您對 Pmset 命令不熟悉,請閱讀以下訊息已獲取更多幫助。

展開:Pmset 命令 – 幫助
注意:如果您在系統信息中查看事件,您必須單擊“文件”->“刷新信息”才能查看上述命令的更改。

不幸的是,在我的調查中,我發現這些命令似乎只在 Ventura 中適用於接下來的幾個預定的 PM 事件,Ventura 最終將開始創建新的預定的 PM 事件,而不管我們是否使用了 sudo pmset repeat cancel 命令。

結論是在某些基於桌面的 Mac 上,目前沒有簡單的方法來永久禁用 MacOS Ventura 中的預定 PM 喚醒事件,因為 pmset tcpkeepalive 命令不起作用,並且取消重複預定的喚醒事件的命令也不起作用,這表明這種行為是有意設計的。是否還有其他的原因?目前也無從得知。

或許有些市面上販售的電源供應器,已加載預定的 PM 喚醒功能並不是太大的問題,系統會醒來,執行預定的 PM 事件,然後系統立即進入睡眠。在我的系統上,預定的 PM 喚醒事件通常需要 30-50 秒才能執行(從醒來到再次進入睡眠)。

在運行/休眠在電池上的筆記本 Hackintosh 上,預定的 PM 喚醒(和 RTC 喚醒)顯然會導致待機電池耗盡,這是許多 Windows 用戶在微軟推出 Windows Modern Standby 後都熟悉的問題,在這種情況下,很多用戶發現他們的筆記本電池已經完全耗盡,因為系統在睡眠期間一直在忙碌。

我個人是希望它保持睡眠,直到我決定將其喚醒。我可以理解有時預定的喚醒可能是有用的,但是桌面系統每隔幾個小時醒來的當前默認行為對大多數用戶來說是不可接受的。

如果這是蘋果的想法,那麼他們應該在 Ventura 中告知用戶這種行為,並理想情況下給用戶啟用或禁用該功能的能力(默認情況下禁用)。

嘗試遏制 Ventura 中的定時 PM 喚醒事件是在系統進入睡眠前和醒來後發出以下連接的終端命令:-

sudo pmset schedule cancelall; pmset repeat cancel

這理論上要麼完全停止預定的 PM 喚醒事件,至少能減少預定的 PM 喚醒次數。我使用 Better Touch Tool 實現了這一點,它可以在睡眠前和睡眠後運行自定義事件。

經測試發現,喚醒事件的數量減少了約 50%,但我仍然發現系統在夜間至少醒來了六次或更多。雖然這是進步,但對我來說仍然是無法接受的,因此需要進一步調查。

調查四(深入研究預定的 PM 事件)

我認為預定的 PM 事件必定保存在 MacOS 系統的某個地方,其中計劃程序可以讀取、寫入和刪除 PM 事件。

在 MacOS 文件系統中尋找一番後:

在確定系統存儲預定的 PM 事件的位置後,解決方案很簡單,就是停止系統讀取/寫入存儲當前會話中當前打開的應用程序和窗口位置的 plist,我在這個文章中詳細介紹了這個問題:-

https://imacpc.net/guide-permanently-disable-macos-from-re-opening-apps-on-restart-boot

這個解決方案的方法是改變文件的所有者並移除所有權限,這樣系統就無法更新該文件,從而永久阻止了 MacOS 在任何重新啟動/啟動時重新打開應用程序。這種方法之所以有效,是因為該文件位於用戶庫文件夾(~/Library)中,但是對於 com.apple.AutoWake.plist,這種方法不起作用,因為它位於安全且鎖定的 MacOS 系統驅動器中,所以我們需要使用不同的命令來實現類似的結果。

防止系統訪問 AutoWake plist 的方法:

  1. 打開終端機。
  2. 首先,確保 com.apple.AutoWake.plist 文件是空的,使用以下命令:sudo pmset sched cancelall。
  3. 接下來,使用 chflags 命令設置不可變標誌以鎖定/保護文件:
    sudo chflags schg /Library/Preferences/SystemConfiguration/com.apple.AutoWake.plist。
  4. 重新啟動系統。

以上方法將阻止系統計劃程序能夠寫入 com.apple.AutoWake.plist 文件(但仍然可以從中讀取),從而停止預定的 PM 喚醒事件。

在某些情況下,可能需要一兩次重新啟動才能使事情穩定下來,並使修復生效,但我向您保證,根據我的測試和其他用戶的反饋,這個解決方案是有效的。

如果您需要撤消更改,只需使用終端命令刪除不可變標誌:

sudo chflags noschg /Library/Preferences/SystemConfiguration/com.apple.AutoWake.plist

如果您不熟悉 chflags 命令,以下是關於chflags命令說明。

chflags

更改文件或文件夾的標誌。

語法
chflags [-R [-H | -L | -P]] flags file ...

選項
-R 遞歸:更改根源於文件的文件層次結構的文件標誌,而不僅僅是文件本身。

-R -H 在命令行上跟隨符號鏈接,默認情況下不跟隨樹中的符號鏈接。

-R -L 所有符號鏈接都被跟隨。

-R -P 不跟隨任何符號鏈接。(默認)

標誌以八進制數字或逗號分隔的關鍵字列表形式指定。

hidden 設置隱藏標誌[從 GUI 中隱藏項目]
關鍵字和關鍵字別名 - 僅限所有者或超級用戶:

opaque 設置不透明標誌
nodump 設置無傾倒標誌
uappnd,uappend 設置用戶追加標誌
uchg,uchange,uimmutable 設置用戶不可變標誌
uunlnk,uunlink 設置用戶不可刪除標誌

關鍵字和關鍵字別名 - 僅限超級用戶:

arch,archived 設置歸檔標誌
sappnd,sappend 設置系統追加標誌
schg,schange,simmutable 設置系統不可變標誌
sunlnk,sunlink 設置系統不可刪除標誌
不可變標誌使文件/文件夾鎖定/受保護,並等同於在 Finder 的「顯示信息」框中鎖定文件。

在選項之前加上 no 會導致標誌關閉。

例如:
uchg 表示文件不能更改
nouchg 表示文件可以更改(不可變位被清除)
hidden 將設置隱藏標誌
nohidden 將刪除隱藏標誌
在 macOS 的早期版本中,鎖定/不可變的文件無法從垃圾桶中刪除。在 Mac OS X 10.1 及更高版本中,可以通過在清空垃圾桶時按下 Shift-Option 或 Option 鍵組合輕鬆刪除已鎖定的文件。

符號鏈接沒有標誌,因此除非設置了 -H 或 -L 選項,否則對符號鏈接執行 chflags 始終成功且不起作用。除非指定了 -R 選項,否則會忽略 -H、-L 和 -P 選項。此外,這些選項會互相覆蓋,命令的操作由最後指定的選項確定。

sappnd 和 schg 標誌只能在系統處於單用戶模式時取消設置。chflags(2)。
使用 ls -lO 查看現有文件的標誌。

如果成功更改模式,則返回狀態為零,如果發生錯誤,則返回大於 0。

示例
鎖定名為「finance」的文件夾,防止更改:
$ chflags uchg finance

解鎖名為「finance」的文件夾,並允許更改所有內容:
$ chflags -R nouchg finance

使文件夾 ~/Library 可見(這是 OS X Lion 之前的默認設置)。
$ chflags nohidden ~/Library
查看庫的另一種方法是在 Finder 中使用「前往」下拉菜單,然後按住 Option 鍵。

從 Finder 隱藏文件夾 ~/Library:
$ chflags hidden ~/Library

將文件 MyLogs.txt 設置為只追加:
$ chflags uappnd MyLogs.txt

解鎖您的 Documents 目錄及其中的所有內容:
$ chflags -R nouchg ~/Documents

警告:請注意,此方法將停止所有預定的 PM 喚醒事件,這將影響到像「尋找我的 Mac」等功能,因此如果您使用這些功能或計劃了需要在系統休眠時運行的預定事件,例如定期備份、郵件收集等,請勿使用此方法,因為系統將不會喚醒以執行它們。

自從應用上述方法後,我沒有看到任何預定的 PM 喚醒事件在系統休眠時喚醒系統,因此看起來這個方法正在按預期工作。我將繼續在接下來的一周左右監視該方法的有效性,並在有需要時更新此帖子的信息。

更新 2023 年 5 月 12 日

自從使用這種方法以來,過去兩周內未發生任何預定的 PM 喚醒或黑暗喚醒,該方法持續完美運作:

sky@iMac ~ % pmset -g stats
Sleep Count:1
Dark Wake Count:0
User Wake Count:1

備註:參考文獻-tonymacx86,經測試整理。

上一篇
下一篇