Amazon EC2 ベアメタルインスタンスでLinux KVM仮想マシンを実行してみる

2018.05.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。
先日、EC2ベアメタルインスタンスが正式リリースされました。Amazon EC2で利用できる一般的なインスタンスが仮想マシンなのに対しベアメタルインスタンスは物理マシンに相当するリソースが利用できるため、インスタンス上で仮想化ソフトウェアを実行し複数の仮想マシンを起動できるのがメリットの一つと言われています。そこで今回は、オープンソースの著名な仮想化ソフトウェアであるLinux KVMでEC2インスタンスで仮想マシンを実行してみます。

動作確認環境

  • リージョン : us-west-2(オレゴン)
  • AMI : Ubuntu Server 16.04 LTS (HVM), SSD Volume Type - ami-4e79ed36
  • インスタンスタイプ : i3.metal

セットアップ

インスタンスの設定自体は特に変更していません。SSHで接続し、まずはKVM周りのパッケージをインストールします。

$ sudo apt update
$ sudo apt install -y qemu-kvm libvirt-bin virtinst bridge-utils libosinfo-bin libguestfs-tools virt-top

続いて、仮想マシンのディスクファイルを格納する領域を確保します。今回はルートボリュームを8GBのままで起動してしまい心許ないので、i3.metalにたくさん付いてくるインスタンスストアをマウントし/mnt/kvm/imagesディレクトリにディスクイメージを置くことにしました。

インスタンスストアはインスタンスの終了時にディスクのデータがワイプ(削除)されることに注意してください。今回は検証目的で利用していますが、仮想マシンのディスクを保存する用途であればEBSボリュームを追加してそちらをマウントしましょう。

$ sudo mkfs -t xfs /dev/nvme1p1
$ sudo mount /dev/nvme1p1 /mnt
$ sudo mkdir -p /mnt/kvm/images

仮想マシンの作成とOSインストール

準備が出来たので、KVMの仮想マシンを作成しOSをインストールします。今回はインスタンスと同じUbuntu 16.04(Xenial Xerus)にしました。

$ sudo virt-install \
--name vm1 \
--ram 1024 \
--disk path=/mnt/kvm/images/vm1.img,size=30 \
--vcpus 2 \
--os-type linux \
--os-variant ubuntu16.04 \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://archive.ubuntu.com/ubuntu/dists/xenial/main/installer-amd64/' \
--extra-args 'console=ttyS0,115200n8 serial'

実行ししばらく待つと、SSHで接続しているターミナル上でUbuntuのテキストインストール画面が表示されます。

  ┌───────────────────────┤ [!!] Select a language ├────────────────────────┐
  │                                                                         │
  │ Choose the language to be used for the installation process. The        │
  │ selected language will also be the default language for the installed   │
  │ system.                                                                 │
  │                                                                         │
  │ Language:                                                               │
  │                                                                         │
  │                               C                                         │
  │                               English                                   │
  │                                                                         │
  │     <Go Back>                                                           │
  │                                                                         │
  └─────────────────────────────────────────────────────────────────────────┘




<Tab> moves; <Space> selects; <Enter> activates buttons

普段OSがインストール済みのAMIを利用するので、AWS環境でOSをインストールする光景は新鮮でした。一般的な設定でインストールを開始し(インストール中のユーザー名/パスワードはあとでコンソールログイン時に入力するのでメモしておきます)、インストールが完了したらCtrl + ]でインスタンスのターミナルに切り替えます。

シリアルコンソールを有効にするために一度仮想マシンをシャットダウンして仮想ディスクをマウント、コンソールを有効にします。

$ sudo virsh shutdown vm1
$ sudo mkdir /mnt/guest
$ sudo guestmount -d vm1 -i /mnt/guest
$ sudo ln -s /mnt/guest/lib/systemd/system/getty@.service /mnt/guest/etc/systemd/system/getty.target.wants/getty@ttyS0.service 
$ sudo umount /mnt

これでOKです。

動作確認

仮想マシンを起動し、ログインできることを確認します。

$ sudo virsh start vm1 --console

しばらく待ち、ログインプロンプトが表示されればOKです。インストール中に設定したユーザー名/パスワードでログインします。

Domain vm1 started
Connected to domain vm1
Escape character is ^]

Ubuntu 16.04.4 LTS ip-192-168-122-136 ttyS0

ip-192-168-122-136 login: <ユーザー名を入力>
Password: <パスワードを入力>
Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-124-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 packages can be updated.
0 updates are security updates.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@ip-192-168-122-136:~$

起動しました!仮想マシン作成時に指定したパラメータ通りに設定されているかを確認しましょう。仮想CPUだと以下の通りです。

$ cat /proc/cpuinfo
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 61
model name	: Intel Core Processor (Broadwell)
stepping	: 2
microcode	: 0x1
cpu MHz		: 2300.016
cache size	: 4096 KB
physical id	: 0
siblings	: 1
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single retpoline kaiser fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt arat
bugs		: cpu_meltdown spectre_v1 spectre_v2
bogomips	: 4600.03
clflush size	: 64
cache_alignment	: 64
address sizes	: 40 bits physical, 48 bits virtual
power management:

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 6
model		: 61
model name	: Intel Core Processor (Broadwell)
stepping	: 2
microcode	: 0x1
cpu MHz		: 2300.016
cache size	: 4096 KB
physical id	: 1
siblings	: 1
core id		: 0
cpu cores	: 1
apicid		: 1
initial apicid	: 1
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single retpoline kaiser fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt arat
bugs		: cpu_meltdown spectre_v1 spectre_v2
bogomips	: 4600.03
clflush size	: 64
cache_alignment	: 64
address sizes	: 40 bits physical, 48 bits virtual
power management:
$

ネットワークはvirbr0を指定したので、インスタンスでNATする構成でインターネットへの接続が可能です。

$ ifconfig
ens2      Link encap:Ethernet  HWaddr 52:54:00:07:fa:90
          inet addr:192.168.122.136  Bcast:192.168.122.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe07:fa90/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:152 errors:0 dropped:5 overruns:0 frame:0
          TX packets:133 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:288758 (288.7 KB)  TX bytes:11034 (11.0 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:160 errors:0 dropped:0 overruns:0 frame:0
          TX packets:160 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:11840 (11.8 KB)  TX bytes:11840 (11.8 KB)
$ sudo apt update
[sudo] password for ubuntu:
Hit:1 http://us.archive.ubuntu.com/ubuntu xenial InRelease
Hit:2 http://us.archive.ubuntu.com/ubuntu xenial-updates InRelease
Hit:3 http://us.archive.ubuntu.com/ubuntu xenial-backports InRelease
Hit:4 http://security.ubuntu.com/ubuntu xenial-security InRelease
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
$

普通に使える感触です。

まとめ

EC2ベアメタルインスタンスでLinux KVMを実行し仮想マシンを動かす様子をご紹介しました。本番で使うためにはKVMの運用手法とEC2のサービス仕様との擦り寄せなどいろいろ検討するべき項目がありますので、じっくり評価してみてください。例えばLive MigrationはAmazon VPCとの兼ね合いで一筋縄ではいかないそうですが、Amazon EFSなどと組み合わせて動かしてみたいですね!

参考URL