さて,何はともあれまずは動かしてみましょう. 私は,X60s,i386,GentooLinuxで検証しています.えらく古い環境です が,VTは動くので検証する分には問題ありません.
まずはソースコードを入手します.Githubからリポジトリをcloneするの が一番簡単です.
$ cd ~/
$ git clone https://github.com/penberg/linux-kvm.git
linux-kvm/tools/kvmに移動してmakeしましょう.
$ cd linux-kvm/tools/kvm
$ make
とりあえず動かすために,linux-0.2のディスクイメージを使います.ダ ウンロードして展開しておきます.
$ wget http://wiki.qemu.org/download/linux-0.2.img.bz2 && bunzip2 linux-0.2.img.bz2
kvm-toolsではディスクイメージとは別にカーネルイメージが必要です. ホストマシンで使っているカーネルイメージを使ってもいいでし, linux-kvm用に作ってもいいですね.その際, カーネルは以下の設定が有効になっている必要があります.
- デフォルトコンソール出力
- CONFIG_SERIAL_8250=y
- CONFIG_SERIAL_8250_CONSOLE=y
- 32ビットのイメージを62ビットのホストで動かす
- ディスクイメージで使っているファイルシステム(例: 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で使う) 疑似仮想化ブロックデバイス向けの仮想ブロックデバイスドライバら しいです.
- virtio-netデバイス([–network, -n] virtio): 仮想ネットワークドライバ.
- virtio-9pデバイス(–virtio-9p):
- CONFIG_NET_9P=y
- CONFIG_NET_9P_VIRTIO=y
- CONFIG_9P_FS=y
- virtio-balloonデバイス(–balloon): 動的メモリ割当のためのメモリドライバで,これがあるとゲストに割 り当てるメモリを動的に変更できる.
- virtio-consoleデバイス(–console virtio):
- virtio-rngデバイス(–rng):
- CONFIG_HW_RANDOM_VIRTIO=y
カーネルを用意できたら,後は起動するだけです.今回は,linux-kvm内 でビルドしたカーネルを使っています.
$ ./kvm run -k ~/linux-kvm/arch/i386/boot/bzImage -d linux-0.2.img
# kvm run -k /home/takaishi/linux-kvm/arch/i386/boot/bzImage -m 320 -c 2 --name guest-632
Decompressing Linux... Parsing ELF... done.
Booting the kernel.
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Linux version 3.0.0-rc5+ (takaishi@localhost) (gcc version 4.5.3 (Gentoo 4.5.3-r1 p1.0, pie-0.4.5) ) #3 SMP Wed Dec 7 14:39:03 JST 2011
[ 0.000000] BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: 0000000000000000 - 000000000009fc00 (usable)
[ 0.000000] BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
[ 0.000000] BIOS-e820: 00000000000f0000 - 00000000000fffff (reserved)
[ 0.000000] BIOS-e820: 0000000000100000 - 0000000014000000 (usable)
[ 0.000000] bootconsole [earlyser0] enabled
...
[ 1.543773] VFS: Mounted root (ext2 filesystem) on device 253:0.
[ 1.545773] Freeing unused kernel memory: 432k freed
[ 1.548772] Write protecting the kernel text: 6504k
[ 1.550772] Write protecting the kernel read-only data: 2184k
[ 1.964708] mount used greatest stack depth: 6132 bytes left
Linux version 3.0.0-rc5+ (takaishi@localhost) (gcc version 4.5.3 (Gentoo 4.5.3-r1 p1.0, pie-0.4.5) ) #3 SMP Wed Dec 7 14:39:03 JST 2011
QEMU Linux test distribution (based on Redhat 9)
Type 'exit' to halt the system
sh-2.05b# ls
20thfull.mp2 nbench
sh-2.05b# df
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 19827 17136 1667 92% /
/dev/root 19827 17136 1667 92% /
sh-2.05b# ps
[ 20.218915] ps[761]: segfault at b7845000 ip b783e737 sp bf9511a0 error 4 in libproc.so.2.0.11[b7837000+a000]
Segmentation fault
VMを終了するには,kvm stopを使います.その際に,VMの名前を指定す るのですが,これはkvm listで確認することができます.
$ ./kvm list
パスワード:
PID NAME STATE
------------------------------------
632 guest-632 running
$ ./kvm stop -n guest-632
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のディレイをミリ秒で指定