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年3月27日 星期四

Cleanup of initrd.gz

因為 LiveUSB 開機還是不夠快 (總共 34 秒左右), 昨晚一氣之下就跳進 initrd.gz 看有沒有可以動刀的地方.

原本我的假設是 1) squashfs 要掛載很慢 2) aufs 掛載也很慢.

因此我採取了以下步驟, 製作一隻不用解壓縮的 LiveUSB:

1) 全部格式化成 ext3
2) 安裝 extlinux 當作 boot loader
3) 將 syslinux.cfg 轉成 extlinux.conf
4) 將原本未壓縮的目錄 cp -av 至 casper/filesystem.dir

結果... 讀取時間有稍微變短, 總共大約差了兩秒. 並沒有出現想像中的奇效.

於是我又做了這些事來找出瓶頸 (總算想到要 profiling 了):

1) 將 /usr/share/initramfs-tools/scripts/casper 更新
2) 因為 busybox 好像有點問題, 把 /bin/date 塞進 initrd.gz
3) 修改 scripts/functions 讓 log_begin_msg() 順便紀錄時間

有了驚人的發現!!

1) 指定 union 的參數改叫做... union 了 (嚇到了吧!)
我把預設值修改為 aufs
2) 原先的假設根本不成立, 掛載超快的!
3) 瓶頸主要出現在四個地方

a. find_livefs() - 10 秒
b. scripts/casper-bottom/10adduser - 5 秒
c. scripts/casper-bottom/20xconfig - 3 秒
d. scripts/casper-bottom/23networking - 3 秒

其中 a 應該可以透過 bootfrom= 參數來解決, 但我還沒有試成功, 看來它會等待核心將裝置初始化. 而剩下的三個都透過 "背景執行" 這招簡單又骯髒的步驟成功減少時間.
再把不用的 script 清掉, 最後, initrd.gz 所需要的時間就降到 15 秒了.

雖不滿意, 但還可以接受. 這故事也再度驗證了不先找出瓶頸就亂動手的人是白痴.

2 則留言:

匿名 提到...

其實PUD Linux 0.4.8.5 開機速度已改進了很多(關機更爽),如果要改進,我覺得現在重新加入opt-plugin及Load會比較好。

PS:你還計少了一個最會吃時間的部分,pudata load,不過這不是你的錯。

penk 提到...

是阿一定會加進去 InitNG, 只是要想比較好的方法實做.

pudata 或許改用 casper-rw 機制來做就好了. :-P