利用 GRUB2 掛載 ISO 檔安裝 OS

以前要安裝新的 OS 總是要利用光碟片來開機才能安裝,但最近碰到光碟機會挑片,無法讀取單面雙層的 DVD,每次要安裝還得跟別人借光碟機,實在有夠麻煩!

後來偶然間看到 Grub2/ISOBoot 才發現:原來 GRUB2 不只可以掛載 Partition,也可以掛載 ISO 檔模擬成光碟機 (類似 Windows 下的虛擬光碟機),這樣就可以安裝了,而且速度還比實體光碟機快多了,反正現在硬碟空間那麼大,不在乎存放 ISO 檔的那一點點空間!


以下就用 Ubuntu 10.04 的 ISO 檔來實驗看看,首先編輯 menuentry

sudo gedit /etc/grub.d/40_custom

加入以下的設定

menuentry "Ubuntu 10.04 ISO" {
 set isofile="/ubuntu-10.04.4-desktop-i386.iso"
 loopback loop (hd0,8)$isofile
 linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
 initrd (loop)/casper/initrd.lz
}

其中 set isofileloopback 是設定 ISO 檔的存放位置,像我是在 /dev/sda8 切一塊 ext4 的空間專門用來存放檔案

至於後面兩個則是啟動指令,不同的 OS 會有不同的啟動方式,有機會再補上其它 OS 的資料,詳細的說明就請參考上面 GRUB2 的文件

存檔後再執行

sudo update-grub

重新開機後就可以進入 Ubuntu 10.04 Live CD 了



2018/01/28

以上的作法在 Ubuntu 17.10 上已經行不通了,參考 grml-rescueboot 的作法如下:
  1. 安裝 grml-rescueboot
    sudo apt-get install grml-rescueboot
  2. 把 iso 檔案放到 /boot/grml/ 下
    sudo mv ~/Downloads/<filename.iso> /boot/grml/
  3. 更新 grub
    sudo update-grub
在安裝的過程中會出現因無法卸載而導致安裝失敗,參考 Installing Ubuntu from a Menuentry Boot 的作法如下:
  1. 以試用的方式進入 Ubuntu
  2. 開啟終端機執行卸載
    sudo umount -l -r -f /isodevice
  3. 點選 "安裝 Ubuntu" 開始安裝



2013/9/30

Windows 7 x64 (from MSDN test OS)

首先要說明的是,Windows 7 無法使用 Ubuntu 的方式來載入,後來參考 GRUB2引导Windows PE等ISO文件的办法 使用 syslinux 內建的 memdisk (解開後位於 bios/memdisk 的路徑下) 來載入就行了,為了方便使用,我把它跟 ISO 檔放在相同的位置。

接下來是 ISO 檔的製作,原本在 Windows 找了一些軟體,但製作出來的 ISO 檔都無法使用。後來直接使用 Ubuntu 內建的 Brasero 光碟燒錄程式 就 OK 了。開啟 Brasero 後點選 光碟複製,在目標光碟選擇 映像檔案 即可。

最後就是 menuentry 的設定了

sudo gedit /etc/grub.d/40_custom

加入以下的設定

menuentry 'Boot Windows 7 64-bit ISO'{
        set root='(hd0,msdos8)'
        echo 'Loading Memdisk...'
        insmod memdisk
        linux16 /memdisk iso raw
        echo 'Loading ISO...'
        initrd16 /Win7_64.iso
}

它跟上面不同的地方在於 GRUB2 先載入 memdisk,再利用 memdisk 載入 ISO 檔來執行;而不像 Ubuntu 直接由 GRUB2 載入。另外 linux16 與 initrd16 是用來載入 16-bit 程式的。

存檔後再執行

sudo update-grub

就大功告成了!

這裡附帶提一下 Windows 下的虛擬光碟機,原本想使用 Microsoft 的 Virtual CD-ROM Control Panel,但它不支援 64-bit OS;後來改用 Virtual CloneDrive 就可以了,這樣裝 Visual Studio 就不需要光碟機了!(當然要先製作 ISO 檔)



2013/10/4

用上述方式開始安裝後,會出現 "遺失必要的 CD/DVD 磁碟裝置驅動程式..." (參考:Grub4Dos 系統安裝碟) 看起來上述掛載的方式只是載入一些前導程式,實際要安裝的程式內容並未掛載上來 (我猜想),關閉錯誤訊息後回到主畫面,然後進入 系統管理員 (Shift + F10) 利用 ImDisk 把 ISO 檔再掛載一次就可以了。

首先把下載的 ImDisk 用 7-Zip 解壓縮後,跟 ISO 檔放在一起,然後建立以下兩個批次檔

SetupImDisk.CMD (安裝 ImDisk)
rundll32.exe setupapi.dll,InstallHinfSection DefaultInstall 132 .\imdisk.inf

SetupCDROM.CMD (載入 ISO 檔)
Set fullname=%~1
imdisk -a -f "%fullname%" -m #:

然後輸入下列指令
pushd D:\ImageSource\imdisk // 切換到 ImDisk 的路徑 (實際上用 cd 切換到該路徑即可,但配置的磁碟機路徑需要自行找一下)
SetupImDisk.CMD // 安裝 ImDisk
SetupCDROM.CMD ..\Win7_64.ISO // 掛載 ISO 檔

此外因為 ISO 檔需要在安裝的過程中重新掛載,所以將 ISO 檔從 ext4 移到 NTFS,但 memdisk 仍然放在 ext4 的位置,修改的 memuentry  如下:

menuentry 'Boot Windows 7 64-bit ISO NTFS'{
        set root='(hd0,msdos8)'
        echo 'Loading Memdisk...'
        insmod memdisk
        linux16 /memdisk iso raw
        set root='(hd0,msdos9)'
        echo 'Loading ISO...'
        initrd16 /ImageSource/Win7_64.iso
}

接下來就是把系統保留的 100MB 刪除,不過這一次沒做,下次有做再補吧

留言

這個網誌中的熱門文章

Linux 批次檔的寫法

【分享】如何顯示 Debug Message

[分享] Visual Studio 遠端偵錯