[Linux, Cloud] A Simple Guide to Nested KVM Virtualization on Oracle Cloud Infrastructure

原文はこちら。
https://blogs.oracle.com/cloud-infrastructure/nested-kvm-virtualization-on-oracle-iaas

Why KVM Nested Virtualization?

Nested virtualizationを使えば、物理ホストのハードウェアアクセラレーションを使いつつ、仮想マシン(VM)を別のVM内で実行できます。簡単なプロビジョニングプロセスで、エンタープライズや通常のユーザーに対し、ワークロードの要件に基づいて低コストかつ大きな柔軟性を提供します。このエントリでは、Oracle Cloud Infrastructure(OCI)KVMハイパーバイザー仮想マシンの上にKVMゲストをインストール、構成、および使用する手順を紹介します。このプロセスは、Nested KVM Virtualizationとも呼ばれます。

Getting Started

以下は、KVMハイパーバイザーホストとして利用できる現在のシェイプオプションです(注:原文執筆時(2017/10/27)の情報は古いため、最新情報のためにURLに差し替えています)。 環境で使用できる現行のオプションと機能については、Oracle Cloud Infrastructureのパブリック・ドキュメントを参照した後、作業負荷要件に基づいて仮想マシン・シェイプを選択し、プロビジョニングしてから手順をすすめてください。以下はNested KVM Hypervisorに利用可能なインスタンスシェイプの一例です。

* ネットワーク帯域幅はVCN内のトラフィックの予想帯域幅に基づいています。
** Windows VMインスタンスではVNIC1個のみをサポートします。
Oracle Compute Infrastructure - Launching an Instance
https://docs.us-phoenix-1.oraclecloud.com/Content/Compute/Tasks/launchinginstance.htm
Bare Metal Shapes
https://cloud.oracle.com/infrastructure/compute/bare-metal/features
VM Shapes
https://cloud.oracle.com/en_US/infrastructure/compute/virtual-machine/features

Requirements

  • Oracle Linux 7.xを実行する仮想マシンインスタンス(KVMをサポートしている限り、他のLinuxディストリビューションも使用できます)
  • サード・パーティのアプリケーション・ライセンスをOracle Cloud Infrastructureに持ち込む場合、KVM Server Instance上で使用しているサード・パーティのOS/アプリケーション・ベンダーとのライセンス義務を負います
  • ゲストVMのインストールのために、KVM VM OSのISOファイルをKVMサーバインスタンスにアップロードする必要があります
  • 追加のブロックストレージボリュームをNested KVM Serverインスタンスに接続し、KVM VM qcow2ディスクイメージファイルを保持することを推奨します。また、KVM VM qcow2ディスクイメージファイル用に、iSCSIブロックストレージをアタッチせず、NVMeディスク付きのVM.DenseIOシェイプも利用できます。

Installing KVM

KVMハイパーバイザー用に利用する仮想マシンをプロビジョニング後、以下のコマンドを実行して最新のqemuパッケージをvirt-managerと共にインストールします。
$ sudo yum -y install qemu-kvm qemu-img virt-manager libvirt libvirt-python libvirt-client virt-install virt-viewer

Installing VNC and Xorg packages for GUI Remote Connection

以下のコマンドを実行して、VNCとXorgパッケージをインストールします。これらのパッケージを使って仮想マシンのGUIを使ってKVMゲストを管理できます。
$ sudo yum groupinstall "Server with GUI" -y

$ sudo yum install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-utils tigervnc-server -y
vncserver@.serviceを vncserver@:1.serviceにコピーします。
$ cd /lib/systemd/system

$ sudo cp vncserver@.service vncserver@:1.service

$ sudo vi vncserver\@\:1.service
vncserver@1.service のをユーザー名 "opc" に置き換え、vncserver@.serviceで定義済みのopcユーザー用のVNCパスワードを設定します。
### run the following command as opc user

$ vncpasswd

Password:

Verify:

$ exit
VNC接続を許可するようfirewallサービスを構成します。
$ sudo firewall-cmd --permanent --zone=public --add-service vnc-server
再起動時に自動起動するようにVNCサービスを有効化します。
$ sudo systemctl daemon-reload

$ sudo systemctl enable vncserver@:1.service

$ sudo systemctl start vncserver@:1.service

Preparing the KVM Server for IOMMU Passthrough and Nested Virtualization

Nested KVMサーバーを実行するには、まず仮想NICのパススルー(IOMMU)オプションを使用する機能を有効にした上で、Nested VMハイパーバイザーでNested KVMを有効化する必要があります。
How to assign devices with VT-d in KVM
https://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM
Oracle Linux 7.xのNested KVM仮想マシンインスタンスでは、以下の操作をします。
### Backup Grub File

$ sudo cp /etc/default/grub /etc/default/grub.bck

### Edit grub and include the following opitons

$ sudo vi /etc/default/grub

### Append the following parameters in GRUB_CMDLINE_LINUX line

intel_iommu=on  kvm-intel.nested=1

### Below is an example of how grub file should look like:

$ sudo cat /etc/default/grub |grep CMDLINE

GRUB_CMDLINE_LINUX="crashkernel=auto LANG=en_US.UTF-8 console=tty0 console=ttyS0,9600 rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0 ip=dhcp netroot=iscsi:169.254.0.2::::iqn.2015-02.oracle.boot:uefi iscsi_param=node.session.timeo.replacement_timeout=6000 intel_iommu=on kvm-intel.nested=1"
保存してviを終了してから、以下のコマンドを実行します。
### Enable tuned

$ sudo systemctl enable tuned

$ sudo systemctl start tuned

$ sudo tuned-adm profile virtual-host

### Recreate grub to validate all the changes

$ sudo cp /boot/efi/EFI/redhat/grub.cfg /boot/efi/EFI/redhat/grub.cfg.orig

$ sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
Using the OCIコンソールを使い、仮想クラウドネットワークセキュリティリストを編集し、(利用中のVNCで使っているポートが5901/tcpである場合)5901/tcpを有効化します。環境に応じてVNCポート番号を変更してください。
Source: 0.0.0.0/0

IP Protocol: TCP

Source Port Range: All

Destination Port Range: 5901

Allows: TCP traffic for ports: 5901
OCI Nested KVM VMインスタンスを再起動して、KVMカーネルモジュール、VNCおよびXorgサービスをロードします。 VMがオンラインに戻ったら、vncviewerのようなVNCアプリケーションを使用してKVM VMハイパーバイザーインスタンスに接続します。
RealVNC Viewer
https://www.realvnc.com/en/download/viewer/
Screen Shot 2017-08-04 at 4.28.09 PM.png

Creating an Oracle Cloud Infrastructure Secondary vNIC

続いてセカンダリvNICを作成し、それをKVM Nested VMインスタンスにアタッチします。このセカンダリvNICは、Nested VMゲストで使用します。OCIダッシュボードを使って、KVM Nested VMインスタンスの詳細をクリックし、[Attached vNIC]を選択し、[Create vNIC]をクリックします。以下の例では、アベイラビリティ・ドメイン1(AD1)でNew-BM-172と呼ばれるVirtual Cloud Network(VCN)を使用しています。

vNIC作成後、以下のような表示が出ます。後で使用するため、MACアドレスとIPアドレス情報を覚えておいてください。
Screen Shot 2017-10-04 at 10.44.13 AM.png

Associating OCI Secondary vNIC with the KVM Guest VM

ゲストをインストールする前に、KVM VM Hypervisorで以下のコマンドを実行します。
$ sudo ip link

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP mode DEFAULT qlen 1000

    link/ether 00:00:17:01:16:5d brd ff:ff:ff:ff:ff:ff

3: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000

    link/ether 00:00:17:01:ce:47 brd ff:ff:ff:ff:ff:ff

4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT

    link/ether 52:54:00:40:76:12 brd ff:ff:ff:ff:ff:ff

5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN mode DEFAULT qlen 500

    link/ether 52:54:00:40:76:12 brd ff:ff:ff:ff:ff:ff
以前の手順で作成したOCIセカンダリvNIC MACアドレスに一致するインターフェイスを特定します。上記のように、インタフェースens4は、KVMゲストのインストールプロセスで使用するインタフェースです。次の手順でKVMゲストVMをプロビジョニングし、上記のvNIC情報を追加します。

Creating a KVM guest instance

コマンドラインまたはグラフィカルツールでKVMを管理できますが、ここでは、GUIツールを中心に説明します。VNCを使用してOCI KVM Hypervisorインスタンスに接続し、gnome-terminalを開いて次のコマンドを実行します。
$ sudo virt-manager
virt-managerを初めて実行する場合、ローカルのQEMU/KVM接続を作成する必要があります。作成完了後、"Create a new Virtual Machine"ボタンをクリックし、図のように必要なオプションに従います。Requirementsの章に記載の通り、OSファイルはまずKVM Nested VMにアップロードする必要があります。SCPコマンドライン(MacまたはLinuxワークステーション)またはwinscp(Windowsワークステーション )を使うなどの方法でアップロードします。OS ISOファイルのアップロードが終了したら、KVM Guestのインストールプロセスを続行します。
Oracle® Linux Administrator's Guide for Release 7
Using scp and sftp to Copy Files Between Systems
https://docs.oracle.com/cd/E52668_01/E54669/html/ol7-s9-openssh.html
WinSCP - Uploading Files
https://winscp.net/eng/docs/task_upload

1- KVM Guestインストールを選択
Screen Shot 2017-08-04 at 4.42.27 PM.png

2- セットアップに基づく情報を選択


3- KVMゲストVM上で利用するサービスワークロードに基づいてメモリやCPU設定を選択


4- ストレージのサイズおよび場所を設定


5- "Customize Configuration before install"を選択していることを確認して、finishをクリック


6- virt-managerのゲスト作成プロセスで追加されたデフォルトのNICをクリックしてPassthrough(パススルー)に変更し、識別したOCIセカンダリvNIC MACアドレスを正しいネットワークインターフェイス名(つまりens4)と一緒に追加します。
Screen Shot 2017-10-04 at 11.15.09 AM.png
7- "Apply"をクリックして"Begin Installation"ボタンをクリックしてからは、通常のOSインストールプロセスに従います。

(注意)インストール中またはインストール後にネットワーク情報を追加する必要があるため、ネットワーク構成として静的IP(上記で作成したセカンダリvNICに基づくIP情報を使用)とDNS(サーバーと検索ドメインオプション)、ゲートウェイIPを設定することをお忘れなく。
Screen Shot 2017-10-04 at 11.19.37 AM.png

Additional Security Recommendations

  • SSHパスワード認証を無効にし、SSH鍵認証を有効にする(/home/opc/.ssh/authorized_keysファイルにssh公開鍵を追加)
  • KVMゲストファイアウォールを有効にしておき、必要なポートだけを開ける
  • KVMゲストVMに定期的にパッチを適用する
  • 可能であればVPNを使用する
  • VNCポートをブロックしたままにし、 "ssh -L"(SSHポートフォワード)を使用して、OCI Nested KVM VMハイパーバイザーとローカルホスト間にトンネルを作成し、暗号化されたチャネルを介してVNCを使用できるようにする

Conclusion

Oracle Cloud InfrastructureでNested KVMハイパーバイザーを設定する方法を説明しました。これは、旧バージョンのKVM上で実行中のアプリケーションに対処したり、オンプレミスのインフラストラクチャコストを削減して、KVM環境をクラウドに移行するのに最適な方法です。Oracle Cloud Infrastructureは、仮想マシンやベアメタル・シェイプ上で直接実行するための完全なKVMサポートを備えていますし、別のユースケースには、既存のKVM環境の移行および管理においてRavelloも適しています。
Ravello Service - Oracle Cloud
https://cloud.oracle.com/ja_JP/ravello

0 件のコメント:

コメントを投稿