KVM 上の Ubuntu 18.04 LTS サーバーに KVM で仮想化環境を構築 (Nested KVM)

KVM で動いている Ubuntu 18.04 の上でさらに KVM を動かして仮想化してみました。

結論から言うと KVM 上で KVM を入れ子にして動作させることはできますが、ものすごくパフォーマンスが悪くなります。

実行環境

サーバー
Network Presence – VALUE SSD VPS #2E
CPU
2コア
メモリー
8GB
ホストOS
Ubuntu Server 18.04.4 LTS
ゲストOS
Ubuntu Server 18.04.4 LTS
パッケージ バージョン
qemu 1:2.11+dfsg-1ubuntu7.26
qemu-kvm 1:2.11+dfsg-1ubuntu7.26
libvirt-bin 4.0.0-1ubuntu8.17
bridge-utils 1.5-15ubuntu1
virt-manager 1:1.5.1-0ubuntu1.2

なんでそんなことするの?

KVM で動いている VPS を借りているのですが、その VPS 上で仮想マシンを動かしたいということです。

実験的に入れるソフトウェアを実験後にきれいに消したり、バックアップやリストアも楽になるので仮想マシンが欲しいのです。

VPS 上で KVM を使うには前提条件としてホストの KVM で入れ子 (Nested) KVM が許可されている必要があります。

入れ子の KVM が利用可能かを調べる

以下のコマンドを実行して 0 より大きい数値が返れば OK です。

$ egrep -c '(vmx|svm)' /proc/cpuinfo

利用可能の場合

$ egrep -c '(vmx|svm)' /proc/cpuinfo
2

例えば、お名前.com の VPS は入れ子の KVM は使えないので0が表示されます。

$ egrep -c '(vmx|svm)' /proc/cpuinfo
0

kvm-ok ユーティリティで KVM のハードウェア高速化がサポートされているかを確認します。まずは、 cpu-checker をインストールします。

$ sudo apt update
$ sudo apt install cpu-checker

sudo kvm-ok で以下の表示が出れば OK です。

$ sudo kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

サポートされていない場合は以下の表示になります。

$ sudo kvm-ok
INFO: Your CPU does not support KVM extensions
KVM acceleration can NOT be used

必要なパッケージをインストール

apt で KVM 構築に必要なパッケージをインストールします。

$ sudo apt update
$ sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virt-manager

必要なパッケージをインストール

apt でパッケージをインストール。大量の依存パッケージもインストールされます (自分の環境では100個以上)。

ネットワークブリッジの作成

KVM のゲストマシンに外部からアクセスするためにはネットワークをブリッジする必要があります。/etc/netplan/ にある netplan の設定ファイルを変更して、インターネットに接続されているインターフェースの IP アドレスをブリッジに割り当てます。

変更前

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses: [100.200.254.127/24]
      gateway4: 100.200.254.254
      nameservers:
        addresses: [100.200.1.1,100.200.1.2,1.1.1.1,8.8.8.8]

変更後

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no

  bridges:
    br0:
      interfaces: [eth0]
      dhcp4: no
      addresses: [100.200.254.127/24]
      gateway4: 100.200.254.254
      nameservers:
        addresses: [100.200.1.1,100.200.1.2,1.1.1.1,8.8.8.8]

設定ファイルの内容を適用します。

$ sudo netplan apply

ネットワークの設定で問題が起きた場合は、以下のコマンドでデバッグ情報を表示できます。

$ sudo netplan --debug  apply

ネットワークブリッジの状態を確認します。State が routable になっていれば OK です。

$ sudo networkctl status -a
● 3: br0
       Link File: n/a
    Network File: /run/systemd/network/10-netplan-br0.network
            Type: ether
           State: routable (configured)
      HW Address: 00:00:00:00:00:00
         Address: 100.200.254.127
                  ffff::ffff
         Gateway: 100.200.254.254
             DNS: 100.200.1.1
                  100.200.1.2
                  1.1.1.1
                  8.8.8.8

Windows 10 から Cygwin を使って qemu+ssh で virt-manager にアクセス (失敗)

Windows に Cygwin をインストールして virt-manager にアクセスしようとしましたが失敗しました。どうやら Cygwin の virt-manager が古すぎて正常にインターフェースを描画できないようです。

接続手順

Cygwin に以下のパッケージをインストールします。

  • virt-manager
  • xorg-server
  • xinit
  • openssh
  • gnome-ssh-askpass

以下のスクリプトを Cygwin の .bashrc に追加します。

if [[ -z "$DISPLAY" ]] 
then
    DISPLAY=":0" 
    export DISPLAY 
fi

以下のコマンドで接続します。

$ startxwin -- -listen tcp &
$ virt-manager -c 'qemu+ssh://username@hogepiyo.com:22/system?keyfile=~/.ssh/ssh_key'

問題点

  • インターフェースで表示されない選択肢がある
  • 仮想マシンを作成して起動できるが画面が真っ暗

Ubuntu 18.04 から qemu+ssh で virt-manager にアクセス

接続手順

クライアントの Ubuntu に必要なパッケージをインストールします。

$ sudo apt install virt-manager ssh-askpass-gnome

以下のコマンドで接続します。

$ virt-manager -c 'qemu+ssh://username@hogepiyo.com:22/system?keyfile=~/.ssh/ssh_key'

秘密鍵のパスワードを聞かれるので入力します。

開いた画面から仮想マシンの作成と管理が行えます。

問題点

  • 仮想マシンを作成して起動できるが画面が真っ暗

起動中の仮想マシンに Spice でリモートアクセス

qemu+ssh で virt-manager にアクセスすれば仮想マシンの管理は行えるので、起動後は仮想マシンを spice プロトコルで操作することにしました。

仮想マシンに接続できるポートを外部に公開したくないので SSH のポートフォワーディング機能を使います。仮想マシンの画面描画用のポート (デフォルトで5900) をクライアント側へフォワードします。

画面描画用のポートは virt-manager で確認できます。

Virtual Machine Manager で対象の仮想マシンをダブルクリックします。

メニューから ViewDetails を開きます。

Display SpicePort を確認します。

以下のコマンドでサーバーのポートをローカルにフォワードします。

$ ssh -p 22 -i ~/.ssh/ssh_key -L 5900:127.0.0.1:5900 username@hogepiyo.com -N
-p
SSH ポートの指定 (22の場合は省略可能)
-i
秘密鍵のパス
-L
ポートフォワード設定 (5900 がローカル側 127.0.0.1:5900 がサーバー側)
-N
接続後コマンドを実行せずに待機

クライアントの Ubuntu のアプリケーションメニューから Remote Viewer を開きます。

接続先に “spice://localhost:5900” を指定して接続します。

接続後は仮想マシンを操作できます。

接続方法のまとめ

GUI を使用して管理したい場合は以下の方法で管理します。

  • 仮想マシン管理: クライアント Ubuntu からサーバーの virt-manager に qemu+ssh で接続
  • 仮想マシン操作: クライアント Ubuntu からサーバーで起動中の仮想マシンに SSH ポートフォワード経由で spice で接続

海外のフォーラムで推奨されていたのは以下の方法でした。

  • 仮想マシン管理: サーバーに SSH でアクセスし virsh コマンドを使用する
  • 仮想マシン操作: クライアント Ubuntu からサーバーで起動中の仮想マシンに SSH ポートフォワード経由で spice で接続

参考

コメントを残す

メールアドレスが公開されることはありません。