2015年2月21日 星期六

五分鐘開始玩 qemu-kvm 虛擬機

用 qemu 模擬器執行阿貴版 finnix 救援光碟 現在的 PC 上面有很多虛擬化技術, 像是 virtualbox、 xen、 vmware、 ... 等等都可以創建虛擬機, 把 guest OS 關在一個視窗裡面獨立執行。 於是你可以在 windows 裡面跑 linux 或反之亦然。 但是如果你只是想測試一下開機光碟或開機隨身碟, 而沒有要把 (關在視窗裡面執行的) guest OS 安裝到硬碟上, 那麼最簡單、 最不囉嗦的方式就是使用 qemu: 一個指令啟動, 免設定! 以下假設你的電腦用 debian linux 開機, 並且硬碟裡已經有一個 xyz.iso 的光碟映像檔 -- 例如 阿貴版 finnix 救援光碟。 [2/26 更新: 或直接用 ckhung15c 版之後的阿貴版 finnix 開機也可以。 請把所有 kvm ... 指令改成 qemu-system-x86_64 -enable-kvm ... 然後你就可以玩 虛擬機俄羅斯套娃]

Windows 用戶請先檢查你的 windows 是 32 bit 還是 64 bit: win7 / win8 然後下載 windows 版 qemu。 但是在 windows 底下, qemu 無法使用 svm/vmx 加速功能。

以下假設讀者使用的是 debian linux。 iso 檔已經下載完畢了嗎? 計時開始。

首先測試一下你的 cpu 是否支援硬體虛擬化: egrep --color=auto 'svm|vmx' /proc/cpuinfo 如果有看到 svm, 那麼你擁有一顆支援硬體虛擬化的 amd cpu; 如果有看到 vmx, 那麼你擁有一顆支援硬體虛擬化的 intel cpu。 總之, 你可以安裝 qemu-kvm 套件: apt-get install qemu-kvm 。 (詳見 howtogeek 文章)

如果都沒有... 那就哭吧。 還是可以用 qemu 跑虛擬機, 但速度會超慢。 請把以下的 kvm ... 指令全部改成 qemu-system-x86_64 ... (模擬 64bit 機器) 或 qemu-system-i386 ... (模擬 32bit 機器)

以下是我自己最常用的命令列參數及控制鍵。

不必任何設定, 直接下: kvm -cdrom xyz.iso 開機完成, 進入先前下載的免安裝 live CD。 看! 沒超過五分鐘, 對吧? 進入之後, 網路會自動連線。 根據 官網文件, ping 指令失效, 但其他諸如瀏覽下載都正常。 如果不小心滑鼠被 guest 吃掉了, 按 ctrl-alt 可以逃離。 (其實 qemu 視窗最上面有提示。)

啟動 guest 的同時, 可以保留一個下指令的命令列: kvm -monitor stdio -cdrom xyz.iso 這個命令列叫做 qemu-kvm 的 monitor。 我最常用的指令是 sendkey。 比方說如果 guest 當在圖形介面底下, 或圖形介面亂掉, 這時可以從 qemu-kvm 的 monitor 下這個指令: sendkey ctrl-alt-f3 切換到 vt3 (第三個 虛擬終端機 virtual terminal), 再下 sendkey ctrl-alt-delete 可以正常關機並且重新啟動 guest。 更多 qemu monitor 的指令請見 「使用 monitor command 监控 QEMU 运行状态」 wikibooks。 又, 如果啟動時沒有加上 「-monitor stdio」 的選項, 後來才想到要用, 也可以在虛擬機視窗底下按 「ctrl-alt-2」 切換至 monitor。 下完 qemu 的指令之後, 按 「ctrl-alt-1」 就切換回虛擬機。

Qemu 預設模擬 cirrus 顯示卡 (詳見 man qemu-system) 某些狀況下, linux 的 live CD 無法進入圖形介面 (我遇過 antix 跟 puppy linux 都是可以進入文字虛擬終端機,但無法進入圖形介面)。 這時可考慮改模擬不同的顯示卡, 例如 virtio 或 VGA 等等。 詳見 man qemu-system-i386 。 我喜歡用 -vga virtio 因為進入 guest 之後可以下 arandr 任意修改解析度。 另外, 預設只配給每部虛擬機 128MB 的記憶體, 完全不夠用。 [2023/08/08] 以下是我用來啟動 32bit 版 antiX 22 的命令列: qemu-system-i386 -enable-kvm -monitor stdio -vga virtio -m 2048 antiX-22_386-full.iso

如果手邊有開機隨身碟的話, 也一樣。 請先下: fdisk -s /dev/sd?, 然後插入開機隨身碟, 再下一次 fdisk -s /dev/sd?, 比較兩次的差異, 就可看出這顆隨身碟的代號。 (注意! 等一下要給虛擬機用, 所以 不可以 把隨身碟掛載起來!) 假設它叫做 /dev/sdx。 那麼可以拿它來開啟虛擬機: kvm -monitor stdio /dev/sdx警告! 玩完了, 要記得從 guest 裡面正常關機。 如果直接關掉視窗, 就等同於暴力關機, 可能會傷害隨身碟上的作業系統。

也可以讓 qemu 同時看到光碟跟隨身碟, 這樣可以從光碟開機、 把作業系統安裝到隨身碟上: kvm -monitor stdio -m 1024 -cdrom xyz.iso -boot order=dc /dev/sdb 。 這裡的 "-boot order=dc" 意思是先試著從 d: (光碟機) 開機, 其次再試著從 c: (被當成硬碟的隨身碟) 開機。 例如, 你可以用這個方式練習 安裝 Debian 8.0 Jessie RC1。 注意: 安裝在隨身碟上、 未經進一步調校的作業系統, 只適合拿來短暫實驗。 如果拿來每天使用, 有可能因為寫入過於頻繁而導致隨身碟毀壞。

不小心把視窗拉變形了嗎? (太胖或太瘦) 按 ctrl-alt-u 可以按照 guest 的解析度恢復正常大小。

滑鼠不能動嗎? qemu-kvm 預設的 ps2 滑鼠模擬有時會出問題。 啟動時請多加一段: -usbdevice mouse 改成模擬 usb 滑鼠試試看。

guest 的視窗好像不夠大, 不論如何放大縮小, 最上面或最下面會有一橫列的畫面看不見嗎? 試著把 guest 的解析度改成 1280x720 看看。 詳見 這篇

你也可以在硬碟上挖一個檔案作為硬碟映象檔拿來給虛擬機用, 這樣就沒有寫入過於頻繁的問題。 詳見 用 qemu-img 與 qemu-nbd 管理 qcow2 虛擬硬碟

我在我的 root 的 .bashrc 裡面加了這兩句:

alias mykvm='kvm -monitor stdio -redir tcp:8022::22 -m 1024 -vga std -cpu host -usbdevice mouse'
alias myfkvm='mykvm -cdrom /x/cdrom/finnix-ckhung16c.iso -boot order=dc'

這樣以後命令列就不必打那麼長了。

現在再回頭看 「android-x86 在電腦裡面玩平板」 是不是更簡單一些了呢?

進一步推薦閱讀:

  1. 虛擬機器-QEMU簡介
  2. 很長的官網文件
  3. man qemu-system

[2021/8/9] kvm 指令很適合測試 live CD 這樣一次性的工作; 如果需要長期使用一部虛擬機, 或是需要把虛擬機拉到 host 層級的 LAN, 這些情況我現在都改用 virt-manager 比較方便。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。