Linux Native KVM Toolsを使ってみよう

少しずつ認知され始めたLinux Native KVM Tools(NLKT)を使ってゲス トを起動する方法について解説します.この記事は,カーネル/VM Advent Calendar : ATNDの11日目です.

Linux Native KVM Toolsとは?

今広く使われているKVMは,QEMUを用いたものですが,Linux Native KVM Tools(以下LNKT)は,QEMUを使わず1から書いたVMMです.またカーネルの メインラインにはマージされていませんが,近い内にマージされるよう です.Github上(penberg/linux-kvm – GitHub)で開発が行われています.

使ってみる

さて,何はともあれまずは動かしてみましょう. 私は,X60s,i386,GentooLinuxで検証しています.えらく古い環境です が,VTは動くので検証する分には問題ありません.

まずはソースコードを入手します.Githubからリポジトリをcloneするの が一番簡単です.

linux-kvm/tools/kvmに移動してmakeしましょう.

とりあえず動かすために,linux-0.2のディスクイメージを使います.ダ ウンロードして展開しておきます.

kvm-toolsではディスクイメージとは別にカーネルイメージが必要です. ホストマシンで使っているカーネルイメージを使ってもいいでし, linux-kvm用に作ってもいいですね.その際, カーネルは以下の設定が有効になっている必要があります.

  • デフォルトコンソール出力
    • CONFIG_SERIAL_8250=y
      • CONFIG_SERIAL_8250_CONSOLE=y
  • 32ビットのイメージを62ビットのホストで動かす
    • CONFIG_IA32_EMULATION=y
  • ディスクイメージで使っているファイルシステム(例: CONFIG_EXT2_FS, CONFIG_EXT4_FS) linux-0.2.imgを使う場合はCONFIG_EXT2_FSを有効にする.
  • virtioデバイス
    • CONFIG_VIRTIO=y
    • CONFIG_VIRTIO_RING=y
    • CONFIG_VIRTIO_PCI=y
  • virtio-blkデバイス(–disk, -dで使う) 疑似仮想化ブロックデバイス向けの仮想ブロックデバイスドライバら しいです.
    • CONFIG_VIRTIO_BLK=y
  • virtio-netデバイス([–network, -n] virtio): 仮想ネットワークドライバ.
    • CONFIG_VIRTIO_NET=y
  • virtio-9pデバイス(–virtio-9p):
    • CONFIG_NET_9P=y
    • CONFIG_NET_9P_VIRTIO=y
    • CONFIG_9P_FS=y
  • virtio-balloonデバイス(–balloon): 動的メモリ割当のためのメモリドライバで,これがあるとゲストに割 り当てるメモリを動的に変更できる.
    • CONFIG_VIRTIO_BALLOON=y
  • virtio-consoleデバイス(–console virtio):
    • CONFIG_VIRTIO_CONSOLE=y
  • virtio-rngデバイス(–rng):
    • CONFIG_HW_RANDOM_VIRTIO=y

カーネルを用意できたら,後は起動するだけです.今回は,linux-kvm内 でビルドしたカーネルを使っています.

VMを終了するには,kvm stopを使います.その際に,VMの名前を指定す るのですが,これはkvm listで確認することができます.

kvm runには他にもオプションがあり,kvm help runで見ることができま す.残念ながら,筆者の環境と能力では全てのオプションの動作確認を することができませんでした.また,動作したオプションについては別 の記事で紹介する予定です.

  • –name: ゲストの名前
  • -c,–cpus: VMに割り当てるCPU数を指定
  • -m,–mem: VMのメモリサイズ.MBで指定する.
  • –shmem: PCIデバイス経由でホストとゲストが共有するメモリを指定
  • -d,–disk: ディスクイメージまたはrootfsディレクトリを指定
  • –balloon: virtio balloonを有効にする
  • –vnc: VMCフレームバッファを有効にする
  • –sdl: SDLフレームバッファを有効にする
  • –rng: virtio Random Number Generatorを有効にする
  • –9p virtio 9pを有効に.ホストとゲストのファイル共有に用いる.
  • –console 使用するコンソールを指定
  • –dev=: KVMのデバイスファイル
  • –tty: ゲストのTTYをホストのptyにリマップする
  • -k,–kernel=: VM用カーネル
  • -r,–initrd=: initrdのイメージを指定する
  • -p,–params: カーネルに与える追加の引数
  • -n,–network: ゲストNICを作成
  • –no-dhcp: rootfs中ではカーネルのDHCPを無効に
  • –vidmode: Video mode
  • –debug: デバッグメッセージを有効に
  • –debug-single-step: シングルステッピングを有効に
  • -debug-ioport: ioportingデバッグを有効に
  • -debug-iodelay: IOのディレイをミリ秒で指定

Debianのイメージを起動してみる

さて,次はDebianを起動してみましょう.まずは,イメージファイルを ダウンロードします.

さて,このイメージファイルをディスクに指定して起動するのですが, カーネルに引数を与えることに注意します.このイメージファイルは, 内部がパーティションで区切られているため,どのパーティションが rootなのかを指定する必要があるのです.カーネルの引数は-pオプショ ンで指定できます.

起動できました.まだうまくいっていませんが,KVMで作成したディスク 等も起動できそうです.

まだまだ実用的なレベルとは言えませんが,きちんと動いていておもし ろいですね.また,カーネルのデバッグ用途に使えるようなので,こち らについても試したい所です.