顯示具有 book 標籤的文章。 顯示所有文章
顯示具有 book 標籤的文章。 顯示所有文章

星期三, 9月 10, 2008

Linux下的Hibernate(Suspend to Disk) – ACPI定義的睡眠模式之一

延續上一篇“電源管理—Linux下的ACPI”,這次談談更深入的Linux Hibernate的作法。Linux在許多使用上,其實都已經做到Desktop所需要的功能,像我所要介紹的Hibernate功能就是其中之一。

從上圖中可以發現,Hibernate和關機的差異是非常大的,可以說是完全不一樣的事情,在一般看得到的書中,Hibernate就是一般我們在ACPI中所謂的G1S4。
G1指得是“Sleeping”,也就是睡眠狀態,一般會用到G1的情況有兩種,Standby或Hibernate,分別為G1S3與G1S4,這兩種的差異主要在於Suspend to RAM(STR)及Suspend to Disk(STD)。
因此S4指得則是第四個階段,也就是Suspend to Disk(STD),所以G1S4整體的意思就是讓系統睡得程度到“Hibernate”階段。之前使用者較常會用到的應該是S3,因此電源都無法完全關掉,會有些許的電源用來供應記憶體,但S4則可以做到將電源完全關掉,而保留住系統目前的狀態。
但Hibernate的動作在Linux中是如何達到,以及到底做了哪些事情,當Hibernate進行時又是參考哪些檔案,是這篇文章中要介紹給各位的。
1. Hibernate所參考的檔案
Hibernate所參考檔案都是由pm-utils套件所提供的,pm-utils是一套電源管理的工具軟體,在2.6的kernel之後,都已經支援ACPI的功能,所以可以做到像Hibernate的省電模式,但這些動作在啟動時,若還有硬體(像USB設備)在系統上該如何處理,就可以透過pm-utils來做一些關閉硬體的動作,但其實pm-utils是透過一個『HAL』的服務程式(在Redhat中此服務的檔案名稱為haldaemon)在控制,所以一般看不到pm的字眼。不過雖然是透過HAL在操作,但使用者一樣可以加一些自己的動作在其中,做細部的調整。
基本上pm-utils除了【/etc/pm】這一個目錄外,【/usr/lib/pm-utils】也是主要的目錄之一,其實如果細看【/etc/pm】,裡面是空無一物,因為這是預留給使用者自行使用的地方,系統真正在執行的,是在【/usr/lib/pm-utils】底下的檔案,不過【/etc/pm】是可以使用的,只是檔案要自行產生。
在【/usr/lib/pm-utils】下,最好用的目錄就要屬sleep.d這一個(如下圖所示),因為當使用者在進行Hibernate(休眠模式)時,就會依據這目錄中的檔名前兩碼數字的大小(由小到大),依序進行執行的動作(正常應該說是關閉的動作,但因為可以自行設定,不在這邊定義為關閉);相同的,在【/etc/pm】的目錄下,也有和這邊類似的目錄,只是都是空的,這在上面有提過。不過這邊有幾點是要特別注意的:
a. 系統在進行Hibernate時,是先執行【/etc/pm】的目錄,再執行【/usr/lib/pm-utils】目錄中的檔案;但啟動是相反的,會先執行【/usr/lib/pm-utils】後,再執行【/etc/pm】目錄下的檔案。
b. 系統在進行Hibernate時,會從目錄中檔名的前兩碼數字由小到大進行執行動作;但再開機時,是相反的,也就是會由數字大到小執行。
這兩點要注意的原因,主要是一般預設立場是要進行關閉的動作,所以往往會忽略開機時是要進行啟動,剛好目的是相反的,自然順序也就跟著變動,在細節的設計上要特別注意。

2. Hibernate所進行的方式
最簡單要進行Hibernate的方式,就是在X Window關機時,不要用原本關機的選項,而改用『Hibernate』的方式(如下圖所示),只要點選下去,系統就會自動進行Hibernate,但要注意,若系統中的“haldaemon”沒有啟動,是不會有這選項的。

如果需要比較進階的使用,就必需要參考到/sys/power目錄,該目錄是主要Hibernate在進行時的“開關”,這一個目錄只存放和電源模式有關的檔案,更正確的說法,是只有電源管理機制的檔案。裡面只有幾個屬性檔案在其中,屬性名稱(也就是檔案名稱)及其值都請參考下圖

每個屬性的意義介紹如下:
1. disk:當使用者在做休眠模式中S4的STD(suspend to disk,或稱為Hibernate)時,要將系統的狀況寫入到硬碟中,因此這邊是在定義當狀態寫入到硬碟後,“系統”該如何運作。基本上目前2.6的kernel支援以下五種模式:
a. platform:不知其運作方式,但只有在該平台有支援時才可使用。
b. shutdown:當進入休眠時進入關機狀態。
c. reboot:當進入休眠時進入重新開機狀態。
d. testproc:testproc與下一個test,這兩者的模式比較特別,都是屬於即時測試休眠功能所可可以使用的狀態,也就是可以讓使用者進入模擬的休眠模式,再自動回複到原本的系統狀態,所以一直都在原本的使用狀態下。
testproc主要有以下幾個步驟(系統訊息如下圖所示):
關閉未使用的CPU  凍結所有的工作  等五秒鐘  將原本的工作還原  打開原本未啟動的CPU

e. test:和前一個testproc的不同,是在測試時更完整,連記憶體和硬體設備的部份也加入模擬的階段。
test主要有以下幾個步驟(系統訊息如下圖所示):
關閉未使用的CPU  凍結所有的工作  壓縮記憶體  關閉設備  等五秒鐘  恢復設備的狀態  將原本的工作還原  打開原本未啟動的CPU

這五種中最常被使用的就是“shutdown”(a不知其作用為何,但一定要系統有支援才可使用),後三者(“reboot”、“testproc”、“test”)則較少為人知,因為這三種大部份是在測試單位(可能也只在專門測試休眠功能的單位)才有機會被使用到,不然使用的機會少之又少,但實在是一個造福測試者的功能。不過使用上真的很簡單,如筆者電腦的“disk”檔案預設設定為“shutdown”,如果更改為“reboot”,當休眠完成後,將不會關機,而是“重開”。
所以想當然,誰會在做休眠時的下一步要“重新開機”,這樣完全無法省電,所比這一個機制其實是還是為了測試休眠模式所定義的,只是可能會將測試的範圍擴大到整個系統的流程,而不是像“testproc”和“test”僅限於測試休眠的部份功能,畢竟完整的動作是包含關機與開機。
2. image_size:目前系統可接受的最大image大小,預設為512MB。
3. pm_trace:這是一個控制開關,可比決定是否要記錄在多次的重新開機後,最後一次存在RTC中的事件點,預設值為“0”,代表不記錄,若改為“1”,則可進行記錄的動作。
4. resume:當系統進行S4(suspend to disk)時,系統要將系統狀態寫入的位置。所以這屬性其實是代表某一個分割區的major及minor ID(一般都是SWAP分割區),若需要使用resume分割區,就必須在開機時先在GRUB的開機參數中,加入resume=/dev/xxxx的參數,才可以讓系統知道要使用該分割區當寫入的分割區。在下圖中的resume值之所以為“0:0”,是因為主機中沒有設定該參數(SuSE在預設就會加入該參數)。
5. state:目前系統可支援的休眠模式,一般只會有以下三種(或只有其中一兩種)狀態(S2一般電腦都不會支援):
a. standby:就是一般所謂的S1,S1是在睡眠狀態中最吃電的一種狀態,CPU中的cache都持續供電,但停止執行指令。在CPU及記憶體的部份都有電力在供應,但其他的裝置就沒有硬性規定,可斷電也可供電。
b. mem:就是S3(suspend to ram),在此狀態下,只有主記憶體有接受供電的權利。但值得注意的是,雖然大部份的資料都會回寫到記憶體,但硬碟本身的Buffer有可能來不及回寫到硬碟,這樣就會造成資料流失。
c. disk:就是S4(suspend to disk),俗稱休眠狀態(Hibernet,或稱冬眠狀態),其技術上的名稱則為Suspend to Disk (STD),這一階段會將所有執行中的資料全部寫入到硬碟中,而之所以要寫入硬碟,就是因為要完全的斷電,但也因為如此,在回覆到原本工作狀態所使用的時間會比S3來得久。
更簡單的說,其實如果將“state”檔案以“disk”值寫入(如:【echo “disk” > /sys/power/state】),這動作等於切換“state”開關至“disk”選項,因此系統就會直接進入休眠,並且將休眠模式認定為前面我們提過的“disk”檔案中所記載的方式,像“shutdown”。

星期五, 8月 29, 2008

第二本書完成了 -- Linux系統架構與目錄之解析

http://www.delightpress.com.tw/book.aspx?book_id=SKNS00002
這本書寫了大概快一年的時間, 一開始寫這本書主要的目的, 是為了讓Linux的使用者, 當操作時遇到問題或是卡在某一些檔案無法進行或運作下去, 卻無法知道這些目錄或檔案的作用為何時, 可以用來查詢的一本實用工具書, 當然也是因為市面上一直找不到類似的書, 所以只好自己寫一本, 雖然花了很多時間, 但看到成品出來, 還是很值得的.
只是這本書, 怕會有一些爭議, 畢竟每一個版本的Linux多少會有不同的地方, 因為我個人覺得大多數初學者應該都會以Redhat的系統為一開始的作業系統, 所以就以Fedora為整本書的範例, 實在沒辦法顧到每一個版本, 但主要的幾個常用目錄, 像設定檔/etc, VFS /proc, /sys, /dev等等, 這些相當重要的目錄就不會是哪一個Linux版本, 一定都是一致的, 所以對真正核心的重要性, 我想是一樣的, 只怕慣用不同版本的讀者, 會不習慣裡面的某些目錄檔案.
其實有了出書的經驗, 會知道讀者的反應是真得很重要的, 因為不然根本無法得知自己寫出來的成品, 是不是讓大家真的有所收穫, 畢竟在台灣寫這些資訊相關的"店頭書", 說真的是沒啥賺頭的, 除非像鳥哥知名度大開的, 應該就可以賺個好幾翻, 不然像我這樣, 大概也只是做一些讓自己開心, 可以留做回憶的事情, 再來就是可以吃幾頓大餐...所以重點...真的是在讀者的反應, 第一本書"Linux作業系統之奧義"讓我知道有用心是會有回報的(可不是$$唷, 雖然是有一些些啦...^^), 現在也在等看看, 看第二本是不是也可以讓我看到一些讀者的反應, 又要緊張幾個星期囉.

星期五, 3月 14, 2008

一本書把自己用瘋了

現在在寫一本覺得對大家都很有用的書, 不過發現東西太多太多, 和Linux的關聯度太廣, 和之前的Linux流程比起來真的是有點小屋見大屋的感覺, 但現在又還不能說是寫什麼樣的題材...唉....想抱怨都不知該如何說起, 只希望可以儘快的寫完, 可以再寫一些別的東西.
在煩的時候也已經想過Linux的領域有哪些應該要有人跳出來, 卻遲遲沒有人要做的事情, 其實也不知道是沒人寫還是大家都不想做這些事, 反正看起來我的能力還可以幫很多人整理出一些頭緒, 就繼續完成.
只是經過這兩本書, 我肯定的說, 要完成一本從無到有的書(自己想出的題材), 除了理想還是理想, 要是沒了這動力, 大概也不會想寫下去吧.

星期二, 1月 08, 2008

我的第一本書--Linux作業系統之奧義



這本書其實是在偶然的機會下產生的, 原本只是覺得目前市面上沒有Linux的書適合讓基礎的讀者了解到底何謂Linux, 大部份都是在談一些Server...設定...架站...X Window等等非觀念的書, 所以才會興起出版一本我個人認為比較像是在介紹Linux為何物的觀念書, 當然也沒想到很多讀者在看過這本書後, 都給予我正面的肯定, 感動中~~~~
但對讀者比較抱歉的是, 因為是第一次出版, 所以在沒有經驗的情況下, 第一版的書有比較多的錯誤需要修正, 出版社也以最快的速度修正完畢, 只是自己對已經買到書的讀者感到抱歉, 不過在悅知的網站上已經放有堪誤表供讀者下載, 希望可以解決很多讀者的問題, 也感謝很多讀者來信告訴我錯誤的地方.
在看這本書的過程中, 相信有很多讀者會有很多的問題, 因為這本書當初的設計和大部份作業系統的書很不一樣, 雖然沒有很多頁, 但其實提到的東西非常多, 也是我自己累積下來的一些觀念, 所以如果有無法理解的部份(書中儘量以簡單的方式闡述), 也歡迎直接透過這篇文章的回覆來詢問, 或是用我書中的email和我聯絡都好(只是這樣別的讀者就無法看到您當初遇到的問題), 我會儘快回覆給每一個讀者.

-------------------------------------------------------------------------------
在2008底找到的一些讀者相關建議, 這些不論好壞反正我找得到的就都貼出來(之前一些文章好像已經不見了), 目的只是希望如果有人想參考或是我自己需要再回頭看一下當初大家的意見, 要是有人希望我將連結刪除, 就請mail給我, 謝謝.

http://www.wretch.cc/blog/sclin0323/25986650
http://www.dbanotes.net/review/linux_hardware.html
http://bbs.phpchina.com/thread-61806-1-3.html
http://www.hiadmin.com/%E4%B9%A6%E8%AF%84-linux%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E4%B9%8B%E5%A5%A5%E7%A7%98/
http://www.anobii.com/books/Linux%E4%BD%9C%E6%A5%AD%E7%B3%BB%E7%B5%B1%E4%B9%8B%E5%A5%A7%E7%BE%A9/9789866761065/017b696892e1d8208b/
http://dango-akachan.appspot.com/?p=40002
http://www.seo-space.net/blog/129-Linux-Book-System-Directory.html

在2007/09/12 於悅知網站所發表的"電源管理—Linux下的ACPI"

ACPI的全名為Advanced Configuration and Power Interface,是在1996年12月由HP、Intel、Microsoft、Phoenix及Toshiba一同推出的,主要的作用就是在控制與管理系統上所有和電源相關的硬體或設備,當然也包括了外接的週邊設備。在【Linux作業系統之奧義】一書中有提到有關Intel及AMD在Linux下省電模式,這一部份就是ACPI針對CPU的電源管理的其中一種表現方式,所以其實ACPI是一個非常浩大且重要的管理機制。
大家都知道開機與關機,但這一兩個動作所牽涉到的層面其實非常廣,從CPU的電源要吃多少、關機要關到哪一個程度、關機後的動作為何,一直到要如何回覆到原本的狀態,都在ACPI的規範中。舉一個最簡單的例子,在Windows95或Linux 2.4 kernel之前,是不是一按系統的Power Button就會直接斷電,但在Windows98及Linux 2.6 kernel之後的版本,就可以進入所謂的關機階段,自動一步一步的將電源關閉。這中間的差別在哪裡?是硬體還是軟體?其實就在於整個電源的管理模式更新為ACPI的方式。

針對系統的電源管理,ACPI處理電源的方式可以分為G0、G1、G2、G3四個主要的全系統狀態(Global State),分別介紹如下:
1、
G0:一般正常的“工作”狀態,使用者開機進入作業系統後便是屬於此一階段,在這一個正常的用電階段,使用者還是可以進行細部的調整,例如等一下會介紹到針對設備的省電模式。。
2、
G1:就是較常聽到的“睡眠”狀態(sleeping),也是一般使用者比較有機會在作業系統下做調整的模式,在G1的狀態下,可以再細分為S1、S2、S3、S4四個子狀態:

S1:S1是在睡眠狀態中最吃電的一種狀態,Notebook中有時使用的"Standby"選項就是採用S1的方式,但比較好的做法,現在都會以S3為標準。CPU中的cache都持續供電,但停止執行指令。在CPU及記憶體的部份都有電力在供應,但其他的裝置就沒有硬性規定,可斷電也可供電。S1的狀態一般都是在較舊的電腦中才會看到,因為很多新型的主機都將G1S1的功能拿掉,或是廠商會支援使用者在BIOS中做設定,讓使用者可以選擇使用S1或是S3。

S2:所謂的沉睡(Deeper Sleep),連CPU都會斷電,但鮮少電腦會支援G1S2。

S3:這對大家而言一定最為熟悉,因為這就是在Windows選項中會出現的“Standby”,但在技術上的名稱則為Suspend to RAM (STR)。在此狀態下,只有主記憶體有接受供電的權利。但值得注意的是,雖然大部份的資料都會回寫到記憶體,但硬碟本身的Buffer有可能來不及回寫到硬碟,這樣就會造成資料流失,因此在用S3的狀態時,最好是先將硬碟的buffer及cache都關掉,以免造成上述的問題發生。另外,因為ACPI並不是一個世界通用標準,只是由幾間公司所在推的一個功能,因此Linux並沒有完全的支援,像談到現在為止的S1、S2、S3到目前為止Linux都沒有加到預設的功能,只有接下來提到的S4已經變為Fedora 7、RHEL5及SLES10的標準配備。

S4:俗稱冬眠狀態(Hibernet),其技術上的名稱則為Suspend to Disk (STD),這一階段會將所有執行中的資料全部寫入到硬碟中,而之所以要寫入硬碟,就是因為要完全的斷電,但也因為如此,在回覆到原本工作狀態所使用的時間會比S3來得久。在Fedora 7中,已經將S4加入到關機的功能之一,這也是G1中唯一可以在Linux下所使用的“睡眠”方式 。




3、
G2:可稱為Soft Off或是S5,在主機完全關機時,僅供少許的電力給一些像網路卡、鍵盤或像USB設備等,俱有“喚醒”功能(Wake)的設備,當需要開機時,只要透過網路或鍵盤就可以將遠端或近端直接打開電腦。但有個限制,比如說原本設定從網路開機,如果關機後使用者將網路卡拔掉,就會破壞G2的狀態,意即進入G3。在Linux中可以設定網路卡的等待狀態,也就是說直接指定某一張網路卡,當關機時要傾聽有沒有需要被“喚醒”,




設定完成後,只要在同一個網段內的電腦,執行“喚醒”指令,就可以透過在等待中的網路卡的MAC Address,將電腦“喚醒”,也就是進入開機程序。






4、
G3:Mechanical Off,這時的供電大小近乎於零,其實就是各位使用者一般的關機,在正常關機程序結束時便進入G3的狀態,但為何指明是“近乎於零”,因為其實還是有些許的電力在等待使用者開機使用,所以如果在家中要省電,還是把插頭拔掉吧,不然電腦是永遠都在吃電狀態的。


剛剛所提到的這些全系統狀態,指的都是整體的電源管理,而ACPI同時針對CPU也定義了電能以及效能狀態的規範,只是Linux到目前為止大部份沒有完全照著ACPI的方式執行。

以電能狀態而言,CPU分為C0、C1、C2、C3四種狀態,裝置也同樣被區分為D0、D1、D2、D3四種狀態,基本上大同小異,都是數字越小就越耗電,越大就越省電,但在Linux下可以看到,其實不會完全遵照這些狀態的定義,也就是功能雖然有部份做到,但不會完全照著ACPI的定義。









就CPU的效能狀態來說,ACPI定義了17個狀態,稱為P-States,從P0一直到P16。P0的效能最高,P16最低;但相對來說,也就是P0最耗電,而P16是最省電。在Linux 2.6 kernel下,要看到Linux針對ACPI所定義出的CPU效能狀態(P-States),就必須在/sys目錄下才看得到。在圖中可以看到,雖然定義了17種狀態,但實際上只會使用到2到3種的速度去因應CPU的效能變化,但在實際的運作中,只能說夠用了。






當然ACPI定義了不只這一些,另外還有很多的表格要去參考,真的是蠻複雜的一個機制,尤其ACPI並非完全由作業系統來控制的,一樣是透過作業系統與BIOS不斷的溝通才有辦法達到各個狀態。但ACPI對目前全球正熱門的節能概念來說,非常的實用,尤其是一些長期使用NOTEBOOK的使用者來說,更可以讓電力更持久。但有些特殊情況並不適合使用類似的節能方式,會造成反效果(連電力都會更浪費),這在【Linux作業系統之奧義】一書中也已經解釋過,其原因是出在於處理節奏上的差異。適不適用於系統上,還是要等待使用者細心的評估過才能決定,不過,身為一個系統管理者,勢必多了一份為地球省一點電的責任。