星球

Blog:Rex's blah blah blah


最後更新: 2014/5/7 8:00:36
RSS | RDF | ATOM

十本 Linux 核心開發書籍介紹

2011/3/17 0:00:48 | Rex's blah blah blah

「利益揭露: 本文英文書籍連接使用 href="http://en.wikipedia.org/wiki/Amazon_Affiliates#Third-party_sellers">Amazon Associates Program.」

我相信絕大部分 Linux 開發者都會告訴你,Driver 的開發比 Linux Application 容易許多,即便寫驅動程式聽起來莫名偉大,其實也不過是一段 C/assembly 的組合程式碼。有別於桌面應用程式,Linux kernel API 較少因爲不同的新軟硬體規格,而進行大幅度 API 更動 (參數的簡化倒是十分常見),且由傑出的軟體開發者撰寫的核心架構,穩定性已經十分可靠。

相較與 userland 高度複雜的設定機制,Linux Kernel 暴露的界面十分簡單,style="text-decoration: underline;">在硬體穩定的前提之下,你也難得碰到 API 反應與預期不符合的處境。一般開發者對於核心驅動程式上手的時間,應該不會比開發桌面軟體來的更久。花費時間較多應該是研讀硬體手冊,以及不嚴謹的開發習慣造成臭蟲而所需的除錯時間。

對於深具經驗的開發者,在學習開發 Linux kernel driver 時,最快的方法莫過於直接解開 Kernel tarbar, 切進欲開發的 subsystem 目錄,拿出 href="http://www.gnu.org/software/global/">global, href="http://www.vim.org/">vim, href="http://lxr.linux.no/">LXR 直接把現成程式碼當作範例學習,很快就可以理解程式結構。不過,偶爾還是需要參考書來驗證對於架構得理解是否正確,另外接觸新的 subsystem 時先閱讀入門文章也可以減少無謂的撞牆期。

所幸,幾位 Linux kernel hacker 也是傑出的文件作者。在 Linux kernel sourc tree 中已有一些各子系統的架構、操作參考文件,涵蓋了基本的 coding style、設計哲學等。另外,像是 href="http://blog.rlove.org/">Robert Love, href="http://www.kroah.com/linux/">Greg Kroah-Hartman (PCI, USB maintainer) 等開發者也出版了完整的書籍,很值得參考。

不過市面上針對 Linux kernel 開發的書籍也不少,那一本是適合你的呢?這類的技術書籍,通常設定不同的讀者羣來設定內容,有的偏重知識,有的偏重操作實務。且出版版次也會影響所介紹的 API 差異,造成無法編譯其範例,但並非舊書,所談之理論就不正確。

以下分享不才對於市面上 2005 年之後出版的href="http://www.anobii.com/chihchun/books/?filterType=3&filterValue=7&tagPage=1&doScroll=true">核心開發書籍的評論,希望對於想擴充團隊圖書館的朋友提供些參考。

href="http://www.amazon.com/gp/product/0596100795?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0596100795">class="size-full wp-image-2387" title="9780596100797" src="http://people.debian.org.tw/~chihchun/wp-content/uploads/2011/03/9780596100797-.jpeg" alt="" width="107" height="160" />

href="http://www.amazon.com/gp/product/0596100795?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0596100795">Linux Kernel in a Nutshell 是 2006 年年底發行,作者是 GregKH,使用核心為 2.6.18,部分操作方式或指令已經略有更改。GregKH 基於讓更多新手參與開發行列,針對的讀者是從未編譯過 Linux kernel,想瞭解下載、設定、編譯需求等等細節,適合剛從其他平臺進入 Linux 核心開發的朋友,可以較快熟悉核心編譯的操作程序。書內主要介紹通用性知識,因此未提各 distro 間安裝 kernel 的細節 (如 initrd 建制方式)。

title="Linux kernel in a Nutshell">LKN 已採 href="http://creativecommons.org/licenses/by-sa/2.5/">CC BY-SA 2.5 授權。電子書可於 GregKH 的href="http://www.kroah.com/lkn/">網頁下載。

href="http://www.amazon.com/gp/product/0596005652?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0596005652">class="alignnone size-full wp-image-2390" title="0596005652" src="http://people.debian.org.tw/~chihchun/wp-content/uploads/2011/03/0596005652.jpg" alt="" width="122" height="160" />

href="http://www.amazon.com/gp/product/0596005652?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0596005652">Understanding the Linux Kernel, Third Editionsrc="http://www.assoc-amazon.com/e/ir?t=rexsblahblahb-20&l=as2&o=1&a=0596005652" border="0" alt="" width="1" height="1" /> 這本由兩位博士 Daniel P. Bovet 與 href="http://www.sprg.uniroma2.it/home/cesati/">Marco Cesati 所撰寫,從 2000 年底出版之後,到 2005 已經是第三版,介紹的核心是 2.6.24。有href="http://www.anobii.com/books/LINUX%E6%A0%B8%E5%BF%83%E8%A9%B3%E8%A7%A3%EF%BC%88%E4%B8%89%E7%89%88%EF%BC%89/9789867794833/01a1519d5282b63a4a/">中譯版。

此書結構以流水帳方式帶過各個子系統,但稍嫌膚淺的僅僅介紹表面的細節,未能給予概觀性的理論說明,也未能直指程式核心。篇幅常用於註記資料結構或函式用途,適合想尋著麵包屑理解 Linux kernel 運作的探險家使用。

href="http://www.amazon.com/gp/product/0470343435?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0470343435">title="0470343435" src="http://people.debian.org.tw/~chihchun/wp-content/uploads/2011/03/0470343435.jpg" alt="" width="128" height="160" />

href="http://www.amazon.com/gp/product/0470343435?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0470343435">Professional Linux Kernel Architecture 在2008 年出版,作者是 Wolfgang Mauerer,作者的背景是量子物理學家。在沒有社群內知名開發者的背書與協助下,他完成了一本巨大的書籍,篇幅高達 1368 頁。

有別於 title="Understanding the Linux Kernel">UTLK,也許是為了非科班出生的讀者,作者試著詳盡的敘述作業系統的基本概念,另外一方面也以程式碼告訴讀者 Linux 的運作模式。

如果你讀不下純粹理論導向的作業系統教科書,而想透過 Linux理解一個作業系統的設計原理,這是適合你的書。本書基於 Linux kernel 2.6.24.

href="http://www.amazon.com/gp/product/0672329468?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0672329468">class="alignnone size-full wp-image-2409" title="0672329468" src="http://people.debian.org.tw/~chihchun/wp-content/uploads/2011/03/0672329468.jpg" alt="" width="124" height="160" />

身為知名的 kernal hacker, href="http://rlove.org/">Robert Love 在 href="http://www.amazon.com/gp/product/0672329468?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0672329468">Linux Kernel Development (3rd Edition) 一書中為讀者拆解 Linux kernel source tree, 直接從設計理念切入,酌以程式碼輔助,讀者需要有作業系統理論素養以及 Linux 開發經驗,才能消化理解筆者的解剖。最新第三版發表於 2010 年初版,更新到 2.6.34.

簡體中譯版 href="http://www.books.com.tw/exep/prod/china/chinafile.php?item=CN10623111">Linux 内核设计与实现 翻譯自 Linux Kernel Development 第二版。正體中文版有維科圖書有限公司出版沈中庸, 沈彥男翻譯的 href="http://www.anobii.com/books/Linux_%E6%A0%B8%E5%BF%83%E9%96%8B%E7%99%BC%E6%8C%87%E5%8D%97,_2e/9789867503084/01f52037ae93f55382/">Linux 核心開發指南, 2/e。

href="http://www.amazon.com/gp/product/0596002556?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0596002556">class="alignnone size-full wp-image-2413" title="0596002556" src="http://people.debian.org.tw/~chihchun/wp-content/uploads/2011/03/0596002556.jpg" alt="" width="122" height="160" />

href="http://www.amazon.com/gp/product/0596002556?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0596002556">Linux Network Internals 的作者是 href="http://benve.info/">Christian Benvenuti,發表於 2005 年。少數專談 Linux Network stacks 的書籍,作者循序的從設定工具、核心啟動開始,逐一介紹 封包傳送接受、Bridging、IPv4、Neighboring Subsystem 與 Routing。

書中涵蓋了 Layer 2, Layer 3 等協定, 可惜遺漏了 IPv6, title="Internet Group Management Protocol">IGMP, title="Protocol Independent Multicast">PIM, Traffic Control, href="http://www.netfilter.org">Netfilter, Virtual devices (802.1Q, bonding, IPIP, GRE) 等等重要原件。讀者需要基本開發能力與網路協定常識。此書有href="http://www.oreilly.com.tw/product2_linux.php?id=a204">中譯版。

href="http://www.amazon.com/gp/product/1584504811?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=1584504811">class="alignnone size-full wp-image-2426" title="1584504811" src="http://people.debian.org.tw/~chihchun/wp-content/uploads/2011/03/1584504811.jpg" alt="" width="127" height="160" />

href="http://www.amazon.com/gp/product/1584504811?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=1584504811">The Linux TCP/IP Stack: Networking for Embedded Systems href="http://www.amazon.com/gp/product/1584502843?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=1584502843">第一版發表與 2004 年,最新href="http://www.amazon.com/gp/product/1584504811?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=1584504811">第二版 2006 年,針對的版本是 2.6.16,作者是 Thomas F. Herbert。此書對於讀者的定位不明。雖然意圖以一個章節討論嵌入式系統中的 TCP/IP Stack,但除了說明一般嵌入式系統需求外,缺乏實際有用資訊。

書籍想涵蓋各種 TCP/IP Stack 所涵蓋的項目,但章節設計雜亂,從基本的 Network Stack 開始介紹,對於 API 部分又缺乏系統性描述。既無法瞭解網路協定,或撰寫網路程式或作業系統核心架構。

書中時常夾雜敘述與程式碼,令讀者難以連貫消化,讀者需要開啟原始程式碼才能領會作者的。這是一本關於網路協定的原始碼註記,適合已具核心開發經驗的開發者參考使用,考量其版本日期,書籍的功能可能比自行追蹤程式碼的效用還差。另外,若你想瞭解嵌入式系統,這也不是你該買的書。

href="http://www.amazon.com/gp/product/0596005903?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0596005903">title="0596005903" src="http://people.debian.org.tw/~chihchun/wp-content/uploads/2011/03/0596005903.jpg" alt="" width="122" height="160" />

href="http://www.amazon.com/gp/product/0596005903?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0596005903">Linux Device Drivers, 3rd Editionsrc="http://www.assoc-amazon.com/e/ir?t=rexsblahblahb-20&l=as2&o=1&a=0596005903" border="0" alt="" width="1" height="1" /> 的作者是 href="http://www.oreillynet.com/pub/au/592">Jonathan Corbet (href="http://lwn.net/">LWN 的href="http://en.wikipedia.org/wiki/LWN.net">創辦人)、href="http://www.linux.it/~rubini/">Alessandro Rubini、href="http://www.kroah.com/linux/">Greg Kroah-Hartman。即便 LDD3 已經出版許久,還是所有想寫 Linux kernel driver 的第一優先入門參考書阿。此書有href="http://www.oreilly.com.tw/product_linux.php?id=a184_toc">中譯版。

LDD3 務實的從實做範例開始,帶領讀者理解各種 subsystem,含括了入門操作與基本觀念,對於初次開發 title="linux kernel module">lkm 的開發者提供了燈塔般的指引。

LDD3 授權採 href="http://creativecommons.org/licenses/by-sa/2.0/">CC BY-SA 2.0,線上版可於此下載 href="http://lwn.net/Kernel/LDD3/" target="new_win">http://lwn.net/Kernel/LDD3/。但由於書籍年代較久,針對的核心版本為 2.6.10,書中範例需要一點調整才能正常運作。已有同好改了幾份擺在  github (href="https://github.com/jesstess/ldd3-examples/">jesstess, href="https://github.com/martinezjavier/ldd3">martinezjavier).

href="http://www.amazon.com/gp/product/0132396556?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0132396556">class="alignnone size-full wp-image-2414" title="0132396556" src="http://people.debian.org.tw/~chihchun/wp-content/uploads/2011/03/0132396556.jpg" alt="" width="115" height="160" />

href="http://www.amazon.com/gp/product/0132396556?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0132396556">Essential Linux Device Drivers 的作者是長期在 IBM 工作的 href="http://elinuxdd.com/~elinuxdd/elinuxdd.docs/aboutme.html">Sreekrishnan Venkateswaran,參與 href="http://www.research.ibm.com/WearableComputing/linuxwatch/linuxwatch.html">Linux Watch, href="http://www.linuxfordevices.com/c/a/Linux-For-Devices-Articles/Device-Profile-CDL-Paron-secure-PDA/">PDA, href="http://www.hill-rom.com/usa/NaviCare_NurseCall.htm">Nurse Call Systems, href="http://www.linuxfordevices.com/c/a/Linux-For-Devices-Articles/Device-Profile-Merlin-Patient-Care-System/">Merlin Patient Care System 等等開發專案。有正體中譯版 href="http://www.anobii.com/books/Linux%E9%A9%85%E5%8B%95%E7%A8%8B%E5%BC%8F%E9%96%8B%E7%99%BC%E5%AF%A6%E6%88%B0/9789866348174/017600ce73d44ab65e/">Linux驅動程式開發實戰 以及簡體中譯版 href="http://www.anobii.com/books/Essential_Linux_device_drivers/9787115206473/019c9e0bf8b5932e5f/">精通Linux驅動程序開發。

這本書是作者的實務工程筆記,出版於 2008 年,針對核心為 2.6.23/2.6.24,透過此書新手可以從中漫遊一個深具經驗的開發者,如何從原始碼迷霧之中理解 Linux device  driver,老手或可從雜亂的描述中再次驗證自己的理解。

雖然篇幅高達 744 頁,卻被引用程式碼佔了許多頁面。這本書不足以提供開發者撰寫驅動程式的基本觀念,也無法協助理解作業系統概觀。

作者另有一小冊 href="http://www.anobii.com/books/Debugging_Linux_Systems/9780136123545/01c4d74310f48c2430/">Debugging Linux Systems 電子書短短九十頁,帶過幾個常見的核心除錯工具與技巧,很有實務參考價值。

href="http://people.debian.org.tw/~chihchun/wp-content/uploads/2011/03/0131181637.jpg" rel="lightbox[2380]">class="alignnone size-full wp-image-2479" title="0131181637" src="http://people.debian.org.tw/~chihchun/wp-content/uploads/2011/03/0131181637.jpg" alt="" width="82" height="110" />

id="static_txt_preview" href="http://www.amazon.com/gp/product/0131181637/ref=as_li_ss_tl?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0131181637">《The Linux(R) Kernel Primer: A Top-Down Approach for x86 and PowerPC Architectures》 出版於 2005 年,作者是 Claudia Salzberg Rodriguez, Gordon Fischer, Steven Smolski。有href="http://www.anobii.com/books/The_Linux_Kernel_Primer_%E4%B8%AD%E6%96%87%E7%89%88/9789867199614/013342e1203c95f23a/">中文版,但href="http://joyueng.twbbs.org/2006/12/31/the-linux-kernel-primer-chinese-edition/">評價頗差。

書名讓人非常期待總算有一本核心介紹書籍 x86 外的硬體平臺,畢竟 href="http://en.wikipedia.org/wiki/Reduced_instruction_set_computing">RISC vs href="http://en.wikipedia.org/wiki/Complex_instruction_set_computing">CISC 架構的不同, href="http://en.wikipedia.org/wiki/Endianness">endianness, href="http://en.wikipedia.org/wiki/Data_structure_alignment">alignment, href="http://en.wikipedia.org/wiki/Calling_convention">calling convention 等,應當有許多寫核心驅動程式應該注意得事項。但是整本書只在 2.2 節稍微說一下寫 Assembly 時,PowerPC, x86 的指令差異,剩下的細節根本沒提!

整本書還是著重在一般核心的結構介紹。

而書中除了少量的插圖之外,根本沒有沒有多少邏輯上的說明跟描述。通篇拆解程式碼,對資料結構作註解。這些資訊任何有點基礎的工程師都可自行閱讀程式碼及程式碼註解。新入門工程師還可能因爲書中解釋而疑惑。

除非你想寫沒有價值的書評,否則不建議購買。

href="http://www.amazon.com/gp/product/0131492470/ref=as_li_ss_tl?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0131492470">class="alignnone size-full wp-image-2480" title="0131492470" src="http://people.debian.org.tw/~chihchun/wp-content/uploads/2011/03/0131492470.jpg" alt="" width="83" height="110" />

id="static_txt_preview" href="http://www.amazon.com/gp/product/0131492470/ref=as_li_ss_tl?ie=UTF8&tag=rexsblahblahb-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0131492470">Linux(R) Debugging and Performance Tuning: Tips and Techniques 出版於 2005, 作者是 Steve Best。此書少見的從除了應用程式之外,還從核心切入的除錯、效能測試書籍,因爲這方面的技術資訊總是一下就超過保鮮期。

作者試著含括基本的 Profiling 實務開始,介紹 gdb, 應用程式記憶體管理,再講核心的各種資訊界面。很可惜,以一本專講除錯與效能測試的書來說,範例與介紹過於粗淺,以第十二章 Dynamic Probes 為例,其介紹深度可能還比不上 href="http://www.kernel.org/doc/Documentation/kprobes.txt">Documents/kprobes.txt 中的概念介紹與 IBM developerWorks 的href="http://www.ibm.com/developerworks/library/l-kprobes.html">範例介紹。

適合剛切換到 Linux 的開發者,可概略學得各種基本開發工具者的入門資訊。

2011-03-17 18:00 更新/>

增列相關中譯版本連接,感謝 href="http://blog.ansoncat.com/">ansoncat 告知資訊。

src="http://people.debian.org.tw/~chihchun/?ak_action=api_record_view&id=2380&type=feed" alt="" />

PGP Key transition (DC76FEB9 -> 3860D2A5)

2011/5/21 0:50:18 | Rex's blah blah blah

I should replace my key long time ago, after there are security flaws has been identified in href="http://en.wikipedia.org/wiki/SHA-1">SHA-1. The US NIST also suggested to transit to stronger href="http://en.wikipedia.org/wiki/SHA-2">SHA-2 hash functions.

I followed the key replacement rules of href="http://keyring.debian.org/replacing_keys.html">Debian and href="http://www.apache.org/dev/key-transition.html">Apache and created the href="http://keyring.debian.org/creating-key.html">new key. If you have validated my old key, Here is my href="http://people.debian.org.tw/~chihchun/wp-content/uploads/2011/05/key-transition-2011.txt.asc">transition statement for the new new 4096 bit RSA key -


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1,SHA512
I am transitioning GPG keys from an old 1024-bit DSA key to a new
4096-bit RSA key. The old key will continue to be valid for some
time, but I prefer all new correspondence to be encrypted in the
new key, and will be making all signatures going forward with the
new key.
This transition document is signed with both keys to validate the
transition.
If you have signed my old key, I would appreciate signatures on my new
key as well, provided that your signing policy permits that without
reauthenticating me.
The old key, which I am transitional away from, is:
pub 1024D/DC76FEB9 2004-09-18 Rex Tsai
Primary key fingerprint: 1700 7040 CBD7 5DB4 4956 959B 3A5E 166D DC76 FEB9
The new key, to which I am transitioning, is:
pub 4096R/3860D2A5 2011-05-20 Rex Tsai (蔡志展)
Primary key fingerprint: CDC8 966D A547 6B1F CEB8 6D49 86A6 03D4 3860 D2A5
To fetch the full new key from a public key server using GnuPG, run:
gpg --keyserver keys.gnupg.net --recv-key 3860D2A5
If you have already validated my old key, you can then validate that the
new key is signed by my old key:
gpg --check-sigs 3860D2A5
If you are satisfied that you've got the right key, and the UIDs match
what you expect, I'd appreciate it if you would sign my new key.
If you then want to sign my new key, a simple and safe way to do that is
by using caff (shipped in Debian as part of the "signing-party" package)
as follows:
caff 3860D2A5
In the other way, you can sign the key and send it to me as following
commands:
gpg --sign-key 3860D2A5
gpg --armor --export 3860D2A5 | mail -s 'OpenPGP Signatures' \
chihchun@kalug.linux.org.tw
gpg --keyserver pgp.mit.edu --send-key 3860D2A5
Please contact me via e-mail at if you have
any questions about this document or this transition.
Thanks.
Regards
Rex Tsai, 2011-05-21
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iEYEARECAAYFAk3WnNEACgkQOl4Wbdx2/rnujQCbBV+TSHWapsMrd5d06RKxkgT3
csUAnRpDr6obff4Fuj/P530f6pVT5WTXiQIcBAEBCgAGBQJN1pzRAAoJEIamA9Q4
YNKldvgP/2ej6EDhrGj/1dNkIdkWmKNXsj4OMWKcvDP6M+VnlkWtFaDQxYBb73Ea
vBhAgDZL7MhUwVbn9zydVInFpA9vtdsBwd6Hr3+rp+iv076TennKYP+qo7YDX5Ga
7s73Tim8Tn6AwYdBhyhFPJPZ/fEUknKNOWILu7eUjeQ+C7ndPNEe6VRvCJvJaHwa
aJ6b8kpeRG6UYQFGw/o2e0XGtEpek8dRiqk2sVnOVR/d0C6/u+2oQuGRVtX/uKd1
2E3HYPh/Y1RTqENYrCd39v8nA6NUzuw8kOpIx8MZ51iN4DB+YfusV8mtzhZIkVQP
y2BZ0jL2C2xFlCER7Cxlp8VpsKcz/tEixytciC0aOuoUoER7LQvfkQGs+pcTj8Fl
PQLmwgnqIM4PPQ4cSyhsFgmSkbFcDyxtStVLMEtJKKAJ0dOuqa13R0MKuRkg5WMP
u07EKBITk50QlqzXrJwM7I8FszIigbdWWQD2qNbXLpHcZNo5m5CshOVgTCy+t7E4
Z0gQ3DnZAsy+tclCjCeb6MdjRqF27C9LdWjNwHHcw71X2yqRXqEN8fb1JcXBSU5a
7AgiIMnDgw3BAm1QLQ/eEk8J7KuKvsFFK+hFpSs4mahYLUtExzSsEN7RbCQptSIc
4FfZUXS3bg+by4zF/2eSGI+FeMq7CIz4aX1JdfucBiFCNUCRhFPT
=kr5F
-----END PGP SIGNATURE-----
src="http://people.debian.org.tw/~chihchun/?ak_action=api_record_view&id=2946&type=feed" alt="" />

Linux 上處理壞軌硬碟的兩三事

2011/5/30 8:00:22 | Rex's blah blah blah

養動物園或是管理伺服器的人,難免都會碰到一些硬碟故障的問題。這篇文章略為整理一些在 Linux 上處理壞軌硬體的一些軟體知識與技巧。針對讀者為中等程度以上的使用者,文中僅僅提供參考資料,不說明實際操作或指令明細,請自行參考相關文件。作者以最大善意盡力提供參考資訊,但文中如有疏漏或錯誤造成資料遺失,作者不負任何責任。

文中說明均以 Linux href="http://en.wikipedia.org/wiki/Extended_file_system">Extended file system 為主,操作平臺是 href="http://www.debian.org/">Debian GNU/Linux. 所提及工具授權均為 href="http://en.wikipedia.org/wiki/Free_and_open_source_software">FLOSS 。假設錯誤硬碟為 /dev/sdb,所有指令需要以 root 執行。

章節結構

  • 錯誤類型。
  • 壞軌測試。
  • 預先偵測。
  • 備份與資料回復。
  • 排除壞軌磁區。
  • 送修與資料清除。

錯誤類型

這裡討論的硬碟資料損毀,不外乎物理性傷害,摔落、靜電、停電、過熱、原件老化等等。這些傷害會造成邏輯性 (logical error) 上或物理 (physical error) 性的錯誤。

所謂的邏輯性錯誤,就是硬碟離線時,暫存資料來不及寫入,導致資料錯誤異常。所幸大部分的檔案系統都會有一個檔案系統狀態 (Filesystem state) 的值,若是最後使用未順利完成卸載 (umount),下次掛載時就會提示要求作 href="http://wiki.debian.org.hk/w/Configure_regular_filesystem_check#.E6.AA.94.E6.A1.88.E7.B3.BB.E7.B5.B1.E7.8B.80.E6.85.8B_.28Filesystem_state.29">fsck 檢查。如果是href="http://en.wikipedia.org/wiki/Journaling_file_system">日誌式檔案系統如 href="http://en.wikipedia.org/wiki/Ext3">ext3/href="http://en.wikipedia.org/wiki/Ext4">ext4,則會試著回復未完成的操作。這種錯誤偶爾會破壞檔案,fsck/e2fsck 可能會將錯誤檔案移到 lost+found 目錄下,造成困擾,但問題不大。

物理性錯誤指的是硬體磁盤受到損壞,該段href="http://en.wikipedia.org/wiki/Disk_sector">磁區無法讀取,也就是href="http://en.wikipedia.org/wiki/Bad_sector">壞軌。肯定導致資料遺失,最常見的是系統吐出 I/O Error,無法讀取該檔案。實際的症狀是href="http://en.wikipedia.org/wiki/Access_time">讀取變慢、聽到 href="http://en.wikipedia.org/wiki/Spin-up">Spin-up 時的卡卡聲(href="http://en.wikipedia.org/wiki/Click_of_death#Hard_disk">Clicking sound),甚至是系統當機等問題。

當壞軌開始產生時,通常代表硬碟壽命將至,得趕快開始更換健康新硬碟。這篇文章主要討論的是壞軌這種物理性錯誤的處理辦法。

壞軌測試

最基本的測試方法是利用 href="http://en.wikipedia.org/wiki/Badblocks">badblocks (8) 來檢測硬碟是否存在壞軌,這個指令不分檔案系統。若是含有重要資料的硬碟,應該先作預設的非破壞性唯讀測試 (non-destructive read-only test),以避免寫入測試時異常,造成磁碟重置離線。

badblocks -vs /dev/sdb

上述只要一發現壞軌,請第一時間拔下備份吧。若是可承受資料損失,可以使用 “-n” 的非破壞性寫入式測試。這基本上會嘗試寫入資料,再三確認硬碟運作正常。

badblocks -nvs /dev/sdb

預先偵測

不過 badblocks 需要在離線時才能執行。很多時候,伺服器是無法忍受長時間的離線檢查的,必須要能夠線上檢測硬碟健康狀況才行。目前市面所有 href="http://en.wikipedia.org/wiki/Advanced_Technology_Attachment">ATA 硬碟都已經支援 href="http://en.wikipedia.org/wiki/Self-Monitoring,_Analysis,_and_Reporting_Technology">S.M.A.R.T. (Self-Monitoring, Analysis, and Reporting Technology),S.M.A.R.T.  基本上提供一個界面讓管理者可以查詢幾個重要的href="http://en.wikipedia.org/wiki/Self-Monitoring,_Analysis,_and_Reporting_Technology#Known_ATA_S.M.A.R.T._attributes">參數。

透過讀取這些參數,管理者能夠預先警覺href="http://en.wikipedia.org/wiki/Hard_disk_failure">硬碟錯誤。根據 Google 的調查十萬顆硬碟後的href="http://antbsd.twbbs.org/~ant/wordpress/?p=592">研究報告 (href="http://research.google.com/pubs/pub32774.html">Failure Trends in a Large Disk Drive Population),S.M.A.R.T. 的數值的確反應硬碟錯誤率 – 六十天內,出現 S.M.A.R.T. 掃描錯誤的硬碟是其他硬碟的 39 倍高。

在 Linux 上,可以使用 href="http://sourceforge.net/apps/trac/smartmontools/wiki">smartmontools 中的 smartctl (8) 來查詢硬碟的 S.M.A.R.T. 狀態。指令如下

smartctl --attributes /dev/sdb

根據 Google 的研究以及 href="http://smartmontools.sourceforge.net/badblockhowto.html">Bad block HOWTO for smartmontools 指出,與硬碟失效關係最高的數值是 Reallocated Sectors Count/Reallocations event count,/Current Pending Sector Count/Uncorrectable Sector Count。這幾組數據代表硬碟發現該磁區已經損毀,它會重新從備用磁區分配一位置取代該損壞磁區,或磁區已發現問題尚未替換或無法替換。這通常可以視為磁區損耗 (surface wear) 的狀況。當你發現這些值不為 0 時,就該開始準備備份資料並作壞軌檢查了。

除了使用 smartctl 手動檢測外,也可以設定 smarted,讓系統自動觀測 S.M.A.R.T. 狀態,有錯誤會顯示於桌面訊息或發送郵件。smartd 的設定可以參考 title="Permanent Link to 檢測硬碟狀態 – smartmontools" rel="bookmark" href="http://blog.ssh.tw/?p=778">檢測硬碟狀態 – smartmontools 一文。S.M.A.R.T. 也支援 Self-Test,可以讓硬碟作效能與功能檢查,詳情請見 smartctl (8)./>

備份與資料回復

在發現壞軌之際,應該第一優先備份資料。如果還能夠掛起檔案系統,則趕緊利用 href="http://en.wikipedia.org/wiki/Rsync">rsync, href="http://www.gnu.org/software/tar/">tar 等工具備份檔案。或者利用 href="http://en.wikipedia.org/wiki/Dd_%28Unix%29">dd 將整顆硬碟資料或分割區存檔,未來置換到新硬碟上

dd if=/dev/sdb of=sdb.img

若要確保資料正確複製,可使用 href="http://dcfldd.sourceforge.net/">dcfldd 來複製,它會邊複製邊作 href="http://en.wikipedia.org/wiki/Hash_function">hash 確保資料複製正確。不過由於壞軌處常常無法讀取,這會造成 dd 執行失敗。此時可以改用 href="http://www.gnu.org/software/ddrescue/ddrescue.html">dd_rescue, 它可以略過無法讀取的部分,儘可能複製其他健康的資料。

不過天有不測風雲,人有旦夕禍福。萬一資料損壞的區域不是資料區域,而是存放重要的系統資訊,那就需要額外的處置。建議無論任何時候,都不要在壞硬碟上直接操作,永遠先備份,再於備份碟上進行處理。以下略談三種情境的可用工具

  • 若不幸你的 href="http://en.wikipedia.org/wiki/Partition_table_%28master_boot_record%29">MBR 爛掉以至於 partition table 消失,可以嘗試使用href="http://en.wikipedia.org/wiki/Partition_table_%28master_boot_record%29"> href="http://www.cgsecurity.org/wiki/TestDisk">testdisk 來猜測各 partition table 的位址,或許可以救回 partition table 資料。
  • 若是檔案系統的 superblock 損壞,會看到 “can’t read superblock” 訊息,ext? 系列檔案系統通常有多個 superblock 備份,你可以從備份的 superblock 進行復原工作 (href="http://www.cyberciti.biz/faq/recover-bad-superblock-from-corrupted-partition/">Recover Corrupted Partition From A Bad Superblock,style="font-family: 宋体;"> href="http://blogold.chinaunix.net/u1/48373/showart_1331657.html">硬盘href="http://blogold.chinaunix.net/u1/48373/showart_1331657.html">ext2/3style="font-family: 宋体;">文件系统superblockstyle="font-family: 宋体;">损坏修复试验)。
  • 若你手忙腳亂已經把硬碟重新格式化,那麼只能透過 href="http://foremost.sourceforge.net/">foremost 或 href="http://www.sleuthkit.org/sleuthkit/">Sleuth Kit 慢慢的揀出硬碟中仍可辨識的檔案。祝你幸運。

排除壞軌區域

通常如果你的硬碟還在保固範圍,一般原廠均會更換健康的硬碟給你。但如果硬碟已經超過保固,壞軌硬碟仍堪用,可以用來存一些低度重要的資料。

對於這些壞軌,可以用 href="http://en.wikipedia.org/wiki/Sector_slipping">sector slipping 或叫做 href="http://www.pcguide.com/ref/hdd/geom/errorMapping-c.html">defect mapping 的機制來跳過不用。基本上分成兩種形式,一是透過href="http://en.wikipedia.org/wiki/Disk_controller">硬碟控制器或是透過檔案系統的 bad block table 來記錄。

傳統的 (1990 年代中期以前的硬碟)是可以進行href="http://en.wikipedia.org/wiki/Disk_formatting#Low-level_formatting_.28LLF.29_of_hard_disks">低階格式化 (href="http://www.pcguide.com/ref/hdd/geom/formatLow-c.html">Low-Level Formatting) 的,透過原廠的指令來重新定義物理儲存格式、重新定義 href="http://en.wikipedia.org/wiki/Cylinder-head-sector">CHS、若是硬碟中有壞軌,可以在低階格式化時避開不用。

由於低階格式化常因為操作錯誤而href="http://en.wikipedia.org/wiki/Brick_%28electronics%29">損壞 (bricked) 硬碟,新款硬碟已經不提供使用者透過href="http://en.wikipedia.org/wiki/SCSI_Format_Unit_Command">指令作低階格式化的工具。取而代之的是透過 href="http://www.dataclinic.co.uk/hard-drive-defects-table.htm">hard-drive defect management 功能,以 href="http://www.dataclinic.co.uk/hard-drive-defects-table.htm">Hard drive defects table – P & G Lists 來記錄 href="http://www.mjm.co.uk/sectorremapping.html">Bad Sector Mapping。所謂 Primary defect list 是代表出廠時已經產生缺陷的磁區列表,而 Grown defect list 則是使用中產生缺陷的磁區列表。

當硬碟發現壞軌時,便會自動將該磁區列入 G-List 中,並從備用的磁區中替換。因此現在已經沒有所謂低階格式化,目前所謂低階格式化大多指的是 Zero-filled,對磁區填入空值,強迫硬碟重新分配損壞磁區,這也是前述 S.M.A.R.T. 所謂 Reallocated Sectors。

所以你可以做的事情是對壞軌區域寫入空值,迫使它重置。你可以直接透過一開始的 badblocks 所產生之數值直接覆寫錯誤區塊,範例請見 href="http://smartmontools.sourceforge.net/badblockhowto.html">Bad block HOWTO for smartmontools。

上述 HOWTO 中詳述了,怎麼計算 e2fsck 吐出來數值,人工計算有點麻煩。以下介紹如何處理利用工具自動處理。

不保留資料

如果確認整顆硬碟資料都不需要保留,可以直接下達一下 dd 指令,重寫整顆硬碟。

dd if=/dev/zero of=/dev/sdb

或者在格式化時下達 -c -c 參數,讓 mkfs.ext3 順便檢查壞軌。

mkfs.ext3 -c -c /dev/sdb1

保留資料

如果硬碟已有資料,並想保留此資料,可以用 badblocks 檢查,並生成 badblocks list,再將 badblocks 吐出的列表,餵給 e2fsck -l.。但是必須確認執行 badblocks 時,指派了正確的 block size,可用 dumpe2fs -h 確認 block size.然後指示給 badblocks。

上述操作有點複雜,比較保險的做法是直接讓 e2fsck 用 badblocks 去作壞軌檢查,指令如下

e2fsck -k -c  -c /dev/sdb1

如此 e2fsck 會將壞軌寫入檔案系統列表中,可以用下述指令查詢目前壞軌列表

dumpe2fs -b /dev/sdb1

其他做法

本節前述可用低階格式化重置硬碟磁區分配,但是新款硬碟已少提供工具程式給終端使用者。有些工具透過反組譯硬碟韌體的方式取得 vendor specific ATA commands。另外,像是 Seagate 等品牌,則在硬碟上留有 href="http://en.wikipedia.org/wiki/Differential_TTL">TTLhref="http://en.wikipedia.org/wiki/Serial_communication">serial communication 的href="http://sites.google.com/site/seagatefix/">界面,於是你可以透過終端機連上硬碟韌體,以 href="http://www.scribd.com/doc/39042992/Seagate-Diagnostic-Command">Diagnostic Commands 進行一些偵錯以及重新格式化的動作。

送修與資料清除

爲了避免href="http://zh.wikipedia.org/wiki/%E9%99%B3%E5%86%A0%E5%B8%8C%E8%A3%B8%E7%85%A7%E4%BA%8B%E4%BB%B6">陳冠希裸照事件發生,送修前最好確保資料已經完全刪除。

就如前述所說,若只是進行快速格式化,硬碟資料也可能被href="http://en.wikipedia.org/wiki/Data_remanence">回復。事實上,根據 href="http://en.wikipedia.org/wiki/Peter_Gutmann_%28computer_scientist%29">Peter Gutmann 的在 90 年代的href="http://en.wikipedia.org/wiki/Data_remanence#Feasibility_of_recovering_overwritten_data">研究,他可以用href="http://en.wikipedia.org/wiki/Magnetic_force_microscopy">磁力顯微鏡取得複寫過三十五次以上的磁區資料。而美國 href="http://en.wikipedia.org/wiki/National_Institute_of_Standards_and_Technology">National Institute of Standards and Technology 的研究 rel="nofollow" href="http://csrc.nist.gov/publications/nistpubs/800-88/NISTSP800-88_rev1.pdf">“Guidelines for Media Sanitization” 或title="View content where Author is Craig Wright" href="http://www.springerlink.com/content/?Author=Craig+Wright"> Craig Wright, Dave Kleiman, Shyaam Sundhar R.S. 的論文 href="http://www.springerlink.com/content/408263ql11460147/">Overwriting Hard Drive Data: The Great Wiping Controversy 指出,新型硬碟只需要複寫一次即可。

爲了達到資料保密措施,各國軍方也因此設定有不同的資料清除href="http://en.wikipedia.org/wiki/Data_remanence#Standards">標 href="http://en.wikipedia.org/wiki/Data_erasure#Standards">準。總之,無論你的資料是否重要,在 Linux 上,建議使用這兩種 href="http://lambda-diode.com/software/wipe/">wipe, href="http://code.google.com/p/diskscrub/">scrub 指令之一來抹除資料,這兩種工具支援上述的各國標準。你也可下載使用 href="http://en.wikipedia.org/wiki/Darik%27s_Boot_and_Nuke">DBAN 製作開機片來清除硬碟資料。

References

  • href="http://smartmontools.sourceforge.net/badblockhowto.html">Bad block HOWTO for smartmontools
  • href="http://www.pcguide.com/ref/hdd/geom/format.htm">The PC Guide: Hard Disk Formatting and Capacity
src="http://people.debian.org.tw/~chihchun/?ak_action=api_record_view&id=2957&type=feed" alt="" />

如何與開放原碼社群合作

2011/7/18 15:00:16 | Rex's blah blah blah
class="addthis_toolbox addthis_default_style " addthis:url='http://people.debian.org.tw/~chihchun/2011/07/18/work-with-open-source-project/' addthis:title='如何與開放原碼社群合作 ' >class="addthis_button_facebook_like" fb:like:layout="button_count">class="addthis_button_tweet">class="addthis_counter addthis_pill_style">

參與開源社群活動時,常常在不同的場合聽到有人鼓吹,應當要回饋自己的時間與精力給軟體計畫,講者要求大家去參與翻譯、籌辦活動、或參與開發。每每聽到這種要求,總是感到納悶,常常他們似乎都未能夠分享實際參與社群的動機,二來總是有種道德勒索的錯覺。他們暗示你,這麼好用的軟體不收你錢,你該回饋些什麼吧?

雖然我相當崇尚自由軟體精神,但是實質上,無法接受不談動機,反以道德訴求要求使用者社群貢獻來回饋免費軟體。人們參加開放原碼社群的動機很多樣,無論是功利主義還是榮譽制度,負面的道德勒索往往不該是其中的一項。對我而言,這個動機實際一點就是讓自由軟體更便利好用,足以完成手上的工作項目。長遠一點的期望則是鼓吹開放精神,避免電腦軟體受到少數企業集團、政治組織的宰制,讓社會更自由且多元化。

週末 (7/15-7/18) 時,href="http://www.hackingthursday.org/">h4 的朋友參加 href="http://ossacc.moe.edu.tw/">OSSACC 與 href="http://www.openfoundry.org/">OSSF 籌備的 href="http://groups.google.com/group/hacking_camp">Hacking Camp,講者href="http://zh.wikipedia.org/wiki/%E9%84%AD%E5%8E%9F%E5%BF%A0">小蟲在他的演講中分享了幾個基本概念

  • Hacking for yourself
  • Hacking without boundary
  • Hacking with community
  • Hacking with for fun

我個人十分認同,href="http://www.hackingthursday.org/">h4 日常的聚會討論,時常是針對每日所使用的軟體改進、臭蟲回報修正,進而整合或重新設計新的軟體。Hacking 首重解決自身需求以及享受其中的樂趣。

我在 href="http://groups.google.com/group/hacking_camp">Hacking Camp 也分享了一場小演講,想要探討的是,如何考慮自身軟體需求的前提下,參與自由軟體計畫的方法。雖然目前自由軟體的成熟度與日俱增,但仍有許多時候會碰到使用上的問題,這份演講簡報,試圖說明該如何詢問問題,該如何回報臭蟲,以及如何與上游開放原始計畫互動,以便解決個人的使用障礙或達成開發目標,針對對象是大學資工系一、二年級的朋友。

style="width:425px" id="__ss_8621787"> style="display:block;margin:12px 0 4px">href="http://www.slideshare.net/chihchun/get-your-floss-problems-solved" title="Get your FLOSS problems solved" target="_blank">Get your FLOSS problems solved [!IFRAME FILTERED!] style="padding:5px 0 12px"> View more href="http://www.slideshare.net/" target="_blank">presentations from href="http://www.slideshare.net/chihchun" target="_blank">Rex Tsai