2015年3月10日 星期二

qemu-kvm 如何啟動單一分割?

在學會使用 LVM 之前, 我的電腦切了十幾個分割, 每個分割各自裝一個不同版本的 linux :-) 經常會需要 「在甲分割工作; 在乙分割做實驗」。 以前都是重新開機, 或是桌機工作、筆電實驗, 總之很麻煩。 現在學會用虛擬機了, 當然就想要 「甲分割開機工作; 用 qemu-kvm 啟動乙分割做實驗」 比較簡單。 以下用隨身碟實驗好了, 比較安全。

為簡化指令, 假設你已按照 五分鐘開始玩 qemu-kvm 虛擬機 設定好: alias mykvm='kvm -monitor stdio -m 1024 -vga std' 。 以下幾種狀況, qemu-kvm 的指令都很簡單:

  1. 啟動一整顆硬碟或隨身碟: mykvm /dev/sdz
  2. 啟動 LVM 的一個 volume: 如果這個 volume 上面已安裝某個開機管理員, 例如 extlinux, 而且 extlinux.conf 設定檔內以 ROOT=UUID=xxxx 的方式指定 root 分割, 那麼也可以直接啟動: mykvm /dev/mapper/abc-xyz
  3. 啟動一個光碟映像檔: mykvm finnix-ckhung15c.iso

至於啟動一個分割, 單單這樣下是不行的: mykvm /dev/sdz99。 即使在 /dev/sdz99 上面安裝 extlinux 開機管理員 也沒用, 會出現 「Booting from Hard Disk... Boot error」。 別人跟我有相同的需求: [feature request] Partition table wrapper for single-filesystem images 雖然被否決掉, 但從那裡看見一個超級有用的連結: using any real partition as the single primary partition of a hard disk image。 Archlinux 團隊的文件真是太讚了啊!

原來 qemu-kvm 的命令列可以直接當 boot loader 來用: mykvm -kernel vmlinuz -initrd initrd.img -append 'root=/dev/sda' /dev/sdz99 基本上就是把你的 extlinux 設定檔 (或其他開機管理員的設定檔) 的內容直接抄到 qemu-kvm 的命令列上面來。 其中 vmlinuz 跟 initrd.img 當然要事先從隨身碟上拷貝出來, 因為要用虛擬機啟動 /dev/sdz99 之前, 必須先把它卸載 (umount) 下來。 不管你的隨身碟是 /dev/sdx 還是 /dev/sdz, 在虛擬機裡面看起來, 它就是 /dev/sda (除非你同時拿兩三個分割給虛擬機) 所以要寫 root=/dev/sda 。 開機時經過心驚膽顫的十秒鐘 「booting from ROM」 卡機, 然後就成功了!

同樣的方法也適用於 loopback file system, 或是未安裝開機管理員的一個 LVM volume。 還有 以 zfs 作為根目錄的系統 或是 zfs 的一個 zvol 也可以採同樣的方式啟動 -- 例如你可以 把不支援 zfs 的 32 bit linux 裝到 zvol 裡面去 以便享用 zfs 快照功能。

沒有留言:

張貼留言

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