-->

2010-06-26

kvmのインストール

http://en.gentoo-wiki.com/wiki/KVM
http://www.linux-kvm.com/content/using-ksm-kernel-samepage-merging-kvm
http://foamy-capriccio.seesaa.net/article/109941507.html

まず無い場合はkernelに設定を追加します。
(例) それっぽい文字を探します。
$ find /lib/modules/*/ -type f -iname '*.o' -or -iname '*.ko' -ls|grep -i kvm

無い場合、設定を変えて再インストールします。
この例の場合genkernelを利用していますがmenuconfigの部分は同じです。
menuconfigは/で検索できます。
$ sudo genkernel --menuconfig all

[*] Virtualization  --->
<*>   Kernel-based Virtual Machine (KVM) support # ここは<M>でOK
<*>     KVM for AMD processors support           # ここは<M>でOK。CPU毎に異なる。無くても良い。

Device Drivers  --->
[*] Network device support  --->
<M>   Universal TUN/TAP device driver support

-*- Networking support  --->
Networking options  --->
<*> 802.1d Ethernet Bridging
<M> 802.1Q VLAN Support

# いらない?複数のゲストOSを動かす場合に有効な共有メモリ?
Processor type and features  --->
[*] Enable KSM for page merging

/dev/kvmが無いので、モジュールだとダメなのかと思い<*>に変えてインストールしましたがダメでした。
BIOSが原因でした。
$ dmesg | grep kvm
kvm: disabled by bios

マザーボードに依存する。
MA78GM-DS2HPの場合
起動時にDEL
Advanced BIOS Features
Virtualization [Disabled] => [Enabled]
Save & Exit Setup => Y

kernelの設定が成功の場合
$ ll /dev/kvm
crw-rw---- 1 root kvm 10, 232 2010-06-24 10:40:32 /dev/kvm

ここがMだと
<M>   Kernel-based Virtual Machine (KVM) support
<M>     KVM for AMD processors support
/etc/modules.autoload.d/kernel-2.6 などに
kvm-amdなどを書くと起動時に有効になります。
ディストリビューション毎に異なる場合が有ります。

手動
$ sudo modprobe kvm-amd

関連するパッケージをインストールします。
$ sudo vi /etc/portage/package.keywords
$ grep -i kvm /etc/portage/package.keywords
app-emulation/qemu-kvm
#$ sudo emerge -av app-emulation/qemu-kvm
$ sudo emerge -uav qemu-kvm usbutils bridge-utils usermode-utilities iptables
$ sudo gpasswd -a ユーザー名 kvm

インストールCDのイメージファイルをダウンロードします。
$ cd /mnt/share/kvm/
$ wget http://ftp.riken.jp/Linux/centos/5.5/isos/x86_64/CentOS-5.5-x86_64-bin-DVD-1of2.iso
$ qemu-img create -f qcow2 centos5.img 20G
$ kvm -hda centos5.img -cdrom CentOS-5.5-x86_64-bin-DVD-1of2.iso -boot d
$ sudo emerge -av net-misc/tigervnc

CentOS-5.5-x86_64-netinstall.iso にしたら途中で止まりました。
なのでDVDのisoファイルをダウンロードしました。
インストール項目のチェックを全部外す場合、CDの1枚目で大丈夫だったかもしれません。
http://ftp.riken.jp/Linux/centos/5.5/isos/x86_64/CentOS-5.5-x86_64-bin-1of8.iso など。

グラフィカルな環境で実行します。無い場合はqemu-kvm(kvm)コマンドでコンソールを指定して繋げると可能かもしれません。
$ vncviewer など (ssvncが接続設定を保存できたので楽かもしれません)
127.0.0.1:5900 を入力

なんだかんだで、centos5が起動したところ、ゲストOSから外にpingが通りませんでした。
OK ping 192.168.0.210 (centos5,ゲストOS)
OK ping 192.168.0.100 (gentoo,ホストOS)
NG ping 192.168.0.1   (ルーター)
NG ping www.example.com (外)

原因は /etc/sysctl.conf に余分な設定があるためでした。
sysctl.confをデフォルトの設定ファイルに戻して修正したところ成功しました。
反映させる場合、デフォルト値がわからない場合はsysctl -pより再起動した方が早いです。
-#net.ipv4.ip_forward = 0
+net.ipv4.ip_forward = 1

他の原因としてはiptablesが有効な場合ブリッジ(br0など)のFORWARDを通す設定が無いかもしれません。
# 追加する
$ sudo iptables -A FORWARD -i br0 -j ACCEPT
# 一旦止める
$ sudo /etc/init.d/iptables stop

セーブする場合、設定ファイルをバックアップすると良いです。
/var/lib/iptables/rules-save
/etc/sysconfig/iptables
など。

起動コマンドの例
$ sudo kvm -hda centos5.img -m 2048 -net nic,macaddr=52:54:00:12:34:56 -net tap,ifname=tap0,script=no,downscript=no &

ネットワークの設定(/etc/conf.d/net)の例
起動時に有効にする場合
bridge_br0="eth0 tap0"
brctl_br0=( "setfd 0" "sethello 10" "stp off" )
depend_br0 ()
{
  need net.eth0 net.tap0
}
config_br0=( "192.168.0.100/24" )
routes_br0=( "default via 192.168.0.1" )
dns_servers_br0="192.168.0.1"
config_tap0=( "null" )
tuntap_tap0="tap"
tunctl_tap0="-u root"
mac_tap0="52:54:00:12:34:56"
config_eth0=( "null" )

/etc/sysctl.conf のコメントアウトした設定の例
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 1

ホストOSの起動時に起動する。キーボードの種類を設定する例
$ /etc/conf.d
$ diff local.start.2010-07-03 local.start
8a9,10
>
> /usr/bin/kvm -k ja -hda /mnt/share/kvm/centos5/centos5.img -m 2048 -net nic,macaddr=52:54:00:12:34:57 -net tap,ifname=tap0,script=no,downscript=no &