預設的影像檔內附的核心的網路驅動程式似乎是有問題,安裝到一半會發生 IRQ 處理異常,然後會整個停在那邊。
解決之道就是把核心換掉,不過換掉核心連帶的也得換掉驅動程式,所以不能單純的把 zImage 檔中核心的部分抽換,也要改 initrd 影像,用下面這個指令可以把 initrd 影像解出來。
objcopy -j .kernel:initrd -O binary zImage initrd.gz
接這就可以用 gzip 把影像檔解開得到 cpio 檔案,接著用下面這個指令解開 cpio 檔案。
cpio -idv < INPUT-FILE.cpio
把原本的 initrd 解開之後,找 anaconda 的 scripts/mk-images 來加以修改。重點在於執行 makemoduletree() 這個函式,可以參考 scripts/mk-images.ppc 來驅動 makeinitrd() 去執行 makemoduletree() 來產出 kernel object 的資料夾。
主要是把 /modules 的檔案都替換掉就沒有大問題了,接著在相當於 / 的檔案系統根目錄執行下面這個指令,來把檔案系統打包成 gzip 壓縮的 cpio 檔案。
find . | cpio --quiet -c -o | gzip --best > OUTPUT-FILE.initrd
給 Open Firmware 的 BOOTP 用的 zImage 檔基本上是 ELF32-BE 的格式的檔案,在 Fedora 7 的時候 kernel 會去找 .data 節區來作為 initrd 影像來源,不過在 Fedora 9 則是找 .kernel:initrd 這個節區。如果在 Fedora 7 上用 mkzimage 去做的話,開機的時候會當掉。
所以舊的給 Fedora 7 的 mkzimage 指令就不能用了,要找新的位於 kernel-bootwrapper 套件內的 wrapper 指令來用,單純解開來用的話要改一下 wrapper 裡的 $object 與 $objbin 這兩個變數,把他的內容指到解開套件的位置。
這部分我是這樣子改:
rootpath=%TEMP_WORKSPACE%
object=$rootpath/usr/lib64/kernel-wrapper
objbin=$rootpath/usr/sbin