BV1AL 之無所不記

2016-03-24

製作 Macbook 可執行的多重 Linux Live USB

這裡所謂「多重」是指一支 USB disk 上有多種版本的 Linux, 例如 Debian, Mint,
Ubuntu, CentOS, 或是包括 Ubuntu 14.10, 15.04, 15.10, 16.04 多版本全放在一支
USB disk, 因為現在 USB disk 越來越大,一支 64GB 的可以裝10個以上不同Linux.

對於想要拿Macbook 來跑Linux 的人,跑Live Linux on USB disk 應該最方便, 
不必動到 Macbook 硬碟,更不必藉由 virtual machine. 直接把一支 USB 碟
插在 Macbook 按住 Option 開機就能進入 Linux 環境工作。

長期以來我都是把 USB disk format 成 vfat 再用 grub 0.97 放在 boot/ 下,就可以
在任何 x86 電腦上開機進入 Linux 環境,只是這樣的 USB 遇到 Macbook 就不能開機,
沒得玩了!
(grub 0.97 既可以 boot CD/DVD 也可以 boot vfat USB disk)

從網路上找到的製作 Macboot 可開機的 Linux Live USB 的方式是:
1. 下載 ISO 檔(例如 Ubuntu_xxxx.iso)
2. 在Macbook 執行 hdiutil convert -format UDRW -o yyyy.img Ubuntu_xxxx.iso
3. dd if=yyyy.img of=/dev/diskN bs=1m

但這支USB disk 變成read only, 又只能塞進一種 Linux, 剩下的空間(幾GB ?)
完全用不到,而且這個 Linux 是原出廠設定, 這不是我要的操作方式.

那我來重製 ISO 檔,這樣做出來的 Linux Live USB 開機後就是我想要的環境。
可是發現修改過的ISO(改內容,再重製成 ISO file) 經過hdiutil 轉過後,卻不像
原廠 ISO 做出來那樣可開機,我改的ISO dd 出來的 USB 在 Macbook 開機時完全看不到。

幾過多次試作,發現有兩種原因造成自行改過的 ISO 無法被Macbook 用來開機,
因此要這樣才能開機:
1. boot loader 必需要用 isolinux
2. 用genisoimage/mkisofs 做出來的ISO 檔要再過一次 isohybrid

genisoimage --no-emul-boot --boot-info-table --boot-load-size 4 \
-b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -J -r -l \
-o my_Linux.iso my_Linux_source_directory
然後執行
isohybrid my_Linux.iso

這樣做出來的 ISO 檔直接在 Linux 環境 dd 到 USB disk, 便可以插在 Macbook 開機,
完全不必再拿到 MacOS 環境下再用 hdiutil 轉換。
(dd if=my_Linux.iso of=/dev/sdX bs=1M)

只是,這樣就很不方便,因為對 Live Linux 內容任何大小的修改,每一次都必需重製成 ISO
再 dd 到 USB disk, 非常浪費時間。

換一個方式,把我原本可以在 x86 電腦開機的 USB disk 上各種 Linux 的 kernel/initrd
copy 出來,用上面提到的方式 改以 isolinux.cfg 來寫開機控制,參數可直接取用原有
那支 USB 的 grub/menu.lst 過來即可。

然後用上面的 genisoimage 指令及 isohybrid 做成一支可供 Macboot 開機的 USB disk,
在 Macbook 開機的時同時,也插入另一支我原本的 USB disk,

這樣在 boot loader 載入 kernel/initrd 後便會去另一支 USB disk(Macbook 不認定可開機的)
上面找對應的系統檔案,完成開機進入完整的 Linux 環境。

大部份的 Live Linux 都可以兩支同時插著開機(當然在按power 的同時也要按住 Option),
少數 Live Linux 要插拔一下非開機用的那支,才會被偵測到,載入完整系統。

標籤: ,