通過moblin MIC2制作的usb啟動,有兩種方式,一種是liveOS的,直接boot,一種是象傳統安裝Linux OS的方式在設備中安裝。我想將moblin2安裝在MID(menlow)上,需要重新rebuild內核。kernel編譯可以通過moblin-chroot的方式展開開發環境,也可以通過KVM的環境。
從moblin的repo網站中獲取kernel的source code,例如wget http://repo.moblin.org/moblin/development/core/source/kernel-2.6.29.5-8.1.moblin2.src.rpm
展開rpm包:rpm –ivh kernel-2.6.29.5-8.1.moblin2.src.rpm,在~/rpmbuild/下面展開,進入SPECS/目錄,下面有kernel.spec文件。在SOURCES/目錄下面有原代碼和補丁。通過rpmbuild –bp kernel.spec,可以解壓源代碼,並打上補丁。
進入~/rpmbuild/BUILD/目錄下面,就是我們kernel的source code。在這裡根據傳統的kernel編譯方式進行即可。
根據kernel的編譯,我們成功地在/lib/modules下面安裝的kernel modules,以及在/boot下面提供vmlinuz和System.map。但是在通過MIC2將他們制作成usbimg的時候,出現問題:
問題一:Error creating Live CD : Unable to copy valid kernels or initrds, please check the repo
嘗試一:我曾認為是沒有生成initrd導致的,因此使用mkinitrd的命令來制作initrd,但是雖然沒有報錯,但是也沒有實際生成,這個非常奇怪。但是根據以前的實驗說明,initrd不是必須的,所以放棄。
嘗試二:在/boot下面有兩個kernel,舊的(netbook)和新的(menlow),刪除舊的版本,並同時刪除/lib/moudules相關的文件夾。不在報錯,問題解決。導致這個問題的原因是:存在多個kernel。
問題二:我們成功制作了usbimg,使用它來啟動MID。對於直接Boot的方式,沒有問題,可以直接啟動。但是對於安裝方式,出錯。
在安裝成功,啟動時出現:
Error 15 File note found
然後,"Press any key to continue....",進入grub,發現只有一個選項Moblin(2.6.29.5-8.1.moblin2-netbook,及舊的kernel),需要edit到新的kernel才能進去。這說明我們在編譯kernel或者制作usbimg的過程中可能出現遺漏,沒有引導到新的kernel中。
嘗試一:以為某個配置問題,因此我大范圍地grep netbook,沒有發現有效線索,放棄。
嘗試二:以為是制作問題,因此我跟蹤了MIC2中py腳本,只是證明在live OS中得到正確的version。沒有發現有效的線索,放棄。
嘗試三:用rpm –e kernel-netbook的方式徹底刪除舊的版本,重新制作usbimg,這時在安裝的過程中出現找不到kernel package的提示。這是個重要的信息,表面出現這種情況,是因為我們沒有將新的kernel制作成為rpm,而系統安裝是根據package來安裝的,需要kernel的rpm。有效的解決方式是:將新的kernel制作成功rpm。
根據這個信息,我們在網上查閱的如何打rpm的資料,我的初衷是,我有kernel modules,有kernel的vmlinz這些目標 文件,如果將他們打成rpm包。但是似乎所有的資料顯示都是通過spec的方式,講過make,build等過程來進行,也就是說適合於源碼的方式,不適合於直接將二進制文件或者其他我們的目標文件直接進行封裝打包。我們從moblin網站上下載的source是帶有spec的,應該可以直接利用它來生成rpm。
閱讀spec,檢索ivi或者netbook,我們據此添加menlow的腳本。使用rpmbuild –ba kernel.spec,經過了漫長時間的等待,在~/rpmbuild/RPM/i386裡面有相關的rpm生成。我們同時生成了netbook、ivi、menlow的版本。刪除系統原有的kernel,安裝新的menlow rpm,我們重新制作usbimg,一切正常。
我們思考下面的問題:
1、如果是我們的一些應用軟件,是否也要制作成相關的rpm包,才能通過安裝方式?
應該不需要。在開始的時候,我們沒有打包,也沒有刪除越來的舊包,可以通過edit grub的方式進入系統,這也就是說明相關的文件能夠放入文件系統當中,是可以被使用的。只是kernel package是系統重要的rpm,如果缺乏在啟動的時候,連grub的無法開啟。但是用rpm來管理我們的軟件,不但是版本的問題,對於軟件升級和軟件下載都是非常重要的。
2、如果我們得到了一個官方的linux kernel的新版本,這個只有tar.bz,不是moblin的rpm方式,沒有spec,我們如何將它進行編譯和打包?
無論如何,我們有必要學習rpm的打包方式。