About me

我的相片
I'm a web and software developer from Kaohsiung, Taiwan.
I design and implement user interfaces, also contribute to open source projects.
http://penkia.net/portfolio

2008年4月3日 星期四

Boot Gear: Boots to Linux in 5 Seconds

Boot Gear: 5 秒鐘快速開機


在所有最佳化途徑當中, 快速開機總是最具吸引力的一項.

大約四個月以前, 我開始著手進行 Boot Gear 計畫, 目標之一就是使 Ubuntu Linux 盡可能的快速開機, 並且依然保有完整功能的圖形介面.

最近的結果: 5 秒鐘


Boot Gear 組成元件


Boot Gear 包括這幾層架構:
  • 精簡的初始磁盤
  • 快速的 init 程序
  • 圖形介面的啟動
  • bootchart 紀錄 (非必要)
其中每一項精簡都代表著對既有功能與彈性的犧牲. 整體而言修改幅度並不大, 我盡可能以最少的工作換取最佳效果, 這個宗旨和 PUD 專案可說是一脈相傳 :-)

精簡的初始磁盤


初始磁盤 (initial ramdisk) 的工作越少越好, 最近的嘗試是將開機必要功能編入核心當中, 如此一來 initrd 就可以完全拿掉了.

核心要能初始化我的硬碟需載入這些模組:
sd_mod (CONFIG_BLK_DEV_SD)
scsi_mod (CONFIG_SCSI)
libata (CONFIG_ATA)
sata_nv (CONFIG_SATA_NV)
另外還要加入 ext3 檔案系統 (CONFIG_EXT3_FS) 等的支援. 以 make bzImage 指令編譯完成後, 將 arch/x86/boot/bzImage 這個檔案複製到 /vmlinuz-fast, 這就是能夠快速開機的核心.

快速的 init 程序


原先這個角色是由 InitNG 來擔任, 因 finit 發展漸趨成熟, 所以改由這套 fastinit 的同質專案來取代.

首先取出原始碼:
# git clone http://helllabs.org/git/eeepc.git
修改編譯完成後, 將 finit-mdv 複製到 /sbin/finit-mdv, 就有了最極簡的開機程序.

圖形介面的啟動


要啟動 Xorg 需要 dbus, udevhal 等常駐程式.

因此新增 /usr/sbin/services.sh 如下:
#!/bin/sh

/etc/init.d/dbus start 2&>1 > /var/log/service.log
/etc/init.d/udev start 2&>1 >> /var/log/service.log &
/etc/init.d/hal start 2&>1 >> /var/log/service.log &
finit 會在執行 startx 之後一併執行以上的程式.

bootchart 紀錄


紀錄開機時間這種需求中, 最稱手的工具非 bootchart 莫屬.

下載程式 bootchart-0.9.tar.bz2 後解開執行 ./install.sh 安裝.

修改 /sbin/bootchartdinit 變數改為我們的開機程序:
init="/sbin/finit-mdv"
並在 /usr/sbin/services.sh 當中新增一行:
/sbin/bootchartd stop
最後在 bootloader 中建立開機選項 (以我的 GRUB 為例):

title PUD Fast booting (bootchartd)
root (hd0,6)
kernel /vmlinuz-fast root=/dev/sda7 ro init=/sbin/bootchartd

需注意其中 root 參數無法再使用 UUID 的格式.

結果


所有工作完成後, 就有了能夠快速開機的系統. :-)

讓我們把停止紀錄的時間往後拉長, 看看 Boot Gear 執行的細節:



可以發現 X 在第三秒就已經啟動, 之後 services.sh 才開始執行.

接下來還能繼續進行最佳化的地方大概有:
  • BIOS 設定的調校
  • startx 程序的精簡
因為 Xorg 在開啟時有大量的 I/O 動作, 我想包括 startxfce4 都還有進步空間.

Boot Gear 專案的修改成果沒問題的話會以 GPL 釋出, 所有相關的文件都是 CC: BY-NC-SA 授權.

敬請指教, 謝謝!

8 則留言:

FA 提到...

感謝您提供這樣的資訊,期待進一步的成果。
^_^

匿名 提到...

非常需要!
但是,小弟我資質愚鈍,您所說的這些,整個的步驟是要如何下指令呢?
還是……
請指導!

勝仔
hinet.johnlin@msa.hinet.net

匿名 提到...

真期待。請問要如何開始?

sbbg 提到...
作者已經移除這則留言。
sbbg 提到...

那root的分辨還能用LABEL嗎?(剛那篇打錯刪了XD)

匿名 提到...

首先,謝謝您提供的方法。
我按您的方法試驗過,可以啟動ubuntu,
但我遇到一個重要問題,啟動後只有console, 沒有圖形桌面,如果將finit-alt.c中的”xinit” 改為 “startx”, 則啟動後會有圖形桌面,但會顯示 “failed to initialize HAL”.
不知道您有沒有遇到此問題,有無解決方法?

TIM 提到...

Hi請問文章中的圖是怎麼做出來的?

敦搖 提到...

我也想要詳細的步驟thanks!!!


no.1dany@yahoo.com.tw