linux 下用虛擬機開雙開機的 windows 分區

很多 linux user 都把電腦做成雙開機, 可以在開機時選要進 windows 還 linux。 我又在 linux 下用 qemu 拿 windows 分割當硬碟開虛擬機, 之後要用 windows 程式就不用重開到 windows 了。

之前用 ferrari one 有沒有試過類似的事忘了, 不過很可能是 cpu 太差跑不動, 換 thinkpad 13 才又試了, 最後在 ptt 板友的協助下弄出來了!

qemu 我多用 qemu-system-x86_64 -enable-kvm , 詳細為什麼要用 system 我也沒查。 一開始直接試 qemu-system-x86_64 -enable-kvm -hda /dev/sda , 結果不签。 不確定是因為 sda 正在使用,(linux 也在 sda 裡。) 還是 uefi 的問題,就去 ptt linux 板問。

但另外用原筆電的硬碟接上去, 再 js `${qemu} -hda /dev/sdb` , 就直接看到開機選單了,也能進 windows。 只是之後 windows 竟然給我更新, 我又不敢直接關虛擬機等同強制關機, 只好等他更新完。

之後記得加 -snapshot -net none 二個參數。 snapshot 不會寫入硬碟,也就不需要 sda 的寫入權限也能開機, 只會寫到暫存檔,關機就沒了,就可以直接關掉虛擬機強制關機了。 net none 是關虛擬機的網路連線,防止 windows 連網就想要更新。 好像有 snapshot 就可以不用關網路了。

ovmf

後來有板友提供 ovmf 關鍵字, 最後找到 red had 的 ovmf 白皮書, 裡面 Example qemu invocation 章節有範例就照著用了。

需要 ovmf.fd 這個檔案, debian 有 ovmf 可以用 apt 裝, 裝好後會在 /usr/share/ovmf/OVMF.fd 。 好像使用時會讀寫,要有寫入權限; 白皮書是複製一份,然後讀寫複製的那份。

裡面用到 -drive if=pflash,file=OVMF.fd 這個選項, 可以用 -pflash OVMF.fd 代替。 drive 好像是定義一個裝置, 很多選項都可以視為 drive 的簡寫。

qemu-system-x86_64 -enable-kvm -snapshot \
                   -m 1G \
                   -hda /dev/sda \
                   -pflash /usr/share/ovmf/OVMF.fd \
                   -net none

最後寫成一個 shell script, 免得每次都要打一堆選項麻煩,也省得忘記。 這裡可以直接用 /usr/share/ovmf/OVMF.fd 是因為我開了 snapshot 選項, 對 OVMF.fd 不會直接寫入,也只會寫入暫存檔。

但不知道為什麼我開機後是直接進 windows。 我有裝 grub,應該會先進 grub, 然後有選單可以進 debian 或 windows。 沒有仔細研究,總之不想管。