[分享] Suspend to RAM & DISK

常言道:『飲水思源』,在 Open Source 的世界裡,我們常常需要別人的幫助,但是在您有所心得的時候請記得分享給大家,『幫助人是快樂的喔』。歡迎您在使用 debian 的過程中的任何心得分享給大家。

[分享] Suspend to RAM & DISK

文章yenjinc » 週五 2月 03, 2006 5:54 pm

對於使用筆記型電腦的朋友們,相信這是一個簡單卻很實用的 Tips,
在筆記型電腦上如何啟用 Suspend to RAM & Suspend to DISK?
雖然目前的 Linux distro 在這部份已經支援相當良好,但免不了還是有失敗的例子,
以下提供小弟在 Linux 下啟用 Suspend to RAM & DISK 的過程(例子),提供大家參考 :-)


(一)測試:

先察看您的系統是否已經支援休眠模式了。
代碼: 選擇全部
#cat /sys/power/state
mem disk standby
(如果有 『mem』『disk』... 等值,表示您的系統已支援休眠模式。)


可以簡單的測試一下休眠是否成功
代碼: 選擇全部
#echo -n mem > /sys/power/state 或
#echo -n disk > /sys/power/state


如果上面的測試後,系統可以順利休眠與甦醒,那麼您這時即可使用 Klaptop 或 Kpowersave
(如果您是使用 KDE 環境),來詳細設定 Notebook 的相關休眠動作。

PS:
如果『(一)測試』 的部份,cat /sys/power/state 的值 mem 與 disk 均有,但 Suspend to DISK 是失敗的,
可以檢查一下,您的 menu.lst (如果是GRUB的話),是否有帶入 resume=XXX 的值給 kernel。
而 resume=XXX 的值,即是 resume partition (save the suspended image)。
代碼: 選擇全部
e.g: resume=/dev/hda7
     resume=/dev/<other device> ...



(二) 編譯核心:

代碼: 選擇全部
//-- 不建議 Linux 新手或不熟的朋友重新編譯,避免發生不可預期的後果。--//
//-- 請在編譯核心之時,確保您知道自己在做什麼。--//


如果系統預設不支援休眠該怎麼辦?一種可能是相關的 ACPI 模組沒有被掛載上來,
另外也許是 kernel 並沒有把相關功能編入進去。

如果您曉得模組的相關名稱為何的話,可以使用 modprobe 將相關模組掛載上來,
並按照(一測試)的部份試看看休眠模式是否順利開啟。

這裡小弟的使用方法,則是 re-build 一份 kernel,直接將相關的 ACPI/APM 模組編入核心,
小弟使用的 kernel 為:
代碼: 選擇全部
linux-source-2.6.15           (2.6.15-3)


首先 reload 先前的 .config 檔,接著將以下相關的選項打 * ,編入核心:

代碼: 選擇全部
Code maturity level options  ---> (注意 !!! EXPERIMENTAL!!! )
      [*] Prompt for development and/or incomplete code/drivers
      [*] Select only drivers expected to compile cleanly

   Power management options (ACPI, APM)  --->
          [*] Software Suspend
          (/dev/hda7) Default resume partition (這裡可設定您的 Resume partition)
          [*] Encrypt suspend image

            ACPI (Advanced Configuration and Power Interface) Support  --->
               [*] ACPI Support
               [*] Sleep States
               [*] /proc/acpi/sleep (deprecated)


編譯完成後,依照您的系統建立 initrd (mkinitrd)...修改 menu.lst... 等,接著 reboot 以新的核心啟動系統...

新核心啟動完畢後,可繼續 『(一)測試』 的步驟,來測試自己的系統是否已經支援休眠模式,
若您在 re-build kernel 後,可以順利支援 Suspend to RAM & DISK,那麼真的恭喜您了!

倘若還是不行,那麼可能就要朝多方向去 Debug 了 (已不在本文的範疇中了 :P)
不過,不妨參考本文後面的 Reference,或許可幫助您更順利解決問題。


(三)後記:

以上簡單描述小弟在 Linux 下啟用 Suspend to RAM & DISK 的過程(例子),
提供大家參考 :-),如果大家有相關資料或文獻要補充那真的太感謝了!

代碼: 選擇全部
那麼預祝各位使用愉快!


小弟的測試環境:
代碼: 選擇全部
測試機器: IBM X40
測試版本: Debian (with kernel 2.6.15-3)


更多資源:
代碼: 選擇全部
http://moto.debian.org.tw/viewtopic.php?t=3149
http://moto.debian.org.tw/viewtopic.php?t=8304
http://moto.debian.org.tw/viewtopic.php?t=4286
http://www.suspend2.net/
yenjinc
懵懂的國中生
懵懂的國中生
 
文章: 190
註冊時間: 週三 7月 14, 2004 12:29 am

文章訪客 » 週二 3月 21, 2006 11:53 pm

Hi~各位前輩好~

小弟興沖沖地試了:
#echo -n disk > /sys/power/state
但回應卻是:
-bash: echo: write error: Operation not permitted

請問如果要休眠到DISK是不是非得有swap分割區不可?
(ps.我不是用swap分割區,而是建立一個swap檔)

如果不是利用swap來存記憶的內容,那請問大家我是不是什麼地方沒注意到呢?

謝謝
訪客
 

文章yenjinc » 週五 3月 24, 2006 1:39 pm

因為software suspend 是需要kernel支援,而小弟在kernel選項裡找到與其相關的選項如下,其中需要設定resume partition。
[*] Software Suspend
(/dev/hda7) Default resume partition (這裡可設定您的 Resume partition)
(若建立 swap file 是否同樣可行,這我沒試過... 無法給確切解答)

另外,你 cat /sys/power/state 的時候有 disk 值嗎?
小弟猜設無法休眠至硬碟,或許跟resume partition有關系!可以試試看...
yenjinc
懵懂的國中生
懵懂的國中生
 
文章: 190
註冊時間: 週三 7月 14, 2004 12:29 am

文章訪客 » 週六 3月 25, 2006 3:16 am

Ubuntu 6.04 / Benq 5000G
使用 echo -n mem > /sys/power/state
是可以 suspend, 但恢復時螢幕回不來, 一片漆黑,
(文字模式下測試)
訪客
 

文章yenjinc » 週一 3月 27, 2006 11:28 pm

Anonymous 寫:Ubuntu 6.04 / Benq 5000G
使用 echo -n mem > /sys/power/state
是可以 suspend, 但恢復時螢幕回不來, 一片漆黑,
(文字模式下測試)


其實不蠻您說,小弟的 X40 在文字模式下,待命時螢幕也會回不來,
即使加上: acpi_sleep=s3_bios 一樣無效

不過還好我的筆電都是Desktop在用,幾乎完完全全都在X-window下,
在X-window下,休眠或待命都是可以正常,畫面不會不見。
最後由 yenjinc 於 週二 2月 27, 2007 8:38 pm 編輯,總共編輯了 1 次。
yenjinc
懵懂的國中生
懵懂的國中生
 
文章: 190
註冊時間: 週三 7月 14, 2004 12:29 am

文章訪客 » 週日 4月 16, 2006 8:14 pm

yenjinc前輩
不好意思
再請教您一件事
請問如何設定才能讓一般使用者也可以休眠或待命呢?
謝謝您
訪客
 

文章yenjinc » 週日 4月 16, 2006 11:44 pm

您好,我不是前輩啦!只是普通小咖而已 :-D

由於我的是筆電,通常是我自己在用,雖然我是一般使用者,
但是我是透過 sudo 來作某些需要特殊權限的行為 :ooops:

sudo bash -c 'echo -n disk > /sys/power/state'

不曉得這樣的方式能不能幫助到你 :-)
yenjinc
懵懂的國中生
懵懂的國中生
 
文章: 190
註冊時間: 週三 7月 14, 2004 12:29 am

文章訪客 » 週一 4月 17, 2006 6:53 pm

yenjinc先生,感謝您啦~您這招可以用~

雖然您謙稱不是前輩,但是至少懂得比我多呀!

對了
想再請教您一件事
您這個指令要怎麼寫在/etc/sudoers裡才能確保一般使用者只對這個功能有特權呢?
我原先是寫這樣:
tester ALL = NOPASSWD: ALL
但是這會讓tester擁有所有系統管理者的權限
請問應該要怎寫才好呢?
該不會是換成「tester ALL = NOPASSWD: /bin/bash」吧?
謝謝
訪客
 

文章訪客 » 週一 4月 17, 2006 8:38 pm

對了
附註一點
換成「tester ALL = NOPASSWD: /bin/bash」之後
我可以用test這個使用者以sudo bash -c 'XXXX'的方式來執行任何系統管理者的程式
我能不能設定讓test只能執行休眠,不要讓它的權限氾濫出去呢?
謝謝
訪客
 

文章yenjinc » 週一 4月 17, 2006 11:43 pm

如果是這樣的話
我會以 root 建立一個 scripts 設為 /usr/sbin/Sleep
scripts 的內容即是休眠的指令

然後設定 /etc/sudoers
yenjinc ALL = NOPASSWD: /usr/sbin/Sleep

往後使用者只要 sudo /usr/sbin/Sleep 就可以進入休眠
由於是在Desktop應用才會這麼設定
因為這會牽扯相關的安全性議題....

如果機器是作為 server,我不會給休眠跟待命的功能... :-D

其實其他的 distro 在休眠待命都做的不錯
或許可以找時間看一下其他的 distro 在這部分是怎麼做到讓
所有的使用者都可以不經過任何的權限修改就可以進行休眠與待命動作

或許這才是治本而不是治標方式... :-D

或許其他前輩有什麼方式都可以提出來,這樣大家都可以學到更多東西 :finger1:
yenjinc
懵懂的國中生
懵懂的國中生
 
文章: 190
註冊時間: 週三 7月 14, 2004 12:29 am

文章訪客 » 週日 8月 06, 2006 11:20 am

前輩您好
小弟使用echo -n disk > /sys/power/state
但是卻說找不到我的swap,所以無法休眠
不過我用free指令卻有看見swap正在使用:
~$free
total used free shared buffers cached
Mem: 257060 185756 71304 0 12876 116528
-/+ buffers/cache: 56352 200708
Swap: 2594456 0 2594456

請問各位前輩是否有遇過類似的問題?
謝謝


以下是我的dmesg出現的錯誤訊息:(請看最後幾行)

Freezing cpus ...
Stopping tasks: ====================================|
Shrinking memory... done (0 pages freed)
pnp: Device 00:06 disabled.
pnp: Device 00:05 disabled.
pnp: Device 00:04 disabled.
pnp: Device 00:03 disabled.
pnp: Device 00:02 disabled.
ACPI: PCI interrupt for device 0000:00:14.2 disabled
ACPI: PCI interrupt for device 0000:00:14.1 disabled
ACPI: PCI interrupt for device 0000:00:14.0 disabled
ACPI: PCI interrupt for device 0000:00:11.5 disabled
ACPI: PCI interrupt for device 0000:00:11.3 disabled
ACPI: PCI interrupt for device 0000:00:11.2 disabled
pci_set_power_state(): 0000:00:00.0: state=3, current state=5

swsusp: Need to copy 25566 pages
swsusp: critical section/: done (25566 pages copied)
Intel machine check architecture supported.
Intel machine check reporting enabled on CPU#0.
swsusp: Restoring Highmem
APIC error on CPU0: 00(00)
PCI: Setting latency timer of device 0000:00:01.0 to 64
eth0: link up, 10Mbps, half-duplex, lpa 0x0000
ACPI: PCI Interrupt 0000:00:11.1[A]: no GSI
PCI: VIA IRQ fixup for 0000:00:11.1, from 255 to 15
ACPI: PCI Interrupt 0000:00:11.2[D] -> GSI 21 (level, low) -> IRQ 177
ACPI: PCI Interrupt 0000:00:11.3[D] -> GSI 21 (level, low) -> IRQ 177
ACPI: PCI Interrupt 0000:00:11.5[C] -> GSI 22 (level, low) -> IRQ 201
ACPI: PCI Interrupt 0000:00:14.0[A] -> GSI 16 (level, low) -> IRQ 185
ACPI: PCI Interrupt 0000:00:14.1[B] -> GSI 17 (level, low) -> IRQ 193
ACPI: PCI Interrupt 0000:00:14.2[C] -> GSI 18 (level, low) -> IRQ 169
usb usb1: root hub lost power or was reset
ehci_hcd 0000:00:14.2: USB 2.0 started, EHCI 0.95, driver 10 Dec 2004
pnp: Device 00:02 activated.
pnp: Device 00:03 activated.
pnp: Device 00:04 activated.
pnp: Device 00:05 activated.
pnp: Device 00:06 activated.
pnp: Failed to activate device 00:0b.
pnp: Failed to activate device 00:0c.
swsusp: Cannot find swap device, try swapon -a.
Restarting tasks... done
Thawing cpus ...
訪客
 

文章yenjinc » 週六 8月 19, 2006 1:29 pm

上面那個是你在休眠時,所出現的訊息嗎?

小弟猜測,其中問題可能是︰需要設定 resume partition。
要在 kernel 選項中打開:

[*] Software Suspend
(/dev/hda7) Default resume partition (這裡可設定你的 Resume partition)

小弟猜想,無法休眠至硬碟,或許跟 resume partition 有關系!可以試試看...
或者你在開機選項中,有餵給 resume=/dev/hdaX 的值嗎?(swap partition)
yenjinc
懵懂的國中生
懵懂的國中生
 
文章: 190
註冊時間: 週三 7月 14, 2004 12:29 am

文章訪客 » 週六 8月 19, 2006 7:27 pm

感謝yenjinc前輩 :finger1:
您的建議真是太有效了
小弟在lilo.conf加上一句
append="resume=/dev/hda7"
重新執行lilo之後就能順利休眠了~
真是非常感謝您的幫忙

真怪...
明明另一台電腦並沒有在lilo.conf寫上這一段,而核心也相同
不知道為什麼這一台電腦就偏偏要進行這樣的動作
訪客
 

文章訪客 » 週一 9月 04, 2006 5:32 pm

螢幕回不來, 一片漆黑

add acpi_sleep=s3_bios to the kernel commandline
訪客
 

文章訪客 » 週日 9月 17, 2006 8:23 pm

大家好
小弟發現休眠的過程中都會釋放一部份記憶體
雖然這樣可以減少進入休眠的總時間
但卻會增加下次重新啟動之後初次開啟程式的時間

請問各位前輩
是否有什麼方法可以能讓休眠過程不要釋放記憶體,並把所有內容完整寫入swap?

謝謝大家
訪客
 

下一頁

回到 share

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客