關於電源管理(Power Management)中掛起和休眠方面論壇上有一些帖子了,不過對於掛起和休眠的實現好像還不是非常的清晰,主要是各個機型的差異較大,尤其是使用筆記本電腦(laptop, notebook)的朋友在這方面的問題比較多。我在這裡寫一些討論,很多問題還沒有解決,希望能夠拋磚引玉。
首先我解釋一下這裡所說的掛起和休眠的含義,有的帖子中這些概念經常和屏幕保護中的“掛起”搞混淆了:
待機
計算機將目前的運行狀態等數據存放在內存,關閉硬盤、外設等設備,進入等待狀態。此時內存仍然需要電力維持其數據,但整機耗電很少。恢復時計算機從內存讀出數據,回到掛起前的狀態,恢復速度較快。一般筆記本在電池無故障且充滿的情況下可以支持這種掛起數小時甚至數天(依具體機型有差別)。
其他名稱:Suspend, STR(Suspend To RAM), 掛起, 掛起到內存
休眠
計算機將目前的運行狀態等數據存放在硬盤上某個文件或者某個特定的區域,關閉硬盤、外設等設備,進入關機狀態。此時計算機完全關閉,不耗電。恢復時計算機從休眠文件/分區中讀出數據,回到休眠前的狀態,恢復速度較慢。但由於這種方法完全耗電又能保存工作狀態,往往被筆記本用戶用來作為關機的替代方式。
其他名稱:Hibernation, STD(Suspend To Disk), 掛起到硬盤, 休眠到硬盤
下文統稱上述兩者為掛起。
目前各個型號的筆記本電腦都提供了休眠和掛起功能,掛起和休眠首先需要BIOS對其提供支持,其次一般也需要操作系統提供支持(有例外,後詳)。筆記本電腦往往在鍵盤上提供這兩種掛起方式的快捷鍵,如 Fn+F4 為STR,Fn+F12 為STD。
-------------------------------
在 STR 方面,各機型和操作系統較為相近; 在 STD 方面一般有下面兩種方式:
一種是直接通過 BIOS 和獨立於操作系統的專門程序加以管理,例如 IBM 的很多 ThinkPad 機型,配合 IBM 提供的一種休眠管理軟件 PS2 來實現,我的 ThinkPad X21 機器買來的時候就是默認安裝有這種管理程序的。它和操作系統無關,直接和 BIOS 通訊來實現休眠,其方法是在硬盤上建立一個於內存大小相當的特殊隱藏分區,將休眠時的數據直接寫在這個分區中。進入休眠時可以看到 IBM 的 LOGO 和提示。優點是休眠和恢復都比較快,缺點一是需要占用專門的硬盤空間,二是如果裝有多個操作系統,恢復時沒有操作系統的選擇,必須進入休眠之前的哪一個操作系統。
關於這種方式的詳細使用可以參考 BTWorm 的回貼:
http://www.Linuxsir.com/bbs/showthr...5%C4#post157551
另一種方式是操作系統來的電源管理程序來管理的,使用 Microsoft Windows ME / 2000 / XP 的用戶可能注意到在關機菜單中有一種關閉方式就是休眠,以 Windows XP 為例,如果在電源管理中打開了休眠支持,Windows 將會在引導分區(還是系統盤分區?不記得了,因為我的都是在 C: )建立一個 hiberfil.sys 的文件,大小與內存容量相同。休眠時數據將寫入這個文件,同時屏幕上會出現 Windows XP 的 LOGO(如果你沒有修改系統文件的話)同時有一個 Windows 的進度條指示正在寫入休眠文件。這個過程大約持續十幾秒,然後進入休眠狀態。恢復時比較靈活,由於是操作系統管理休眠文件,所以啟動操作系統之前仍然會出現引導管理程序,例如我的 Grub,此時如果可以不選擇休眠之前的操作系統,而進入另一個操作系統工作。此外,如果選擇 Windows,那麼它引導時會找到這個休眠文件,如果按 F8 還有機會選擇是需要恢復還是刪除恢復數據進入系統。第二種方式可能會比第一種進入休眠稍慢,而且可能操作系統的支持需要單獨配置。但是其好處也是顯而易見的,它不需要占用專門的硬盤分區,而且啟動的時候有選擇操作系統的機會。
--------------------------------
現在再來看看 Linux 下對這兩種 STD 方式的支持:
對於第一種 STD 方式,不需要配置 Linux,因為管理程序和分區都與操作系統無關,只要正確安裝管理程序和在 BIOS 裡進行設置即可。
對於第二種 STD 方式,首先需要 Linux 的內核支持,有 APM 和 ACPI 兩種方式,只可選其一。APM 老一些但也成熟一些,ACPI新一些,支持一些新功能,但也有人對其成熟性持懷疑態度。需要注意的是,如果自己編譯內核要加入 ACPI 模塊,必須將 Code maturity level options 中的 Prompt for development and/or incomplete code/drivers 打開,否則 ACPI 無效。很多較新的發行版已經在內核裡面加入了 ACPI 支持,如我的 Mandrake Linux 9.1 默認安裝是內核支持 ACPI 的,並且默認打開了 acpid 服務。
關於這方面的帖子,我在論壇找到的主要有下面這幾個:
http://www.linuxsir.com/bbs/showthr...;threadid=28919
http://www.linuxsir.com/bbs/showthr...;threadid=37331
http://www.linuxsir.com/bbs/showthr...;threadid=36801
http://www.linuxsir.com/bbs/showthr...;threadid=30892
我要補充的一點是,Linux 也是可以實現操作系統管理的 STD 的,請看我的試驗:
我發現在 Mandrake 9.1 CD1 上有這個包:suspend-scripts-1.4-1mdk.noarch.rpm,其中有個腳本:/usr/sbin/pmsuspend。我用 root 登錄執行它,提示說需要給內核傳遞參數 resume=/dev/hda9,那個 /dev/hda9 正是我的 swap 分區。我明白了,它是將休眠文件直接寫到 swap 分區中的。於是我修改 Grub 的啟動菜單 /boot/grub/menu.lst,在啟動內核的參數後面加上了 resume=/dev/hda9。保存重啟(這個參數就生效了)。
我從普通用戶登錄系統,運行了一些程序,開了一些窗口,然後用 root 直接等錄到另一個虛擬控制台(從普通用戶 su 到 root 不行,我試了),執行 pmsuspend。屏幕上出現了文本:Suspend To Disk,底下還有一個文本進度條。進度條走滿之後系統就切斷了電源。我重新打開機器,果然又出現了 Grub 菜單,然後我選擇休眠之前的那個 Mandrake 9.1,屏幕上又出現 Resume From Disk,下面還是那個文本進度條,過了一會兒系統恢復了,包括休眠之前的所有程序。
發現的問題:STD 之前我在使用的外設包括指點桿鼠標、USB 外接鼠標(兩個鼠標是同時使用的)、PCMCIA 的無線網卡。恢復之後外接的 USB 鼠標失效了,好像沒有激活。無線網卡激活了。我想這些是需要配置的,在我的 /etc/sysconfig/suspend-scripts/ 中有一些腳本,另外 /etc/acpi/events/power 好像是一個指定鍵盤休眠鍵和電源鍵動作的配置。這些我還沒有研究透,大家有興趣可以看看。
-------------------------------
此外的一些參考
ACPI HOWTO:http://en.tldp.org/HOWTO/Laptop-HOWTO-6.Html#ss6.8
APM HOWTO:http://en.tldp.org/HOWTO/Laptop-HOWTO-6.html#ss6.7
SourceForge 項目:
ACPI - http://sourceforge.net/projects/acpi/
Sony VAIO 筆記本用的 Gnome-Applet - http://sourceforge.net/projects/vaioba/
華碩筆記本的各種擴展,包括按鍵對應、指示燈、ACPI等 - http://sourceforge.net/projects/acpi4asus/
另一個 Gnome-Applet - http://sourceforge.net/projects/gnome-acpi/
KDE ACPI 控制小程序:http://sourceforge.net/projects/kacpi/
ACPI plugin for GKrellM - http://sourceforge.net/projects/gkacpi/
更多請在 www.sf.net 查找 acpi
關於電源管理程序的需求:
http://www.linuxsir.com/bbs/showthr...B%BC#post225036
http://www.linuxsir.com/bbs/showthr...D%FB#post222020
另一個 Gnome-Applet - http://sourceforge.net/projects/gnome-acpi/
KDE ACPI 控制小程序:http://sourceforge.net/projects/kacpi/
ACPI plugin for GKrellM - http://sourceforge.net/projects/gkacpi/
更多請在 www.sf.net 查找 acpi
關於電源管理程序的需求:
http://www.linuxsir.com/bbs/showthr...B%BC#post225036
http://www.linuxsir.com/bbs/showthr...D%FB#post222020