2009年12月8日

讓 USB 隨身碟同時可以安裝 Linux/Windows 7

身為一個專業的阿宅,每次安裝 OS 的時候總是要找光碟找半天,偏偏很多 Server、Notebook 都沒有光碟機,找學弟借也只是權宜之計。
剛好手邊有個 160G 的隨身碟,就打算來建立一個可以用 USB 開機且安裝 OS 的 USB 隨身硬碟。
我的需求「看似」很簡單,不過實際上 google 了很久倒是沒什麼解法…所以在解決了這個難題之後,特地把他記錄下來…

Require:
開機時我可以選擇要使用哪一個 iso 檔案來開機
除了一般的 Unix-Like OS 之外,我還要能夠安裝 Windows 7

1. 單純 Unix-Like OS 的話很簡單,請直接 google BootMyISO 解決
2. 單純 Windows 7 的話也很簡單,請直接 /boot/bootsect X:,xcopy E: /s /e /f X:
    X: 為 USB 隨身碟代號, E: 為光碟機代號
3. 如果沒這麼單純的話請往下看…
其實解法很簡單,我個人的步驟是
1. 請先把你的隨身碟格式化成 FAT32 (之後就不要再格式化囉,只格式化這一次)
2. 然後參考 PTT 這篇文章 (原文已經被刪除…另外 google 到原作者的 blog 網頁版 )先確認你的 USB 隨身碟可以正確跑到 memtest86+
3. 我把 Ubuntu lucid 10.04 dialy build 2009-12-07 的 iso 檔丟進去,並且依照上篇文章修改,並且確認可正常開機。
4. 接著參考 這篇文章 的後半段,從 Step 9 開始到 Step 11。
5. 這時候,隨身碟就只能用 Windows 7 開機,於是再重新用第二步的 BootMyISO 重新執行一次。
6. 重新把 Ubnutn 的 menu.list 寫入。
7. 加入給 Windows 7 用的 menu.lst
title Windows 7 64bit Ent
# find --set-root /pmagic-4.5.iso
# map /pmagic-4.5.iso (hd32)
# map --hook
# root (hd32)
chainloader /bootmgr
8. 我整個 menu.lst 是這樣
default 0
timeout 30
color cyan/blue white/blue
foreground ffffff
background 003f7d
title Memtest86+
find --set-root /memtest86+-4.00.iso
map --mem /memtest86+-4.00.iso (hd32)
map --hook
root (hd32)
chainloader (hd32)
title Windows 7 64bit Ent
chainloader /bootmgr
title lucid-alternate-i386.iso
find --set-root /bootiso/lucid-alternate-i386.iso
map /bootiso/lucid-alternate-i386.iso (hd32)
map --hook
root (hd32)
chainloader (hd32)
9. 完成之後,這個隨身碟就可以拿去安裝 Ubuntu/Windows 7 了。
不過根據我測試的結果,舊一點的主機板雖然支援 USB-HDD 開機,但還是無法正常進去 Windows 7 的安裝畫面。不過我測了手邊的幾台電腦:X200、LS400、X61 都是可以正常進到 Windows 7 64bit 安裝畫面與 Ubuntu Lucid 10.04 的安裝畫面的。
P.S 我猜,如果確定你的隨身碟支援 USB-HDD 開機的話,也許可以跳過 1、2、3 步驟,等 Windows 7 的 bootmbr 寫進去後,在用 grub 覆蓋回來就好。
多重開機可以參考這篇:http://www.pendrivelinux.com/boot-multiple-iso-from-usb-multiboot-usb/
補上最後的 menu.lst
default 0
timeout 30
color white/blue yellow/black
title Ubuntu Lucid 10.94 Desktop i386 Dialy Build 20091207
find --set-root /bootiso/lucid-desktop-i386.iso
map /bootiso/lucid-desktop-i386.iso (0xff)
map --hook
root (0xff)
kernel /casper/vmlinuz file=/cdrom/preseed/ubuntu.seed boot=casper iso-scan/filename=/bootiso/lucid-desktop-i386.iso quiet splash locale=zh_TW
initrd /casper/initrd.lz
boot
title Windows 7 64bit Ent
# find --set-root /pmagic-4.5.iso
# map /pmagic-4.5.iso (hd32)
# map --hook
# root (hd32)
chainloader /bootmgr
# boot
title Ubuntu Lucid 10.94 Alternate i386 Dialy Build 20091207
find --set-root /bootiso/lucid-alternate-i386.iso
map /bootiso/lucid-alternate-i386.iso (hd32)
map --hook
root (hd32)
chainloader (hd32)
title Memtest86+
find --set-root /bootiso/memtest86+-4.00.iso
map --mem /bootiso/memtest86+-4.00.iso (hd32)
map --hook
root (hd32)
chainloader (hd32)
title Reboot
reboot
title Shutdown
halt

3 則留言:

  1. 請問一下站長
    我做完之後執行win 7的ERD發生了
    Error 60: File for drive emulation must be in one contiguous disk area
    看了網路上的解答
    好像是什麼map要求連續存取
    但我不懂
    要怎麼改
    這是我menu.lst的一部分
    還有連關機都不行
    重開到可以@@
    關機還要加什麼指令嗎
    default 0
    timeout 30
    color white/black black/white
    foreground ffffff
    background 000000

    title ERD_Win7_RTM
    find --set-root /setup/ERD65_Win7.iso
    map --mem /setup/ERD65_Win7.iso (hd32)
    map --hook
    root (hd32)
    chainloader (hd32)

    title Shutdown
    halt

    回覆刪除
  2. 如果你有仔細的看完內文的話,就會看到我 windows 7 是沒有用 iso 檔的,原因你現在遇到了。

    關機的話我不確定,不過我測試的幾台機器都可以。

    回覆刪除
  3. windows透過iso檔直接安裝會沒有辦法進入安裝程式
    原因是因為windows的安裝程式不認得grub4dos掛載的虛擬光碟
    因此進安裝程式後找不到光碟資料

    可參考我新的一篇文章
    http://blog.mosquito.tk/2012/04/windows-iso-usb-installer.html
    藉由3rd party寫的driver可以讓Windows認到grub4dos掛載的光碟
    因此Windows系列的作業系統均可藉由ISO檔直接安裝

    回覆刪除