Linux 這玩意,每次出問題後都讓我 "驚豔",今次我們來談談 Linux 上令人髮指的睡眠 / 休眠功能。
"睡眠" 及 "休眠" 在電腦中屬於電源管理的一個環節,真正的名字是 "Advanced Configuration and Power Interface" (ACPI),旨在用軟體控制電源的開關。很多人並不熟悉這個,除了它本身有些複雜之外,主要的原因是它需要軟硬體的深度搭配,如果做不好,就會發生一睡不醒或是無故醒來的慘劇。最好的例子就是 Windows 的睡眠或休眠功能幾乎是沒人用的,因為實在太多出包的案例,所以使用者很自然地被教育成 "不使用就直接關機",平常這樣做是沒有什麼影響,但如果你是個帶著筆電到處跑來跑去的人,每次在那裡開關機不僅很蠢,而且非常浪費時間。
對於 Mac 使用者來說,使用睡眠或休眠是再平常也不過的事了 [1],原因在於軟硬體的整合就是 Apple 的強項,由於軟硬體都是他們家指定的,品質的控管當然比較好。相較之下,Windows 及 Linux 必須安裝在各家 PC 中,自然很容易出現相容性問題,也難怪之前有則新聞說 "表現最好的 Windows 筆電:蘋果 MacBook Pro?",原因就出在於硬體的驅動程式,其他硬體廠商在缺乏軟體資源的情況下沒辦法寫得比 Apple 更好。
OK,如我前面的段落所說,睡眠及休眠其實是相當複雜的,嚴格來說有很多種,但是一般使用者沒必要知道全部,因為實際用到的幾乎不會超過三種,以我自己當例子,我使用過其中兩種,而最常用的只有一種。下面我來簡單地介紹一下:
以 Linux 中 pm 指令的操作說明為例,大約分為三種。
- pm-suspend:別名為 "Suspend to RAM" (STR),在 Mac OSX 裡就是 "Sleep",故我都稱它 "睡眠",為 Mac 桌機的預設值。pm-suspend 所做的事就是把系統當時的狀態保留在 RAM 裡,隨即切斷其餘大部分的電源 (如 CPU 及硬碟等)。由於 RAM 本來就是在裝這些東西,所以睡眠速度很快,而且喚醒時的回復速度也很快,一兩秒之內就可以搞定,但缺點就是電腦必須保持 RAM 的電力,不然資料就會流失,故 "睡眠" 本身相對耗電一些。
- pm-hibernate:別名為 "Suspend to Disk" (STD),在 Mac OSX 裡就是 "Hibernate",故我都稱它 "休眠",它是將記憶體紀錄的系統狀態全部儲存到硬碟中,以 Mac OSX 來說,儲存的位置為 /private/var/vm/sleepimage,而在 Linux 裡則是儲存在 swap 磁區裡,若 swap 不夠用則再寫到其他磁區 [2]。休眠的好處在於它相當省電,幾乎完全不耗電,把電源移除都沒有關係,開機之後就會回復到休眠前的狀態,但缺點就是進入休眠及喚醒的時間相當長,在過程中最好不要移動機器,因為休眠過程涉及硬碟的讀寫。
- pm-suspend-hybrid:這種休眠方式是上述兩者的總和,也就是記憶體及硬碟內都擺一份系統狀態檔,如此一來喚醒的速度很快,而且若電源被移除也有硬碟內的備份可供回復。由此可知,這種方法兼具上述兩者的優點,故在 Mac OSX 上被稱為 "Safe Sleep",意指 "就算失去電源也無所謂的安全睡眠",且為 Mac 筆電的預設值。然而,有得就有失,它連上述兩者的缺點也一併保留 -- 耗電、入睡時間長。
OK,那 ..... 有什麼問題呢?大家請看下圖:
這是我家桌機的 Linux Mint 之 "系統設定值" > "電源" 的視窗擷圖,在此設定選項中我可以設定當系統閒置多久後即進入睡眠狀態,看起來很正常,但有兩個不方便的地方:
- 不能指定睡眠 / 休眠的模式
- 不能立即進入睡眠狀態
Mac 上的作法
這樣的問題 (或說是需求) 在 Mac 上同樣也會發生,但要解決簡直是 "不費吹灰之力",比如說 Mac 筆電只要將螢幕蓋下即可 (如果這還不會我也認了),若為 Mac 桌機則可用特定的睡眠快速鍵,或是寫個 script 存放在桌面上,要睡眠時點兩下啟動即可,作法如下 ....
- 鍵盤快速鍵:同時按下下面三個鍵即可,但有些不附光碟機的 Mac 沒有 Eject 鍵,而一般鍵盤當然也沒有 Eject 鍵,更糟糕的是這個快速鍵是無法更改的 (不過我認為這個快速鍵組合遲早會被 Apple 改掉),所以很多 Mac 用戶無法使用這種方法。
Command + Option + Eject - 硬體快速鍵:按下電源鍵後可以直接啟動睡眠,可是電源鍵是實體按鈕,常按不知道會不會跟 iOS device 的 Home 鍵一樣變得不靈敏。
- AppleScript:打開 AppleScript 編寫程式,輸入以下指令並儲存成應用程式即可。
Tell application "Finder" to sleep - Shell script:打開文字編輯軟體,輸入以下指令並儲存成純文字 txt 檔,隨即改成 sh 檔及加入 "執行" 權限即可。
pmset sleepnow
如何?如果是已經知道指令的人,不用兩分鐘就可以解決了,就算不知道指令,隨便搜尋一下也可以在半小時內解決。但是呢,就這麼一個簡單的需求,Linux 的複雜就是可以把你搞到瘋掉。
Linux 的 "自由"
Linux 最大的優勢就是 "自由",它不像 Google 搞的是假自由、假開放,它是玩真的。可是 "自由" 的代價也很明顯,就是 "混亂"。
在這裡我先不提自由軟體的優劣,因為要扯這些歷史故事實在太累人了,我們只要從本文主旨 -- "電源管理" 就可以見微知著。如前幾段所述,我希望能找到一個快速睡眠的方法,所以我仿效在 Mac 上的作法,考慮快速鍵及 script。但是,Linux 幾乎沒有快速鍵這種東西,這裡每個軟體各自為政,系統層級的快速鍵少之又少,就算有,你可能也不知道。更糟糕的是,同樣的一組快速鍵,在不同的 Linux distro 上,功能可能還不同 (比如說 Ubuntu 的 "Ctrl + Alt + Backspace" 就跟 Mint 的功用不同),實在是讓人無言阿,所以還是不要倚靠這條路吧,更何況各位可以去逛逛 Linux 討論區,網友們根本不在意這個。
OK,既然 Linux 社群這麼喜愛文字指令,那就用這種方法也不錯,更何況把指令製作成 script 檔 (sh) 擺在桌面也很方便。可是一開始搜尋之後我就傻了 .....
怪怪!不過是電源管理,你們要搞幾套軟體出來才過癮?
不信嗎?我列舉我有找到的軟體 (只有文字介面的軟體,其實就是指令) 給大家開開眼界:
- sudo echo "mem" > /sys/power/state
- sudo echo "shutdown" > /sys/power/disk; echo "disk" > /sys/power/state
至於 "休眠" 指令的前一段 echo "shutdown" > /sys/power/disk 是啥意思呢?簡單的說就是 Linux 的休眠有兩種,分為 "shutdown" 及 "platform",我查到的資料是說若該電腦之硬體對於 ACPI 的支援 "比較好" 才可用 "platform" .... 這部份我不太懂,也沒時間再去深入研究了。
- sudo pm-suspend
- sudo pm-hibernate
- sudo pm-suspend-hybrid
- sudo /etc/acpi/sleep.sh
- sudo /etc/acpi/hibernate.sh
- sudo s2ram
- sudo s2disk
- sudo s2both
要有 root 權限才能睡眠?
OK,上述的指令有沒有讓各位眼花撩亂?說真的我不覺得這種自由會帶給大家方便,只是很 "搞剛" 而已,不過 Linux 本來就不在意使用者體驗就是了。好,講了那麼多,但是上述的功能我一個都看不上眼,也不建議各位使用,因為實在太蠢了,看看每句指令前的 "sudo",也就是說你只不過是要讓自己的電腦睡眠,卻要管理者 (root) 權限!
當然,技術上來說,要以軟體直接與硬體溝通,的確應該要有管理者權限,但還是覺得很不甘心,而且調整 "電源" 的設定又不需要管理者權限 (如本文第三張圖),表示以 GUI 層級就能辦到,擁有管理者權限不是必要條件。所以我又找到了幾種方法 (X 的,到底還有幾種) ...
- gnome-power-cmd suspend
- gnome-power-cmd hibernate
- pmi action suspend
- pmi action hibernate
- dbus-send --print-reply \ --system \ --dest=org.freedesktop.DeviceKit.Power \ /org/freedesktop/DeviceKit/Power \ org.freedesktop.DeviceKit.Power.Suspend
- dbus-send --print-reply \ --system \ --dest=org.freedesktop.DeviceKit.Power \ /org/freedesktop/DeviceKit/Power \ org.freedesktop.DeviceKit.Power.Hibernate
=======================
"自由"?科科。
20130610 Update:感謝各位的捧場,本文的點閱率相當不錯 (似乎只要是 Linux 的相關文章都是如此,可能是 Linux 的中文資源真的太貧瘠),故我補充一點東西。在本文中提到的 "睡眠" 及 "休眠" 都是遵循 ACPI 的定義,比如說前者是 "只留下 RAM 的電源紀錄系統狀態,其他部分不供電",故若要喚醒 "睡眠" 中的電腦,必須按下電源鍵才可以。可是 Mac 的 "睡眠" 或 "休眠" 都與之不同,Mac 利用軟硬整合的優勢,讓它的睡眠及休眠狀態都仍以低電源的方式,持續供電給週邊設備,如鍵盤及滑鼠,所以使用者能以鍵盤或滑鼠喚醒他們的 Mac,以上是一點小補充。
20190407 Update:Linux 的 Kernel 更新好像完全不管兼容性的 .... 我使用的是 Linux Mint MATE,上述 D-Bus 的休眠指令只在 Linux Mint 17 (含) 之前有效,我沒用過 Mint 18,目前確定 Mint 19 的 Kernel 相容於新的休眠指令:
- dbus-send --print-reply --system --dest=org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager.Suspend boolean:true
附註
1. 當然我也遇過用了十多年 Mac,還堅持每次都要關機的 Mac 使用者,然後在客戶那裡都要花幾分鐘等開機 .... 算了,他喜歡就好。
2. 不過 Linux 沒這麼自動化,一旦出問題你還是要自己去調整休眠檔的存放位置。
3. 其實 Windows 的 "Standby" 有兩種型式,另一種就是 ACPI 定義的 Standby .... 如果覺得很複雜也無所謂,不要去用就沒事了,因為出包案例幾乎都發生在 Standby 模式。另外,Windows 的 "Sleep" 是到 Vista 推出後才加入的,之前完全沒這玩意,不過在意的人也不是很多就是了 ....
4. 以 D-bus 及 UPower 寫成的睡眠或休眠指令不只有一種寫法,只要看到 "dbus-send" 開頭,以及內容有提到 "org.freedesktop" 的指令,基本上功能都是相同的。
自由的代價就是混亂,實在說的太棒了XD
回覆刪除強烈建議很閒的人再去用 Linux。
刪除可惡,Linux可是我的工作系統。Laptop也是關了就走走.不過建議要用Linux最好用有牌子賣的好的電腦,不然真的會搞到死。
刪除由於 Linux 有太多問題需要自己解決,所以若無熱情及時間,應該會用得很辛苦。
刪除另外,雖然我這篇文章旨在分享 Linux 的休眠方法,但用於筆電時會不會無故醒來,我也不敢保證。
當初有想過要從win跳liunx嘗鮮,但不管試幾次都一直被打臉...
刪除最後一次嘗試,為了避免被打臉,拿去朋友家請他教我設定pppoe
我確定學會了,也在他家成功pppoe播接上adsl
結果電腦拿回家用同樣的流程還是無法播接...orz
所以我決定再也不碰這個麻煩的系統了
我第一次接觸 Ubuntu Linux 的時候,也是很不解為何 PPPoE 的設定介面沒有 GUI,那時候已經 2006 年了,居然還有這種荒唐事,可是社群還是自我感覺良好,沒辦法。
刪除直到今天,Linux 始終在追趕,但 "內部阻力" 非常大,而且令我十分驚訝的是,Linux 至今居然還是沒有一套登得上檯面的繁中輸入法,要馬是與程式的連結有問題,要馬沒有學習能力,要馬安裝後無法啟動 .... 想想 SCIM 及 gcin 發展多少年了,居然還跟 beta 版沒兩樣 (iBus 完全是垃圾,我根本懶得噴了)。
不能怪大家愛用 Win 或 OSX,"便宜沒好貨" 也不見得是真理,但 Linux 至今仍未突破這層魔咒。
試試看Debian的繁中輸入法?
刪除請問是哪一套呢?
刪除Try Debian Linux 6 (Squeeze).
刪除Use "apt-get install ibus-chewing"
Sorry! Its Debian GNU/Linux.
刪除我記得Eject那個位子被改成電源鍵,所有的快速鍵還是可以照用啊,至少在我的MacBook Air上是這樣。
回覆刪除我有在某個外國論壇看到某老外說他的 MacBook Air 沒有 Eject 鍵,然後求休眠快速鍵的替代方法,但文後也沒有人跟他說電源鍵可以替代 .... 所以你可以用 "Command + Option + Power" 去使 Mac 睡眠?
刪除不過對我是沒差啦,因為我只有 Mac mini (2006 的老機及老系統根本不支援這組快速鍵),而我的鍵盤是雜牌的。
作者已經移除這則留言。
刪除可以的呀
刪除cmd opt power 可以睡眠
ctrl cmd power 可以重開機
ctrl opt cmd power 可以關機
ctrl shift power 可以關螢幕
這些都可以用~
感謝你的情報,可惜我的雜牌鍵盤沒有 power 鍵,而這個鍵也沒有對應到一般鍵盤上的其他鍵,所以我個人是無法使用了 orz
刪除D-BUS移植應該已經有了。
回覆刪除我之前很無聊裝了KDE SC for Windows就發現裡面包了這玩意。
不過...有些軟體還不是很穩,像是看圖用的Gwenview,根本就是每開必當。
後來我發現每個動作之間都要停個1-2秒才不會當,WTF!
自由軟體就是這樣,很多東西還來不及測試完畢就發布了,想當初 Ubuntu 6.0 的年代,自由軟體社群最熱門的繪圖軟體 GIMP 居然每開必當,實在是扯到不行,到後來幾版才有改善。
刪除其實Windows Vista之後的Sleep已經寫得算不錯了
回覆刪除如果不計較吃電像喝水的老問題其實已經看得到OSX的車尾燈
另外Windows從NT6.1(Win7)開始好像改成這樣:
刪除Sleep=STR
Hibernate=STD
在控制台裡開啟混合式休眠(hybrid sleep)=uspend-hybrid
同時Hibernate選項會消失
感謝您提供情報~
刪除網誌管理員已經移除這則留言。
回覆刪除網誌管理員已經移除這則留言。
回覆刪除