BV1AL 之無所不記

2017-06-10

空機執行CentOS Live(有關iPXE)

原本都是用CentOS Live放在USB,最近因為有需求用PXE執行CentOS,但是傳統上
PXE的tftp傳輸很慢,於是改用iPXE,因為iPXE可以使用像是http, iSCSI, AoE等等的
protocol,相較快很多,http又可以跨越local LAN。

網路上大多數談到PXE是以安裝Linux系統為主要,但是這裡的目的,不是要install
,而是直接跑live system在一台空機上面, 因此需要把整個live image傳送到clicnet端,
如果採用iPXE加上http會比tftp好太多!

不論PXE(或iPXE)基本上只能傳送kernel及initrd兩個檔給client,可是我們有
kernel(vmlinuz), initrd.img, squashfs.img三個檔案,沒辦法全都傳!
而三個檔中的squashfs.img很大,根本不適合用tftp傳送!

網路上有人寫了一個把CentOS Live ISO轉給PXE用的script
https://github.com/livecd-tools/livecd-tools/blob/master/tools/livecd-iso-to-pxeboot.sh

它主要就是把原生CentOS Live的ISO拆開,再重新打包成兩個檔(一個kernel
及一個initrd.img),雖然我已經customized的CentOS Live當然可以再反組裝
回去ISO,但那是多費力氣,並不需要。

只要把squashfs.img打包成ISO檔,塞進拆開的initrd裡面,就構成PXE必要的
兩個檔之一,加上kernel就能透過iPXE快速的傳送到client端執行了。

squashfs.img的customize在這裡只簡單說明,它裡面有一個LiveOS的目錄,
裡面塞了一個ext4的單一檔案,這個檔案可以用dd if=/dev/zero來打底,改變
大小,將整個system tree搬進去,修改後再重新打包回squashfs.img裡面,
就是customize完成。

將squashfs.img打包成ISO的方法如下:
genisoimage -J -joliet-long -r -T -o CentOS.iso --root LiveOS /PATH/squashfs.img
再挖一個坑,例如 myISO/,把產出的CentOS.iso丟進去,myISO/下面你也可以
放任何你要放的檔案。
cd myISO/
find . -print|cpio -H newc -L -o|gzip -9 |cat /PATH/initrd.img - > ../init4PXE.img
產出的init4PXE.img會在 myISO/的上一層。
請注意!上面的"- >" 「減號」跟「大於」之間有一個「空白」

新的init4PXE.img會是幾百MB或超過1GB,看你做了什麼而定。

最後的重點就是bootloader的menu要怎麼寫,原本CentOS Live的bootloader
menu有一個參數
"root=live:CDLABEL=LIVEUSB" 這時候要改成
"root=live:/CentOS.iso" ←這個CentOS.iso是根據上面我們製作ISO給的
名字,然後boot option至少要保留"rd.live.image"這一個。
附註: 要拆解原生CentOS的initrd.img需要用到
CentOS自己的/usr/lib/dracut/skipcpio
這個工具。
(customize CentOS Live可能也要拆解initrd.img並且重新打包。
重新打包就是用上面的指令及參數
find . -print|cpio -H newc -L -o|gzip -c > initnew.img)

標籤: ,

0 Comments:

張貼留言

<< Home