pm-utils 是一個全新的電源掛起和電源狀態設置框架。它被設計來替代 powersave
包中的相關腳本。
通常HAL使用pm-utilsl來執行一系列的hacks來解決驅動所不能提供的電源掛起方面的操作。可以很方便的在特定目錄當中配置自定義的掛鈎,掛鈎可以由管理員來建立或者是被包含在安裝包當中,如果安裝包需要監視電源的掛起和電源狀態的改變。
可以和 Cpufrequtils 包聯合使用,為筆記本和台式機提供完整的電源管理方案。
安裝
pm-utilsAUR 包可以從官方軟體倉庫安裝:
# pacman -S pm-utils
基本配置
掛起 / 休眠到內存
理想情況下,運行 sudo pm-suspend
將會保存運行程序的狀態到內存並關閉內存之外的設備以節省電能。按下電源鍵會喚醒電腦。
有時 pm-suspend 會掛住,無法正常完成。原因可能是 "不正常" 的模塊。如果知道是哪個模塊導致問題,可以在 /etc/pm/config.d/modules
SUSPEND_MODULES 配置項中加入這些模塊:
SUSPEND_MODULES="uhci_hd button ehci_hd"
在掛起和喚醒電腦時,程序會對它們進行特別處理。
要在合上筆記本蓋等電源事件發生時自動執行 pm-suspend,請參考 Acpid。
待機 / 休眠到磁碟
要使用休眠功能,需要以root的身份編輯 /boot/grub/menu.lst
,並在內核選項中添加 resume=/path/to/swap/drive (e.g. /dev/sda2) 例如:
# (0) Arch Linux title Arch Linux root (hd0,0) kernel /vmlinuz-linux root=/dev/sda3 resume=/dev/sda2 ro initrd /initramfs-linux.img
當計算機進入休眠後,計算機會把內存中的所有信息保存到交換分區(swap partition)... 那麼要求你的交換分區有足夠的空間來保存RAM信息。
Raid swap :
# (0) Arch Linux title Arch Linux root (hd0,0) kernel /vmlinuz-linux root=/dev/md2 resume=/dev/md0 ro md=0,/dev/sda2,/dev/sdb2 md=2,/dev/sda5,/dev/sdb5 vga=773 initrd /initramfs-linux.img
如果你想要使用UUID來代替磁碟編號(UUID使用blkid命令找出,需要超級用戶權限):
# (0) Arch Linux title Arch Linux root (hd0,0) kernel /vmlinuz-linux cryptdevice=/dev/sda2:main root=/dev/mapper/main-root resume=/dev/disk/by-uuid/1d893194-b151-43cd-a89e-6f89bd8b9f99 ro initrd /initramfs-linux.img
當你的機器休眠的時候,數據會從內存轉向swap分區,所以最好swap空間至少要等於內存的。
對於GRUB2,需要修改 /boot/grub/grub.cfg
的"linux"行。這是個例子(注意修改你的UUID):
linux /boot/vmlinuz-linux root=/dev/disk/by-uuid/818dc030-8108-4428-8859-b73a58d0b0f3 ro quiet resume=/dev/sda2
關於永久性的討論,請移步(英文) 論壇.
即使你的swap分區小於內存,也有很大的可能成功的休眠.根據 kernel documentation, /sys/power/image_size
控制休眠到磁碟鏡像的大小,其中有一個500M的默認值。休眠將竭盡所能的確保鏡像的大小不會超過這個閥值。 你可以增加或者減少swap分區的大小來提高休眠的速度.
在非root下執行掛起/休眠
因為必須在root權限下允許 pm-utils
腳本,一般情況下,你希望沒有root密碼的普通用戶來執行這些腳本。這時,你需要使用visudo來編輯 /etc/sudoers
文件,例如:
# visudo
添加如下幾行,記住把 username 替換成你自己的登錄名:
username ALL = (ALL) NOPASSWD: /usr/sbin/pm-hibernate username ALL = (ALL) NOPASSWD: /usr/sbin/pm-suspend
保存並推出 visudo
之後,你可以在普通用戶下允許下面的腳本:
$ sudo pm-hibernate
或者是
$ sudo pm-suspend
同時,把你的用戶加入到 power 組,這樣桌面小應用程式可以使用掛起操作。如果你不這樣做,當你使用如 gnome shutdown 的程序來進行掛起/休眠操作的時候,計算機會發出煩人的聲音和鎖住屏幕。
# gpasswd -a username power
完成以上步驟後,你可以使用 gnome 的電源管理工具 (也許也能使用 kpowersave) 來進行自動的掛起/休眠,比如在合上筆記本上蓋和電池電量不足的時候...
高級配置
主要的配置文件是/usr/lib/pm-utils/defaults
. 但是建議你不要去修改這個文件,因為此文件會隨著軟體包的升級而被重置。如果需要配置可以修改Y/etc/pm/config.d/
。
你可以將下列簡單的配置以"modules" 或 "config"的命名加入/etc/pm/config.d
中,這個設置將會替代系統的一般配置。
SUSPEND_MODULES="button uhci_hcd"
配置文件中一些可以使用的變量
SUSPEND_MODULES="button" # 列表当中的模块将在系统挂起时被卸载。
如何關閉監測(鉤子,hook)程序
如果你不喜歡某個監測程序或覺得某個監測程序無用甚至影響正常使用的話,你可以將他視為一個Bug來報告。當然,我們也可以很簡單的去禁用它。你可以通過管理/etc/pm/sleep.d/
目錄中所對應設備的文件控制監測程序的運行與否。例如:
touch /etc/pm/sleep.d/45pcmcia
你就可以建立一個/usr/lib/pm-utils/sleep.d/45pcmcia
文件,來禁用pcmcia。
對於這個假的鉤子程序不要設置可執行屬性位。
建立你自己的鉤子
如果你想建立一些只屬於你自己的掛起/休眠設置,你只需要簡單的把你的鉤子放到/etc/pm/hooks
。這個文件夾中的鉤子會在掛起的時候按照字母順序執行,並在喚醒過程中按照字母逆序執行(因此通常它們的名字以兩位數字開頭使得順序更加明了)。
以下展示的是一個非實用的鉤子,它會把一些信息寫入你的log文件:
#!/bin/bash case $1 in hibernate) echo "Hey guy, we are going to suspend to disk!" ;; suspend) echo "Oh, this time we are doing a suspend to RAM. Cool!" ;; thaw) echo "oh, suspend to disk is over, we are resuming..." ;; resume) echo "hey, the suspend to RAM seems to be over..." ;; *) echo "somebody is calling me totally wrong." ;; esac
把以上內容寫入/etc/pm/sleep.d/66dummy
文件中,並執行chmod +x /etc/pm/sleep.d/66dummy
,之後在掛起/喚醒過程中它將產生一些無實際作用的行。
注意: 所有的鉤子都以root用戶執行。這意味著你需要在創建臨時文件、檢查PATH環境變量等時候多加小心,以避免安全問題。
工作原理
這個概念看起來很簡單:這些系統腳本 (pm-suspend
、pm-hibernate
、pm-suspend-hybrid
)將會運行名為"hooks"的可執行文件,這些腳本將會按照字母順序進行掛起或休眠。一旦hooks運行成功,電腦就會進入休眠狀態。直到下次喚醒PC時,所有的腳本按照相反的順序從內存或者磁碟恢復工作。hooks做了很多事情,例如準備啟動,停止藍牙工作,或者卸載相關的模塊。
通常,掛起和休眠都會從HAL或者桌面部件中啟用(例如gnome-power-manager、 kpowersave。)
注意: suspend-hybrid
還是一個半成品,並不保證一定可用。
也可以設置電腦在高功耗或低功耗模式下工作,利用這條命令pm-powersave
使用參數true
或 false
。它的工作狀況基本與掛起的情況相同。
管理掛起的hooks文件在以下這些地方:
-
/usr/lib/pm-utils/sleep.d
(發行版提供) -
/etc/pm/sleep.d
(系統管理員添加)
管理電源狀態的hooks文件在以下這些地方:
-
/usr/lib/pm-utils/power.d
(發行版提供) -
/etc/pm/power.d
(系統管理員添加)
在/etc/pm/
的HOOKS會優先於 /usr/lib/pm-utils/
內的HOOKS, 那麼作為系統管理員就可以僅僅設置/etc/pm/
而不用理會發行版提供的HOOKS文件。
已知問題
如果你的休眠與掛起功能不能正常工作,那麼一些有用的信息可能會輸出到這個文件/var/log/pm-suspend.log
,比如運行了哪些HOOK以及他們輸出了什麼。
Resume Hook
系統有時會提示你需要將resume
hook 添加到 initrd image中,,否則內核將提醒你沒有resume. 那麼,使用ROOT權限編輯/etc/mkinitcpio.conf
並且將 resume
添加到 HOOKS 中:
HOOKS="base udev autodetect ide scsi sata resume filesystems "
這只是一個示範,你的HOOKS可以安裝自己的需要編輯。
resume
必須放在 'ide', 'scsi' and/or 'sata' 之後 ,但必須在 'filesystems'之前。這裡應該有一個適當的 'resume' 文件 /lib/initcpio/hooks (修改合適你的配置), hook文件是 'mkinitcpio'包的一部分。
最後,你必須重新製作內核鏡像,否則那些變更不會生效。
# mkinitcpio -p linux
注意: 如果你使用的是自己編譯的內核,那麼必須用 -p 參數重新製作鏡像。
例如這樣做:
$ cat /etc/pm/sleep.d/50-hdparm_pm #!/bin/dash if [ -n "$1" ] && ([ "$1" = "resume" ] || [ "$1" = "thaw" ]); then hdparm -B 254 /dev/sda > /dev/null fi
重新啟動滑鼠
某些筆記本電腦在掛起之後會不能使用。要糾正此問題的一種方法是通過HOOKS/etc/pm/hooks
(see hooks[損壞的連結:無效的章節])強制重新初始化 PS/2 的驅動程序(這裡指 i8042
)
#!/bin/sh echo -n "i8042" > /sys/bus/platform/drivers/i8042/unbind echo -n "i8042" > /sys/bus/platform/drivers/i8042/bind
我點擊的掛起但沒有任何反應 / 日誌文件在哪裡
當你從桌面部件使用掛起功能時沒有正確執行,那麼請嘗試ROOT權限手動執行 pm-suspend
或 pm-hibernate
manually from a root shell in a terminal[損壞的連結:無效的章節]. 有可能你會在終端看見一些有用的輸出信息。
系統掛起的腳本也會在log留下錯誤信息logfile at /var/log/pm-suspend.log
[損壞的連結:無效的章節].
在Openbox 菜單添加睡眠模式
Openbox users can add the new scripts as additional shutdown options within the Openbox menu by adding the items to a new or existing sub-menu in ~/.config/openbox/menu.xml
, for example:
<menu id="64" label="Shutdown"> <item label="Lock"> <action name="Execute"> <execute>xscreensaver-command -lock</execute> </action> </item> <item label="Logout"> <action name="Exit"/> </item> <item label="Reboot"> <action name="Execute"> <execute>sudo shutdown -r now</execute> </action> </item> <item label="Poweroff"> <action name="Execute"> <execute>sudo shutdown -h now </execute> </action> </item> <item label="Hibernate"> <action name="Execute"> <execute>sudo pm-hibernate</execute> </action> </item> <item label="Suspend"> <action name="Execute"> <execute>sudo pm-suspend</execute> </action> </item> </menu>
相關資源
HAL Quirk Site - Common solutions and frequently asked questions
Cpufrequtils - CPU Frequency Scaling and CPU Power schemes
SpeedStep - More information on CPU frequency scaling (some of which is obsolete)
Credits
This wiki entry was originally sourced from the OpenSUSE Wiki (Licensed under GPL). A big thank you goes to the pm-utils
developers and documenters for their time.