Acpi

可以從核心修改 ACPI 喚醒狀態嗎?

  • May 3, 2016

最近我開始使用 Wake-on-LAN 來讓我的家庭設置更舒適一些,但在此過程中我對 ACPI 配置感到好奇。

快速檢查後,我注意到我的乙太網控制器支持 WOL,所以我嘗試了一下:

Settings for eth0:
   [...]
   Supports Wake-on: pumbg
   Wake-on: g

經過一些測試,我意識到:

  • 當我的電腦暫停時,WOL 在另一台設備上工作正常。
  • 當我的電腦關機時,什麼也沒有發生。

現在的問題是,我想使用 WOL,這樣我的電腦就可以在我回家之前做好準備。如果我需要將電腦保持在掛起模式以使其工作(無論如何系統將在幾秒鐘內恢復),我就不需要該功能。

我調查了一下,發現我的乙太網卡有一個 S4 S-state條目/proc/acpi/wakeup

Device  S-state   Status    Sysfs node
PXSX    S4        *enabled  pci:0000:09:00.0

根據我的閱讀,這意味著當且僅當系統處於狀態 S4(或更低)(對應於休眠)時,我的乙太網控制器可以用作觸發器。這解釋了為什麼我可以在掛起模式 (S1/S3) 下使用 WOL,但在我執行後卻不能使用poweroff(我相信這會將機器置於 S5,軟關閉)。

我對 ACPI 不是很熟悉,而且我在硬體方面的知識肯定不會擴展到乙太網控制器。我想知道的是:有什麼方法可以讓我的系統保持 S5 中乙太網控制器的電源(當系統關閉時)?我的(3.13)Linux核心在那裡有發言權,還是完全取決於我的主機板(或控制器)的設計?

似乎我可以通過寫入來決定哪些設備可以用作觸發器/proc/acpi/wakeup(我相信現在已棄用)。但是我可以更具體一點,並決定設備在哪個狀態下可以喚醒機器嗎?

這取決於主機板的設計。

/proc/acpi/wakeup是根據 ACPI 表中主機板的自我描述生成的。它列出了您的電腦可用於喚醒事件的所有設備以及主機板支持這些喚醒的狀態。您不能比啟用/禁用喚醒源更具體,但 BIOS 菜單中可能有更多設置。

你說得對,poweroff將機器置於 S5 中。但是 S5 和 S4 是非常相似的狀態。通常唯一的區別是主機板晶片上寄存器中的一些位在休眠時設置。這意味著就硬體而言,如果您設法通過戳主機板的 I/O 埠或寫入 I²C 設備來手動更改相關寄存器,則通常可以配置從 S5 喚醒。您需要閱讀晶片組、SuperIO 晶片等的數據表才能使其正常工作。或者,也可以修改init守護程序以將關閉序列的最後一部分替換為休眠+重新啟動之類的內容,以強制 BIOS 保持喚醒源處於活動狀態。

由於您的機器支持從 S4 喚醒,因此最簡單的解決方案是使用休眠(例如 via pm-hibernate)而不是使用poweroff.

引用自:https://unix.stackexchange.com/questions/277139