在一兩年前,Linux 核心尚缺乏一個好的的硬碟預讀機制時,桌面系統的使用者若要加速開機的速度,通常得先解決磁碟存取速度的瓶頸問題。於是得依賴如 readahead 這樣的工具來預先載入想讀入的檔案,以便提高系統載入的速度。

readahead 的基本原理是先預先載入開機過程可能使用的檔案到記憶體中 (page cache)。如此開機程式執行時,便可節省讀入檔案的時間,進而加快開機速度。

當然,前提是你要有足夠的記憶體作快取。若你的系統只有小記憶體,不建議使用 readahead. 目前在 Ubuntu, Debian GNU/Linux 下使用的版本基於 Erich SchubertRobin H. JohnsonScott James Remnant,改自於 Gentoo 的版本。Fedora Project 則有另外一個概念相同,但由 RedHat 所開發的的不同實做

以下所說明的是 Ubuntu, Debian GNU/Linux 版本。

為了使 readahead 可以正確的對開機所需的檔案快取,你必須教會 readahead 目前有多少檔案需要被預先載入,原則上只需要作一次。Ubuntu 在釋出官方版本時,便會內建一組預先較調的檔案列表。但若每次更新核心或套件系統,特別是開機所需的程式,其實都應該做過一次 “profile” 的動作,以便 readahead 保持正確的載入檔案列表。

相較於 Debian 說明 readahead 的說明文件,在 Ubuntu 由於仍使用舊版,使用上則頗為謎樣,Ubuntu 的README.Debian 只提醒你 readahead 不能用在 NFS 上,忘了說明使用方法。在 Ubuntu 上,readahead 會檢查 /proc/cmdline 中是否有 profile 參數,若有則進行 profiling 的程序。若使用 Grub,則操作方式如下

  1. 開機見到 “GRUB loading” 提示時,按下 “Esc” 鍵
  2. 按下 “e” 鍵進行編輯 (若有多核心,先選擇預設開機之核心行)
  3. 按下 “向下” (↓) 鍵到 “kernel” 行
  4. 再選 “e” 鍵進行編輯
  5. 你會進入參數編輯模式,移動到參數最後加入 “profile”,”profile” 字樣前記得填入空白。
  6. 按下 “Enter” 完成編輯
  7. 按下 “b” 鍵開機

第一次開機稍慢,但作過一次 profile 後,之後的開機速度應該會提高些。

在 Debian 下,只需用 root 下達以下指令後,重新開機即可

# touch /etc/readahead/profile-once

但在新版的 Linux 核心,有 On-demand read-ahead 等技術的加持,當下已經不特別需要這樣的工具,有時甚至反而會拖慢開機的時間。

試著在安裝了 Ubuntu EeeASUS EEEPC 701 上測試 (核心為 2.6.24-16-generic),以預設安裝軟體測試開機到桌面環境出現的 uptime,每次都大約 60s。進行 profile 則約使用 80 秒,profiled 過 readahead 開機速度相同。

另外也在我的 Thinkpad X60 1706-B69 上測試,軟體是 Debian sid, 核心為 2.6.26-1-686。系統裝了相當多雜七雜八的軟體,硬體裝了 2G 記憶體,硬碟則是 8M Buffer, 5400RPM 的 FUJITSU MHV2100B。profile 大約使用 152s,profiled readahead 開機則約 55s,關掉 readahead 則約 53s。

其實在 Linux 上做檔案快取 (readahead/prefetch) 的技術頗多,除了稍早講的 readahead, 還有 preload, bootcache/filecacheprefetch. (prelink 是加快 ELF shared libraries/executables 的載入速度,不算是檔案快取)

不過 readahead 只在開機的產生效用,若開機後得依賴 preload 等工具來做檔案快取。但以 user space 的 daemon 每幾秒掃一次系統的效果實在不怎麼好。

比較吸引我注意的是 SoC 2007 中的一個計畫 prefetch

prefetch 算是融合了前幾個計畫的優點與特色的專案,計畫整合了 kernel patch 與 userspace 工具,主要特色是透過核心作監視各軟體啟動所需要取用的檔案,配合 userspace 工具做到自動更新(dynamic profiling)。

對使用者而言,操作起來容易許多,不需要像 readahead 或 bootcache/filecache 作手動「教育」,且使用效率上也會比 preload 來的好。當然,與 readahead 相較起來,實做方式也比較輕盈、聰明。

技術細節可以參考 Krzysztof Lichota 的提案 (Ubuntu Wiki) 與簡報。Prefetch 原始碼可於 Launchpad 下載,相關文件與文獻位於 Google Code. 另外,Behdad Esfahbod 的論文 “Preload — An Adaptive Prefetching Daemon” 也很值得參考。

BTW, Krzysztof Lichota 也是 one-click installer 的開發者。

回答讀者詢問,「可否拿 Debian GNU/kFreeBSD 桌面系統?」

答案是可以的,雖然目前只有約 80% 的套件被移植到 Debian GNU/kFreeBSD 上,但是該有的桌面系統工具應該都可以使用。以下是我執行 ging 跑 KDE 3.4.2 的桌面截圖

GingDebian GNU/kFreeBSDLive CD, 可以讓感興趣的人先行試用系統。光碟可於此網址下載,光碟中使用的軟體都符合 DFSG,由於最近沒有更新,因此核心尚為 Freebsd 5.4, KDE 也是舊版。

若想安裝新版 Debian GNU/kFreeBSD,根據 Aurelien Jarno公告,新版使用 Freebsd 6.3 的安裝光碟,可於 debian-ports.org 下載。

Wouter VerhelstDebconf8 發表的 Debian Secrets 中,分享了許多關於 Debian 套件維護、管理、使用的有趣小程式與技巧。

像是 Miriam Ruiz 利用 debtags 為資料庫基礎的 goplay,讓你輕易的選擇安裝各種不同類型的遊戲。

goplay 中除了提供遊戲相關的查詢介面,其實還有 goweb, gosafe, gooffice, gonet, goadmin 與 golearn。可都執行一番,或許總會找到有趣的軟體喔。

若你曾維護套件,或想開發一些套件安裝相關的軟體、或純粹只想更深入了解 Debian 的相關指令細節,不妨參考一下 Wouter 的簡報吧,或可挖到一些還不知道的技巧。簡報可於 Wouter 的網站下載

今年度也就是上個月的 Debconf8 的影片已經上線了,可於下載。若你裝了 Miro,也可以訂閱此 RSS Feed 方便下載。(不過 Feed 中的節目有點短缺,可逕行進入目錄中翻索)

個人感興趣的題目有

  • Debian Secrets
  • Debian Webservices Development
  • Debian and Ubuntu
  • Debian & LiMux
  • Debian on the Neo1973/Freerunner
  • Emdebian update, Debian on embedded devices
  • Free Software in Health Care
  • Linux Kernel Hacking inside Debian
  • Introducing PET, a tool to track packages’ health
  • OpenSSL/Debian debacle
  • POSIX shell scripting 101
  • Packaging with version control systems
  • Virtualisation in Debian – Present and future
  • Wubi – Windows Ubuntu Installer
  • bits from NMs and users
  • hp.com/go/debian
  • netconf, modern, bottom-up, stateless network interface configuration

雖說 Debian GNU/Linux 對於多國語系的支援已經相當好,但是還是有些軟體尚未能自動處理不同編碼的轉換,像是某些檔案分享工具、壓縮工具。

這些下載工具或壓縮工具,會照實的依照當初所使用的語系類型,將檔名編碼。於是你可能會碰到解壓縮或下載後,並非使用正確編碼的討厭檔名。你可能會很聰明的寫了個 script 拿 iconv 來轉檔案,但是這跟點點滑鼠比起來,實在麻煩的了點。

感謝 Choe Hwanjin 的 Nautilus Extension Filename Repairer,安裝這個工具後,你就可以直接在錯誤的檔名上進行編碼轉換,點點滑鼠就搞定了。Debian 中已經有包好的 Nautilus-filename-repairer 可用。

好吧,我承認拿立花里子作範例有點糟糕。小朋友不要學喔。這是一篇 Tip.