Amazon EC2 ベアメタルインスタンスでLinux KVM仮想マシンを実行してみる
ども、大瀧です。
先日、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などと組み合わせて動かしてみたいですね!