linux power managment - kernel - Jeffrey

来源:百度文库 编辑:神马文学网 时间:2024/05/24 00:15:11




发信人: sunway (sunway), 信区: Linux
标  题: [转帖]電源管理指引
发信站: BBS 北邮人论坛站 (Sun Aug 21 21:11:41 2005), 站内


電源管理指引
內容:

1. 介紹

為什麼需要電源管理?

筆記型電腦電池的容量和持續力在過去幾年已有很大的改善,然而現今的處理器較過去消耗更多能源,而且新一代筆記型電腦引進越來越多的高耗電配備,這就是為什麼電源管理愈形重要的原因。要延長電池的持續力並不一定要買另一顆電池,良好運用智慧型電源管理政策就能獲得很大的改善。

概要

請注意這份文件說明 筆記型電腦 的電源管理。雖然一些章節可能可以適用於 伺服器,其他的章節卻不行,而且可能造成損害。請不要將這份指引應用到伺服器上,除非您很清楚知道您在做什麼。

由於這份指引很長,這裡先給個簡短的概述,幫助您了解大概的內容。

在 前提要件 這一章會談到設定一些基本的要求,這些將在接下來討論各種設備設定的章節內會用到,這些包括 BIOS 和 kernel 的設定,還有使用者端的簡化手續。接下來三個章節將專注於特別耗電的設備 ─ 處理器,螢幕和硬碟,它們可以被個別設定,CPU 電源管理 展示如何調整處理器的頻率,而能夠在不甚影響效能的前提下,達到省電最大化。幾個避免您的硬碟作不必要運轉的小技巧會在 硬碟電源管理 提到(順便可以降低噪音程度)。最後在 其他配備的電源管理 一章,我們會說明一些關於無線網路和 USB 週邊應注意的事項。另外有個章節專門講述 睡眠狀態 (雖然還是實驗性質)。最後 問題排除 列舉常見的陷阱。

各元件的電源預算

圖示 1.1: 各元件的電源預算
Fig. 1: 那種元件最耗能源?

幾乎所有元件都可以在不同的狀態下運作 ─ 停止,睡眠,閒置,運作是其中幾種 ─ 耗費不同程度的能源。很大部份能源是消耗在 LCD 螢幕、CPU、晶片組和硬碟。通常您可以啟動 BIOS 內不倚賴作業系統的電源管理,但是在作業系統內做些智慧型的設定,針對不同情況做出調整,可以達到更有效的能源運用。

2. 前提要件

需要先完成的事情

我們將會談如何使各種設備有電源管理的能力,但是在此之前,請您先確認某些前提要件已經符合。在取得 BIOS 設定之後,一些 kernel 的選項應該要啟動 ─ 大致上有 ACPI、睡眠狀態和 CPU 變頻。大多時候省電的代價是犧牲效能和反應延遲,所以應該在電力來源是電池時才啟動。因此設定一個新的執行階層(runlevel) battery 是很方便的。

BIOS 部份

第一步,看看您 BIOS 電源管理的設定,最好的作法是整合 BIOS 和作業系統的政策,但是現在先取消 BIOS 的部份,這會確保 BIOS 的設定不去干擾到您的政策。不要忘記在您做好所有設定之後,把 BIOS 設定重新開啟。

設定 kernel

Kernel 內 ACPI(Advanced Configuration and Power Interface)的支援還在持續加強中,所以選擇較新的 kernel 會讓您獲得更多功能。

在 kernel 設定中,啟動下列選項:

原始碼 2.1: Kernel 電源管理最基本設定 (Kernel 2.6)

Power Management Options --->
  [*] Power Management Support
  [ ] Software Suspend
  [ ] Suspend-to-Disk Support

  ACPI( Advanced Configuration and Power Interface ) Support --->
    [*] ACPI Support
    [ ]   Sleep States
       AC Adapter
       Battery
       Button
       Fan
       Processor
         Thermal Zone
    < >   ASUS/Medion Laptop Extras
    < >   Toshiba Laptop Extras
    [ ]   Debug Statements
    
  CPU Frequency Scaling --->
    [*] CPU Frequency scaling
          Default CPUFreq governor (userspace)
    <*>   'performance' governor
    <*>   'powersave' governor
    <*>   CPU frequency table helpers
     ACPI Processor P-States driver
    <*> CPUFreq driver for your processor

您可以自行決定要不要勾選 Sofrware Suspend、Suspend-to-Disk 和 Sleep States(見下面章節)。如果您的筆記型電腦是華碩、Medion 或 Toshiba,請啟動相關的選項。

開始編譯 kernel,確認啟動時載入需要的模組,然後重開機使用您新編好有 ACPI 支援的 kernel。接著執行 emerge sys- apps/acpid 安裝 acpi daemon,這個程式會通知您相關事件的發生,例如從使用 AC 電源轉到使用電池或是闔上螢幕蓋。確認  button 模組有載入如果您沒有編進 kernel,然後鍵入 /etc/init.d/acpid start 啟動 ac pid。執行 rc -update add acpid default 讓它在開機時自動載入。您很快就會知道如何使用這個程式。

原始碼 2.2: 安裝 acpid

# emerge sys-apps/acpid
# modprobe button
# /etc/init.d/acpid start
# rc-update add acpid default

建立新的 "battery" 執行階層

預設的政策只有在必要時才會啟動電源管理,就是電力來源是電池的時候。為使 AC 電源和電池電源之間的轉換更方便,建立一個新的執行階層 battery 來儲存所有電源管理啟動和停止的 scripts。

注意: 如果您不想新設執行階層,您可以略過這一節,這不會有影響。但是略過這一步會使得接下來的動作設定上比較不直接,所以下一節會假設執行階層 battery 存在。

原始碼 2.3: 建立 battery 執行階層

# cd /etc/runlevels
# cp -a default battery

完畢。您新設的執行階層 battery 已經包含了所有 default 內的設定,只差還無法在兩者間自動轉換。該是想辦法改正的時候了。

回應 ACPI 事件

典型的 ACPI 事件有闔上螢幕蓋、變換電力來源或按下睡眠按鈕,所有 kernel 認識的 acpi 事件都會被 acpid 攔截並呼叫 /etc/acpi/default.sh。要支援執行階層轉換,下面給個簡單的修改範例:

原始碼 2.4: 運用 acpid 達到事件驅動的執行階層轉換

#!/bin/sh

set $*

group=${1/\/*/}
action=${1/*\//}

# AC 模式下的執行階層
RLVL_AC="default"
# 電池模式下的執行階層
RLVL_BATTERY="battery"

# 指示 AC 狀態的檔案,使用前請先確定檔案名稱
AC_STATE="/proc/acpi/ac_adapter/AC/state"
# 此行表示在 AC 模式
AC_ON="on-line"
# 此行表示在電池模式
AC_OFF="off-line"

function SwitchRunlevel() {
  if [[ "$(grep ${AC_OFF} ${AC_STATE})" != "" && "$(cat /var/lib/init.d/softlevel)" != "${RLVL_BATTERY}" ]]
  then
    logger "Switching to ${RLVL_BATTERY} runlevel"
    /sbin/rc ${RLVL_BATTERY}
  elif [[ "$(grep ${AC_ON} ${AC_STATE})" != "" && "$(cat /var/lib/init.d/softlevel)" != "${RLVL_AC}" ]]
  then
    logger "Switching to ${RLVL_AC} runlevel"
    /sbin/rc ${RLVL_AC}
  fi
}


case "$group" in
  battery)
    case "$action" in
      battery) 
        SwitchRunlevel
        ;;
      *) 
        logger "ACPI group battery / action $action is not defined"
        ;;
    esac
    ;;

  ac_adapter)
    case "$action" in
      ac_adapter)
        SwitchRunlevel
        ;;
      *)
        logger "ACPI group ac_adapter / action $action is not defined"
        ;;
    esac
    ;;
  *)
    logger "ACPI group $group / action $action is not defined"
    ;;
esac

試試看:把電源插頭插上或拔下,然後看看 syslog 內有沒有出現 "Switching to AC mode" 或 "Switching to battery mode" 的訊息。

由於事件機制設計的關係,您的筆記型電腦無論電力來源為何,在開機時都會進入 default 執行階層。您可以在 boot loader 內增加一行  softlevel=boot,但是它無法記住這個設定。一個比較好的方法是在開機程序要完成前,假造一個 ACPI 事件,讓  /etc/acpi/default.sh script 決定需不需要轉換執行階層。用您喜歡的編輯器開啟  /etc/conf.d/local.start 並加入以下程式:

原始碼 2.5: 編輯 local.start 以便開機時能轉換執行階層

# 如果使用電池,假造 acpi 事件來轉換執行階層
/etc/acpi/default.sh "battery/battery"

有了這些前置準備,您就能夠針對個別設備啟動電源管理政策。

3. CPU 電源管理

手動設定頻率

降低 CPU 的速度和電壓有兩個好處:一方面減少能源消耗,另一方面是熱量的改善,因為您的系統不會像全速運轉時那麼熱。顯而易見的,主要的缺點是效能較差。降低處理器速度是在效能的損失和能源的節省中求取平衡。

注意: 並非所有筆記型電腦都支援變頻。如果您不確定,問題排除 一章有個列表,列舉有支援的處理器,您可以看看您的處理器是否在其中。

是測試 CPU 變頻是否能正常運作的時候了。為了熟悉 kernel 提供的介面,先用手動改變速度。要設定 CPU 速度,鍵入:

原始碼 3.1: 手動變更 CPU 速度

(取得現在頻率)
# grep "cpu MHz" /proc/cpuinfo

(列出支援頻率,這有可能行不通)
# cd /sys/devices/system/cpu/cpu0/cpufreq/
# cat scaling_available_frequencies

(改變頻率到 1 GHz (100000 KHz)
用您筆記型電腦支援的頻率代換)
# echo -n userspace > scaling_governor
# echo -n 1000000 > scaling_setspeed

(確認頻率有改)
# grep "cpu MHz" /proc/cpuinfo

如果您遇到錯誤訊息,請參考指引的最後一章 問題排除。

您也可以寫入 scaling_max_freq 和 scaling_min_freq 來設定頻率的上下界。

注意: 有些 kernel 似乎在 /proc/cpuinfo 的更新上有點不穩定,如果您沒看到該有的變化,這並不意味 CPU 的頻率沒改。如果您遇到這個狀況,執行 emerge x86info,照指令更新您的 kernel,並用 x86info -mhz 查看現在的頻率。

自動頻率調整

上述的方法很好,可是不適合日復一日的例行工作,最好是讓您的系統自動設定適當的頻率。幾個在使用者空間執行的程式可以幫您達到這個目標。下面的表格提供簡單的介紹,輔助您選擇合適的程式。
名稱     優點     缺點
cpudyn     支援硬碟待命     
cpufreq     可以做精密的設定     設定複雜
speedfreq     小巧但功能強大
client/server 介面很好用     只是用於 kernel 2.6 系列
powernowd     支援多處理器     

根據工作負載調整頻率看似簡單,卻不是件容易的工作。一個設計不良的演算法可能會造成頻繁的頻率轉換,或是把頻率設太高而造成能源浪費。

該選擇那個程式?如果您無法決定,先試試 speedfreq:

原始碼 3.2: 安裝 speedfreq

# emerge speedfreq
# rc-update add speedfreq battery

編輯 /etc/conf.d/speedfreq 來設定 speedfreq。舉例來說,如果您希望使用者可以變更政策,把 SPEEDFREQ_OPTS="" 改成 SPEEDFREQ_OPTS="-u",改完就啟動 daemon。

原始碼 3.3: 啟動 speedfreq

# /etc/init.d/speedfreq start

cpufreq 的設定就比較複雜一點。

警告: 不要同時執行上面的程式,這可能造成頻率經常變換的混亂。如果您安裝了 speedfreq,請暫時略過 cpufreq。

原始碼 3.4: 安裝 cpufreqd

# emerge cpufreqd
# rc-update add cpufreqd battery

cpufreqd 有提供預設值在 /etc/cpufreqd.conf,您可以根據您的需求修改設定檔。下面的例子會較預設值節省更多能源 ─ 當然,效能會比較差。

原始碼 3.5: cpufreqd 設定檔範例

[General]
pidfile=/var/run/cpufreqd.pid
poll_interval=2
pm_type=acpi
# 使用下面設定來啟動 ACPI workaround(參考 cpufreqd.conf(5))
# acpi_workaround=1
verbosity=4 #(如果您想要最少的記錄,把值設成 5)

# 最大效能
[Profile]
name=ac
minfreq=600000
maxfreq=1400000
policy=performance

# 最大化能源節約
[Profile]
name=battery
minfreq=600000
maxfreq=900000
policy=powersave

# 固定頻率
[Profile]
name=dvd
minfreq=900000
maxfreq=1100000
policy=powersave

# AC 電源時使用最大效能
[Rule]
name=ac_on
ac=on
profile=ac

# 如果電池狀態許可,編譯程式應該要快速
[Rule]
name=compiling
ac=off
battery_interval=30-100
programs=emerge,make,gcc,cpp
cpu_interval=0-100
profile=ac

# 慢速的 CPU 頻率會使 DVD 播放不順
# 電玩等程式同樣適用
[Rule]
name=dvd_watching
ac=off
battery_interval=15-100
programs=xine,mplayer,avidemux,kaffeine,kmplayer
cpu_interval=0-100
profile=dvd

# 如果上述規則都不適用,最大化能源節約
[Rule]
name=battery_on
ac=off
battery_interval=0-100
cpu_interval=0-100
profile=battery

cpudyn 和 powernowd 的安裝方式與 speedfreq 相同.

最後要檢查的是您設定的新政策確實做好它的工作。一個簡單的方法,在您用筆記型電腦工作時監測 CPU 速度:

原始碼 3.6: 監測 CPU 速度

# watch -n 1 grep "cpu MHz" /proc/cpuinfo

如果 /proc/cpuinfo 沒有被更新(參考前面討論),用下面的指令監看 CPU 頻率:

原始碼 3.7: 監測 CPU 速度的另一種方法

# watch -n 1 x86info -mhz

取決於您的設定,CPU 的速度應該在負載大時增加,在不活動時減低或保持不變。

4. LCD 電源管理

能源消耗者第一名

如 圖 1.1 所示,LCD 螢幕消耗最大部份的能源(不見得適用於 non-mobile CPU)。因此在不使用時關閉螢幕,在合適時減低背景亮度,都成為重要的關鍵。大部分筆記型電腦都有提供操控背景亮度的功能。

首先要檢查螢幕 待命/暫停/關閉 的時機設定。因為不同的視窗管理程式設定方式都不相同,所以我將這部份留給您自行解決。提供兩個常見的地方做參考:要空白終端機的畫面可用 setterm -blank 、setterm - powersave on 和 setterm -powerdown 。在 Xorg 下,修改  /etc/X11/xorg.conf 如下:

原始碼 4.1: Xorg 和 XFree86 暫停 LCD 的設定

Section "ServerLayout"
  Identifier  [...]
  [...]
  Option  "BlankTime"  "5"  # 5 分鐘後空白螢幕(模擬的)
  Option  "StandbyTime"  "10"  # 10 分鐘後關閉螢幕(DPMS)
  Option  "SuspendTime"  "20"  # 20 分鐘後完全暫停
  Option  "OffTime"  "30"  # 半小時後關閉
  [...]
EndSection

[...]

Section "Monitor"
  Identifier  [...]
  Option  "DPMS"  "true"
  [...]
EndSection

XFree86 和 /etc/X11/XF86Config 的設定完全一樣。

更重要的也許是背景亮度的調暗。如果您有辦法運用工具程式存取亮度控制設定,寫個簡單的 script 以便在電池模式下調暗背景光源,然後將它加到 battery 執行階層。

5. 硬碟電源管理

閒置時睡眠

讓我們在不需要硬碟時,盡早將之設成睡眠狀態。我將展示兩種方法來達成這項工作。第一種是運用 cpudyn 對應碟電源管理的支援,啟用  /etc/conf.d/cpudyn 內 "Disk Options" 部份的設定。如果要讓第一顆硬碟在休止 60 秒之後,進入睡眠狀態,您可以將檔案修改如下:

原始碼 5.1: 使用 cpudyn 做硬碟待命

################################################
# DISK OPTIONS
# (disabled by default)
################################################

#
# 如果時限內硬碟沒有執行任何存取,
# 硬碟將進入待命模式(單位為秒)
#

TIMEOUT=60

#
# 指定要休息的硬碟(用逗號分隔)
#

DISKS=/dev/hda

第二種方法是使用簡單的 script 和指令 hdparm。建立檔案 /etc/init.d/pm.hda 如下:

原始碼 5.2: 使用 hdparm 做硬碟待命

#!/sbin/runscript
start() {
  ebegin "Activating Power Management for Hard Drives"
  hdparm -q -S12 /dev/hda
  eend $?
}

stop () {
  ebegin "Deactivating Power Management for Hard Drives"
  hdparm -q -S253 /dev/hda
  eend $?
}

參看 man hdparm 來了解可用的選項。如果您的 script 準備好了,把它加到 battery 執行階層。

原始碼 5.3: 自動化硬碟待命的設定

# /sbin/depscan.sh
# rc-update add pm.hda battery

重要: 硬碟 sleep/spin down 的設定值要特別小心,設定值太小可能會磨耗您的硬碟而無法得到保固。

延長閒置時間 ─ 筆記型電腦模式

新近的 kernel(2.6.6 以後、最近 2.4 版本和其他修正版)包含了所謂的 筆記型電腦模式(laptop-mode),當啟動時, dirty buffers 會在讀取時或 10 分鐘間隔後(而不是 30 秒)被寫入硬碟,這會使硬碟需要轉動的時間降到最少。

要啟動和停止筆記型電腦模式,新建 script /etc/init.d/laptop-mode,您可以使用包含在 /usr/src/linux/Documentation/laptop-mode.txt 提供的範例。準備好之後,確定它會被呼叫到。

原始碼 5.4: 自動啟動筆記型電腦模式

# rc-update add laptop-mode battery

警告: 再一次提醒:硬碟 sleep/spin down 設定要特別小心,設定值太小可能磨耗您的硬碟而失去保固。請閱讀文件 laptop- mode.txt。確定在電池電力耗光之前,停止筆記型電腦模式,讓資料能被寫入硬碟 ─ 否則,您最起碼會失去最後 10 分鐘的工作成果。

其他小技巧

除了讓您的硬碟儘快進入睡眠模式,將硬碟存取減到最少也是個好主意。檢視經常寫入硬碟的程式 ─ syslogd 就是個可能人選。您可能不想要完全停掉那個程式,但是透過修改設定檔,避免把 "不必要" 的事情記錄下來,就能減少硬碟存取流量。Cups 也定期寫入硬碟,所以可以考慮停止這隻程式,而改在必要時手動啟動。

原始碼 5.5: 在電池模式下停止 cups

# rc-update del cupsd battery

另一個可省電的地方是在電池模式下停止 swap。在撰寫 swapon/swapoff 轉換之前,請確定有足夠的 RAM 而且 swap 不是經常被使用,否則您會遇上大問題。

如果您不想使用筆記型電腦模式,我們仍可以把某些目錄掛在 tmpfs ─ 寫入動作不會存到硬碟上而是到主記憶體,卸載時資料便遺失 ─ 來達到使硬碟存取最小化的目的。通常可以把 /tmp 用這種方式掛載起來 ─ 您不需要做特別的處理,因為無論是掛載在硬碟或 RAM 上,每次它的內容在重開機時都會自動清理掉。只要您確認有足夠的 RAM 而且沒有程式(如下載程式或壓縮工具)需要在 /tmp 下使用非常多空間。要使用這項功能,啟動您  kernel 內 tmpfs 支援,然後在 /etc/fstab 加入一行文字:

原始碼 5.6: 編輯 /etc/fstab 使 /tmp 更有機動性

none  /tmp  tmpfs  size=32m  0 0

警告: 特別留意 size 參數的設定,要依據您的系統做合適的改變。如果您不確定,請不要嘗試這個方法,它很容易成為效能的瓶頸。如果您想要讓  /var/log 如此掛載,請確定在卸載前把記錄檔寫回硬碟上,這些動作是必須的。請勿嘗試用此方法掛載 /var/tmp ,Portage 使用這個目錄做編譯工作...

6. 其他設備的電源管理

無線電源管理

無線網路卡能源消耗也不少,可以用類似 pm.hda script 的方式將它們加入電源管理模式。

原始碼 6.1: WLAN 電源管理自動化

#!/sbin/runscript
start() {
  ebegin "Activating Power Management for Wireless LAN"
  iwconfig wlan0 power on power max period 3
  eend $?
}

stop () {
  ebegin "Deactivating Power Management for Wireless LAN"
  iwconfig wlan0 power off
  eend $?
}

啟動這個 script 會使 wlan0 在三秒鐘沒有流量之後進入電源管理模式。同硬碟 script 般,存成  /etc/init.d/pm.wlan0 並加入 battery 執行階層。參看 man iwconfig 內更詳細的說明和選項。如果您的驅動程式和存取點(access point)支援 beacon time 變更,有可能可以節省更多能源。

USB 電源管理

USB 週邊要做到能源節省會面臨兩個問題:第一是像 USB 滑鼠、數位相機或是 USB 隨身碟這些配備一插上就會消耗能源,無法完全避免(除非在不用時移除)。第二是當 USB 設備插上時,USB host controller 會定期存取匯流排,這樣一來會使得 CPU 無法進入 C3/4  睡眠模式。作業系統針對這個問題的解答是所謂的 "USB 選擇性暫停(selective suspend)",這項功能還沒有進入 kernel。 USB 選擇性暫停只允許匯流排在設備運作時被存取。在這項功能實作出來之前,一個暴力解決辦法:把 USB 支援和設備驅動程式編譯成模組,然後用  script 在不使用時(例如,闔上螢幕蓋時)移除它們。

7. 睡眠狀態:睡眠、待命、suspend to disk

概說

ACPI 定義了不同的睡眠狀態,比較重要的有

    * S1 等同於 待命(Standby)
    * S3 等同於 Suspend to RAM 等同於 睡眠(Sleep)
    * S4 等同於 Suspend to Disk 等同於 冬眠(Hibernate)

當系統沒有在使用時,可以進入這些狀態。關機不在選項中是因為開機程序耗費時間。

睡眠、待命和冬眠

ACPI 對這些睡眠狀態的支援被標記為實驗性質不是沒有原因的,APM 睡眠狀態較為穩定,但是您不能同時使用 APM 和 ACPI。

警告: 雖然對於睡眠狀態的支援改善許多,它還是實驗性質。最起碼,我讓 swsusp2 和 suspend to RAM 成功運作,但是事先的警告仍是必須的:以下的動作很可能不僅無法成功,反而損害到您的資料或系統。

目前有三種 S4 的實作方式,最早的是 swsusp;然後是 swsusp2,這隻程式有最好的介面設計(包括 bootsplash 支援),但是需要自己動手做 kernel 補釘;最晚出現的是 Suspend-to-Disk,一個 swsusp 的分支。

如果上面這段話讓您感到困惑,請參考 特色比較。如果您還是不太清楚要選擇哪一個,先試試 swsusp2,看起來前景不錯。

kernel 內相關部份如下:

原始碼 7.1: Kernel 內不同待命狀態的設定

Power Management Options --->

  (睡眠和待命)
  ACPI( Advanced Configuration and Power Interface ) Support --->
    [*] ACPI Support
       [*]   Sleep States

  (使用 swsup 冬眠)
  [*] Software Suspend (EXPERIMENTAL)
  
  (使用 swsusp2 冬眠)
  Software Suspend 2
    --- Image Storage(您最少需要選一個)
    [*]    Swap Writer
    --- Page Transformers
    [*]    LZF image compression
    (/dev/"在此填入您的 swap")    Default resume device name

  (使用 Suspend-to-Disk 冬眠)
  [*] Suspend-to-Disk Suport
  (/dev/"在此填入您的 swap") Default resume partition

適當的設定啟動之後就可以編譯您的 kernel,然後鍵入 /proc/acpi/sleep 或是 cat /sys/power/state (分別適合 2.4 和 2.6 系列版本)看看有支援那幾種狀態。後者回傳給我的是 standby mem disk。要是使用 swsusp,需要指定  kernel 參數 resume=/dev/"在此填入您的 swap"。如果開機因為影像(image)破損而無法完成,swsusp 用  noresuem,Suspend-to-Disk 用 pmdisk=off,swsusp2 用 noresume2 做補救。

要讓您的系統進入下列睡眠狀態,執行

原始碼 7.2: 啟動睡眠狀態

(kernel 2.4 系列)
# echo 1 > /proc/acpi/sleep          (待命)
# echo 3 > /proc/acpi/sleep          (睡眠)

(kernel 2.6 系列)
# echo -n standby > /sys/power/state (待命)
# echo -n mem > /sys/power/state     (睡眠)

(swsusp)
# echo 4 > /proc/acpi/sleep          冬眠

(Suspend-to-Disk)
# echo -n disk > /sys/power/state    冬眠

(swsusp2)
# echo > /proc/swsusp/activate

警告: 在您進行這些動作之前,請先備份您的資料。在執行其中任一個指令之前,先執行 sync,讓所有快取資料被寫回硬碟。先在沒有跑 X 的情況下試,然後再在 X 正在執行但沒有記錄時試。

如果您遇到因為 uhci 或類似項目導致 kernel panics 的情況,試著將 USB 支援編譯成模組,然後在您的筆記型電腦進入睡眠狀態前先卸載模組。

雖然上述方法應該可以讓 swsusp 和 Suspend-to-Disk 跑起來(我沒有說正常運作), swsusp2 需要額外的設定。首先要做的是用 http://softwaresuspend.berlios.de/ 提供的補釘修改 kernel,然後安裝該網頁內提供的 hibernate script。

8. 問題排除

如果事情進行不順利...

Q: 我試著改變 CPU 的頻率,但是 /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 不存在。

A: 請確認您的處理器支援 CPU 變頻,並且您所選的 CPUFreq 驅動程式是正確的。這裡列出 cpufreq(kernel 2.6.7)所支援的處理器:ARM Integrator, ARM-SA1100, ARM-SA1110, AMD Elan - SC400, SC410,  AMD mobile K6-2+, AMD mobile K6-3+, AMD mobile Duron, AMD mobile Athlon,  AMD Opteron, AMD Athlon 64, Cyrix Media GXm, 搭配某些晶片組的  Intel mobile PIII 和 Intel mobile PIII-M, Intel Pentium 4, Intel Xeon,  Intel Pentium M (Centrino), National Semiconductors Geode GX, Transmeta Crusoe,  VIA Cyrix 3 / C3, UltraSPARC-III, SuperH SH-3, SH-4, 某些 "PowerBook" 和  "iBook2" ,還有其他一些 ACPI 2.0-compatible 系統上的處理器(只有在 ACPI/BIOS 介面上有  "ACPI Processor Performance States" 選項時)。

Q: 我的筆記型電腦支援變頻,但是 /sys/devices/system/cpu/cpu0/cpufreq/ 是空的。

A: 用 dmesg | grep ACPI 檢查看看有沒有 ACPI 相關的錯誤訊息。試試更新 BIOS,尤其當有 DSDT 毀損的報告時。您也可以試著手動修復系統(當然這超出這份指引的範圍)。

Q: 我的筆記型電腦支援變頻,但是從 /proc/cpuinfo 看來,速度從未改變過。

A: 這看起來像是 kernel 的 bug。執行 emerge x86info,照指示更新您的 kernel,然後用 x86info -mhz 檢查現在的頻率。

Q: 我可以改變 CPU 頻率,但是可改變的範圍不如其他作業系統大。

A: 您可以把變頻和 ACPI throttling 一起使用,這樣可以獲得更低的頻率。注意 throttling 並不會節省太多能源,而且它主要的功能是在熱量管理(讓您的筆記型電腦保持涼爽安靜)。您可以用 cat /proc/acpi/processor/CPU/throttling  來讀取現在 throttling 的狀態,然後用 echo -n "0:x" >  /proc/acpi/processor/CPU/limit 來改變它的值,指令中的 x 是  /proc/acpi/processor/CPU/throttling 中列舉的狀態 Tx 。

Q: 電池持續時間好像變得比以前更糟糕了。

A: 檢查您 BIOS 的設定,也許您忘了把某些設定重新啟動。

Q: 我的電池已經充飽,但是 KDE 回報說只有 0% 剩下,然後就關機了。

A: 檢查電池支援有編譯進您的 kernel。如果您把它編成模組,請確定此模組有載入。

Q: 我有一台 Dell Inspiron 51xx,但是我收不到任何 ACPI 事件。

A: 這似乎是個 kernel bug。請閱讀 這裡。

Q: 我剛買了一個全新的電池,但是它卻只能撐幾分鐘!那裡出錯了?

A: 首先依照製造商的說明指示將電池正確地充電。

Q: 上面的回答都沒有幫助,我該怎麼辦。

A: 有些所謂 "新" 電池其實是舊貨。試試下面的指令:

原始碼 8.1: 詢查電池狀態

$ grep capacity /proc/acpi/battery/BAT0/info
design capacity:     47520 mWh
last full capacity:  41830 mWh

如果 "last full capacity" 與 design capacity 差很多,您的電池可能壞掉了。這時,該是您使用保固權利的時候了。

這份文件是以 Creative Commons - 姓名標示-相同方式分享 授權條款發布