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 で対象の仮想マシンをダブルクリックします。
メニューから View → Details を開きます。
Display Spice → Port を確認します。
以下のコマンドでサーバーのポートをローカルにフォワードします。
$ 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 で接続