inetboot x httpfs 研究筆記

首先從名詞解釋開始...
inetboot:
http://openlab.ring.gr.jp/oscircular/inetboot/
這是一個由日本實驗室主導的專案,目標在開發一套系統,可以直接利用http/ftp上面的ISO檔來開機,不需要傳統的下載、燒錄光碟、然後在透過光碟或者隨身碟開機的冗長程序,加上主流Linux Distribution都有提供LiveCD,兩個結合起來就是只要能夠上網的裝置,都可以直接利用網路的檔案開機。
不過inetboot已經在2008年9月停止更新,實驗主力轉往PS3 Linux的相關應用韌體與全球網路服務發展,這也促成這次研究的動機,因為想把最新的Ubuntu 9.10移植上去跑(目前只支援到Ubuntu 8.04)

httpfs:
http://httpfs.sourceforge.net/
這是前項專案的核心技術httpfs,取代以往整個檔案下載的方式,變成按需要分部份下載,只要事先對ISO建立檔案索引,就可以很有效率的直接取用,基於FUSE的先進技術,只要核心有支援FUSE,不需重新編譯核心即可直接在user space創立httpfs

buildroot:
buildroot
一如其名稱,這是專門用來開發Embedded Linux Root Filesystem的"巨集",本身只是一堆設定檔跟連結,但是巧妙設計的設定系統,讓本來東拼西湊的Embedded Linux 系統開發變得很簡單,支援X86、ARM等主流硬體。

阿婆的裹腳布落落長的開發歷程...
1 首先是驗證inetboot的性能,但是透過WAN速度還是頗慢
2 所以自己架了Apache Web Server來提供下載服務,果然開機速度快多了
3 確認可行之後,就是拆解inetboot的光碟研究,就像很多Embedded Linux一樣,由三個部份組成bootloader、kernel與initrd
4 bootloader 預設是grub,不過要換成syslinux也可以
5 kernel,預設版本是2.6.24,夠新了,不過後來我癢又把它小改一下,開機更快了一點
6 initrd,也就是root fs,這是這次修改的重點
7 分析錯誤訊息並追蹤開機檔案linuxrc->casper-netfsboot後,發現主因是Ubuntu 9.10採用了壓縮比更高的lzma演算法,這在2008年的舊系統中並不支援,於是要想辦法加進去
8 既然本來是用buildroot建的,要放東西進去當然要準備相同的環境,把buildroot架起來後,經過一番努力,把所需的lzma跟相關函式庫編譯出來,並放回本來的minirt.gz
9 另外casper-netfsboot也要修改,讓它支援新的initrd格式,這部份說難不難、說簡單也不簡單,必須對Shell Script有一點認識才可以順利修改完成,差異部份表列如下:

< EXT=abc < 71d68 < [ -f ${CDMOUNT}/isolinux/text.cfg ] && CFGNAME=text.cfg 118c115 < { --- > {
123,134c120,121
< EXT=`basename $BOOTMINIROOT | awk -F. '{print $2}'` < echo uncompress miniroot...in $EXT mode < case $EXT in < gz) < ( cd $MINIROOT ; gzip -dc $BOOTMINIROOT | cpio -idm -H newc --no-absolute-filenames ) < ;; < lz) < ( cd $MINIROOT ; lzma -dc -S .lz $BOOTMINIROOT | cpio -idm -H newc --no-absolute-filenames ) < ;; < *) < exit; < esac --- > echo uncompress miniroot...
> ( cd $MINIROOT ; gzip -dc $BOOTMINIROOT | cpio -idm -H newc --no-absolute-filenames )
203,214c190
< case $EXT in < gz) < ( cd $MINIROOT ; find . | cpio --quiet -o -H newc | gzip -9v -c > ${MINIROOT}.gz )
< ;; < lz) < ( cd $MINIROOT ; find . | cpio --quiet -o -H newc | lzma -9 -v -c -z > ${MINIROOT}.lz )
< ;; < *) < exit; < esac < < --- > ( cd $MINIROOT ; find . | cpio --quiet -o -H newc | gzip -9v -c > ${MINIROOT}.gz )
329c305
< INITRD=${MINIROOT}.$EXT --- > INITRD=${MINIROOT}.gz

這樣大概就完成了...

心得:
其實要改得地方並不多,牽涉到的檔案也不多,但是關鍵還是在於處理Shell Script的功力,才不會被無所謂的code搞得暈頭轉向

留言

阿聰寫道…
你也可以看一下 netboot.me 這個基於 gPXE 的專案,gPXE 本身就有支援 HTTP 開機的功能,比較麻煩的應該是開機以後要做的事情吧。

http://www.netboot.me/
COOL
netboot.me 這個感覺功能也不錯

關於gPXE我也深有同感
的確直接用gPXE實作HTTP開機簡單的多,會拿inetboot來玩也是想看看葫蘆裡面賣的是什麼藥,看完之後,問題還是回到關鍵點,要放啥在HTTP server上....

感謝大大的分享....

這個網誌中的熱門文章

RTC & CMOS 技術詳解

[自由網路] 如何取得 Google Drive (真實)外連位址 (Direct Link)