星球

Blog:Rex's blah blah blah


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

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="" />

十本 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="" />

apt-cacher-ng

2014/2/11 20:00:05 | Rex's blah blah blah

養了很多 Debian/Ubuntu 機器時,時常得利用 apt 大量更新軟體。最常見的需求是 Security updates,所有伺服器都會抓取同一份軟體,機器量一大用掉的頻寬也很可觀。為了省下這些頻寬,得在伺服器區域網路設定一組快取伺服器,讓全區域網路下載一次。


有得人會自己建一份 archive mirror.



但是 Debian/Ubuntu 套件眾多,全部映射一份實在很費空間。我個人偏好只快取曾經抓過得檔案。


Debian/Ubuntu 中已經有幾個選項可用

approx – caching proxy server for Debian archive files

apt-cacher – Caching proxy for Debian package and source files

apt-cacher-ng – caching proxy server for software repositories

apt-p2p – apt helper for peer-to-peer downloads of Debian packages

debtorrent – bittorrent proxy for downloading Debian packages

apt-transport-debtorrent – an APT transport for communicating with DebTorrent

squid-deb-proxy – Squid proxy configuration to optimize package downloads

squid-deb-proxy-client – Automatic proxy discovery for apt based on avahi


其中 apt-p2p 與 debtorrent / apt-transport-debtorrent 是大約 2006-2008 年 p2p 技術熱門時的嘗試。而 debtorrent 直接利用 bittorrent 協定,而 apt-p2p 使用 kademlia DHT 協定來處理分散檔案,需要安裝 Twisted. 兩個概念都很有趣,但是我並不想在每台機器上架設 p2p server,純粹只是需要供應新的安裝檔案。


個人評估之後,選了 apt-cacher-ng. 設定簡便,apt-get 安裝完即可用,不相依於其他網站伺服軟體。還有簡易的管理界面可以看快取效率唷!


由於它基本上是個 http proxy,所以你可以用 transparent proxy 來導引所有的下載,或者在 /etc/apt/apt.conf.d/90aptcacher-ng 加入以下設定即可。

Acquire::http { Proxy "http://10.11.11.254:3142"; };


除了可以透過預設網頁來看快取狀態,也可以在 console 跑 /usr/lib/apt-cacher-ng/distkill.pl 來看硬碟上佔用了多少空間。


References


AptProxyCache – Ubuntu Wiki https://wiki.ubuntu.com/AptProxyCache


apt-cacher-ng



apt-cacher



approx



DebTorrent



apt-p2p



AptProxy


如何與開放原碼社群合作

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