KVMのメモ

ゲストのCPU一覧を出すワンライナー

    for guest in $(LC_ALL=C virsh list |awk '{print $2}'| sort |grep -vE "Name|^$") ; do echo -ne "${guest}\n "; virsh dumpxml ${guest} |grep vcpu |sed -e "s/.*'>//" -e "s/<\/.*//" ; done

見やすくすると下記のようなスクリプト

for guest in $(LC_ALL=C virsh list |awk '{print $2}'| sort |grep -vE "Name|^$") ; do
  echo -ne "${guest}\n "
  virsh dumpxml ${guest} |grep vcpu |sed -e "s/.*'>//" -e "s/<\/.*//"
done

ゲストのメモリ一覧を出す

    for guest in $(LC_ALL=C virsh list |awk '{print $2}'| sort |grep -vE "Name|^$") ; do echo -ne "${guest}\n ";  echo "$(virsh dumpxml ${guest} |grep memory |sed -e "s/.*KiB'>//" -e "s/<\/.*//")/1024/1024" | bc ; done

見やすくすると下記のようなスクリプト

for guest in $(LC_ALL=C virsh list |awk '{print $2}'| sort |grep -vE "Name|^$") ; do
  echo -ne "${guest}\n "
  echo "$(virsh dumpxml ${guest} |grep memory |sed -e "s/.*KiB'>//" -e "s/<\/.*//")/1024/1024" | bc
done

AMDのサーバでGPUの仮想化を行おうとしたが、チップセットが対応していない

これはかなり古い話

M/BのチップセットがGPU統合型タイプだったのでIOMMU, GPU パススルー機能でゲストに渡せないか? と考えたがM/Bの機能が足りなかった

AMD AMD-Vi

AMD880G だと思われるが、AMD-Viが使えない

Virgil 3D というGPUの共有機能もあるが、Windowsでは使えない

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0592 Linuxゲストであれば可能だが、Windowsでは使えない

Virgil 3Dプロジェクトによって,このQEMU/KVM上で3Dアクセラレーションに対応した仮想GPUを作成・利用できるようになりました。
Virgil 3Dでは準仮想化デバイスのフレームワークである「virtio」を利用して仮想GPUを構築し,
ゲストOSはMesaのvirglドライバーを利用してこの仮想GPU向けに描画命令を送ります。
それに対してホスト上のQEMUはvirtio-gpuで受け取った命令を,virglrendererというコンポーネントがホスト上のGPUに対してOpenGL命令として発行するわけです。
※ 3
ゲストOSにWindowsを使いたい場合も,Virgil 3Dは利用できません。これはWindows側のドライバーをvirtio-gpuに対応させる必要があるためです。

windows版の Virgil 3D プロジェクトを見ると記述がある が、実際にはまだ全然動いてなさそう https://wiki.archlinux.org/index.php/QEMU/Guest_graphics_acceleration#Virgil3d_virtio-gpu_paravirtualized_device_driver

Windows7ゲストの構築

KVM Windows7にvirtioドライバの適用

ディスクは問題なく認識したが、エラーが表示され、OSのインストールに進めることができなかった。 ここによれば、0x80300001のエラーは必ず出るのと、virtio scsi controller ドライバを適用するには、 IDEデバイスなストレージでOSのインストール後に、OS上でvirtioドライバを適用し、 その後Offlineな状態でvirt-managerやguestのxmlファイルを直接編集するなどして、IDEデバイスをvirtioデバイスに変更するしかないようです。 この0x80300001は何を表しているんだろ。「Windows is unable to install to the selected location」、 ビル君に教えてもらいたいなぁと思って、Googleで検索してみたら、 単にWindowsのインストールDVDがドライブに入ってないとき出るメッセージだということが分かりました。 確かにKVM上でドライバのisoのイメージを読み込んでから再度OSのisoを読み込ませていない。。。。汗 virt-managerからvirtioのイメージを切り離し、再度Windows7のisoをIDE-CDROMとして接続させたところ、今度はうまく行った!

|本家サイトでのWindows7でのHDDドライバの説明

参考

KVM に Windows 7 (64-bit) をインストール + VirtIO 化 - Kenichi Maehashi’s Blog

インストール方法の流れ

インストール時に VirtIO ディスクに Windows 7 をインストールすることはできない(エラー 0x8030001)ので、 IDE ディスク + ダミーの VirtIO ディスク(容量は小さくて OK)という構成でインストールし、 VirtIO ディスクドライバを Windows に認識させ、 その後ダミーディスクの削除と IDE ディスクを VirtIO ディスクに変更する手順を行います。

ドライバダウンロード

http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/

2013/02/07時点で 0.1-52が最新

  • ダミーディスクの追加 virtioにすること
  • Administratorでログイン(ドライバインストールを行なうため)
  • ダミーディスクはSCSIコントローラーに接続されている -「ほかのデバイス」->「SCSIコントローラー」をクリック
  • ドライバーの更新をクリック
  • コンピューターを参照してドライバーソフトウェアを検索します
  • virtioのドライバーが入ったisoイメージを指定
    • ゲストが32bitか64bitなのかでドライバが異なるのでWindowsに認識させる。
  • インストール
    • Red Hat,Inc.からのソフトウェアは信頼することにする(必須ではない)
  • インストール完了
  • ネットワークインターフェースのデバイスモデルを変更
  • ゲストOSを起動するとイーサネットコントローラーの認識ができてない
  • イーサネットのドライバのインストール
  • 不要なダミーHDDを削除
  • メインのHDDのバスを「IDE」->「Virtio」に変更
  • ゲストが起動していないと思われる場合

ホストに設定されているゲストの一覧

ls /etc/libvirt/qemu | grep xml

稼働中のゲストの一覧

virsh list

ゲストの起動

virsh start [ゲスト名]

※ ここではゲスト名とする。xml等はつけない。

なにか高負荷になっている場合

高負荷なゲストを特定する

top -c
上位のプロセスのPIDをメモ

どのゲストが重くなっているのか特定

ps -ef |grep [上のPID]
「-name」の所にゲスト名がある。

対象ゲストにtelnetログイン、ボトルネックを探る

ログインできなかった場合、シリアルコンソール経由でのログインを試みる

様々な理由でtelnetログインできない場合がある。

  • ネットワークインターフェースがダウンした
  • Disk I/Oエラー
  • swapを使い切っている状態
  • カーネルパニック シリアルコンソールにログインすると、原因が分かる可能性がある。

ログインするには仮想化ホストにログインしたのち

virsh console [ゲスト名]

ログインできなかった場合は強制シャットダウンを試みる。

強制シャットダウン

telnet、あるいはシリアルコンソール経由でログインできた場合は、ゲストOS内部からシャットダウンを行う事で、データはHDDにflushされ、正常にunmountされることになる。 が、うまくログインできず、かつ強制シャットダウンしたいケースもある。 その場合は下記のように行う。

virsh destroy [ゲスト名]

ネットワークブリッジ

『KVM徹底入門』P157に仮想化用のブリッジ設定の記載例がある。

あとStray Penguin - Linux Memo (KVM)にもある

インターフェースのオプション /etc/sysconfig/network-script/ifcfg-eth* 設定項目 — server-memo.net

ifcfg-br0

  • ブリッジインターフェース側にはMACアドレスは書かないこと。

  • ブリッジ側設定には『DELAY=0』を加える事、これがないとゲストOSのPXEブートで失敗する。

  • ブリッジ側、eth側ともに『NM_CONTROLLED=no』を加える事。これは既存のnetwork-managerというデーモンがブリッジに対応していない事に対する対応なので将来的には変わる可能性がある。

    Broadcom Corporation NetXtreme II BCM5708 Gigabit Ethernet

DEVICE="br0"
TYPE=Bridge
ONBOOT="yes"
DELAY=0
NM_CONTROLLED=no
BOOTPROTO="static"
IPADDR="203.0.113.63"
NETWORK=203.0.113.0
NETMASK="255.255.255.0"
BROADCAST=203.0.113.255

ifcfg-eth0

IPアドレスは書かない。元々のファイルにMACアドレスが記載されていたら記載する(RHEl6から/dev配下の管理がudevに統一されたので、RHEL的には書かなくて良いのかも)

# Broadcom Corporation NetXtreme II BCM5708 Gigabit Ethernet
DEVICE="eth0"
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=no
IPV6INIT="no"
HWADDR=00:1B:78:31:1C:3A

コマンドライン、スクリプト内で自動的に作成する

これは古いような気がする、sedの使いかた程度に捉えること

eth_no="0" && cd /etc/sysconfig/network-scripts && \
mkdir -p /etc/sysconfig/network-scripts/conf_bk && \
cp -p ifcfg-eth${eth_no} conf_bk/ifcfg-eth${eth_no}.`date +%Y%m%d` && \
cp -p ifcfg-eth${eth_no} ifcfg-br${eth_no} && \
sed -i -e "s/eth${eth_no}/br${eth_no}/" -e '3iTYPE=Bridge' -e '4iNM_CONTROLLED=no' -e '5iDELAY=0' /etc/sysconfig/network-scripts/ifcfg-br${eth_no} && \
sed -i -e "3iBRIDGE=br${eth_no}"  -e '/NETMASK.*/d' -e '/IPADDR.*/d'   -e '4iNM_CONTROLLED=no' /etc/sysconfig/network-scripts/ifcfg-eth${eth_no}

Stray Penguin - Linux Memo (KVM)

あとは `service network restart' すればインターフェイスが出来上がる。
ただしひとつだけ注意がある
-- この設定以後、ホストマシンのゲートウェイデバイスは eth0 ではなく br0 になるので、
サーバデーモンなどの設定ファイルでインターフェイス名を指定してあるものは、
eth0 を br0 に書き換えなくてはならない。