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するの が一番簡単です.
$ 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
- CONFIG_SERIAL_8250=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内 でビルドしたカーネルを使っています.
$ ./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のディレイをミリ秒で指定
Debianのイメージを起動してみる
さて,次はDebianを起動してみましょう.まずは,イメージファイルを ダウンロードします.
$ wget http://people.debian.org/~aurel32/qemu/i386/debian_squeeze_i386_standard.qcow2
さて,このイメージファイルをディスクに指定して起動するのですが, カーネルに引数を与えることに注意します.このイメージファイルは, 内部がパーティションで区切られているため,どのパーティションが rootなのかを指定する必要があるのです.カーネルの引数は-pオプショ ンで指定できます.
$ ./kvm run --name test -m 64 -c 1 -k ~/linux-kvm/arch/i386/boot/bzImage -d debian_squeeze_i386_standard.qcow2 -p "root=/dev/vda1"
Warning: Forcing read-only support for QCOW
# kvm run -k /home/takaishi/linux-kvm/arch/i386/boot/bzImage -m 64 -c 1 --name test
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 - 0000000004000000 (usable)
[0.000000] bootconsole [earlyser0] enabled
[0.000000] Notice: NX (Execute Disable) protection missing in CPU!
[0.000000] DMI not present or invalid.
[1.373799] EXT3-fs: barriers not enabled
[1.375799] kjournald starting. Commit interval 5 seconds
[1.377798] EXT3-fs (vda1): mounted filesystem with writeback data mode
[1.379798] VFS: Mounted root (ext3 filesystem) readonly on device 253:1.
[1.381798] Freeing unused kernel memory: 432k freed
[1.383797] Write protecting the kernel text: 6504k
[1.385797] Write protecting the kernel read-only data: 2184k
SELinux: Could not open policy file <= /etc/selinux/targeted/policy/policy.26: No such file or directory
INIT: version 2.88 booting
[1.606763] stty used greatest stack depth: 5928 bytes left
Using makefile-style concurrent boot in runlevel S.
.udev/ already exists on the static /dev! ... (warning).
Starting the hotplug events dispatcher: udevd.
Synthesizing the initial hotplug events...done.
Waiting for /dev to be fully populated...done.
Setting preliminary keymap...done.
Activating swap...[2.913563] Adding 731132k swap on /dev/vda5. Priority:-1 extents:1 across:731132k
done.
Checking root file system...fsck from util-linux-ng 2.17.2
/dev/vda1: clean, 25194/1003680 [3.030545] EXT3-fs (vda1): using internal journal
files, 261172/4010752 blocks
done.
Cleaning up ifupdown....
Setting up networking....
Loading kernel modules...done.
Activating lvm and md swap...done.
Checking file systems...fsck from util-linux-ng 2.17.2
done.
Mounting local filesystems...done.
Activating swapfile swap...done.
Cleaning up temporary files....
Configuring network interfaces...done.
Starting portmap daemon....
Starting NFS common utilities: statd.
Cleaning up temporary files....
Setting console screen modes.
Skipping font and keymap setup (handled by console-setup).
Setting up console font and keymap...[4.786277] dhclient-script used greatest stack depth: 5792 bytes left
done.
Setting kernel variables ...done.
[34.685701] rc used greatest stack depth: 5720 bytes left
INIT: Entering runlevel: 2
Using makefile-style concurrent boot in runlevel 2.
Starting portmap daemon...Already running..
Starting NFS common utilities: statd.
Starting enhanced syslogd: rsyslogd.
Starting ACPI services...RTNETLINK1 answers: No such file or directory
acpid: error talking to the kernel via netlink
.
Starting deferred execution scheduler: atd.
Starting periodic command scheduler: cron.
Starting MTA: exim4.
Debian GNU/Linux 6.0 debian-i386 ttyS0
debian-i386 login: root
Password:
Linux debian-i386 3.0.0-rc5+ #3 SMP Wed Dec 7 14:39:03 JST 2011 i686
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@debian-i386:~# ls /
bin etc lib mnt root srv usr
boot home lost+found opt sbin sys var
dev initrd.img media proc selinux tmp vmlinuz
root@debian-i386:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda1 15791024 792904 14195972 6% /
tmpfs 27364 0 27364 0% /lib/init/rw
udev 10240 148 10092 2% /dev
tmpfs 27364 0 27364 0% /dev/shm
root@debian-i386:~# ps
PID TTY TIME CMD
1593 ttyS0 00:00:00 login
1594 ttyS0 00:00:00 bash
1610 ttyS0 00:00:00 ps
root@debian-i386:~#
起動できました.まだうまくいっていませんが,KVMで作成したディスク 等も起動できそうです.
まだまだ実用的なレベルとは言えませんが,きちんと動いていておもし ろいですね.また,カーネルのデバッグ用途に使えるようなので,こち らについても試したい所です.