DigitalOceanでKVMを触ってみる

Posted by rhoboro on 2016-08-09

VPSって便利なサービスですよね。
ネットワークやLinuxについて、基本からもう一歩だけ踏み込んで理解したくなったので、DigitalOceanのDroplet上にKVMで仮想マシンを作ってみました。

なぜわざわざ仮想マシンを使うのか

今回メインでやりたかったことは大きく下記の2つです。

  • ネットワーク周り、特にブリッジやNATへの理解を深める
  • KVMで立てたサーバ群の管理をできるようになる

最終的には複数のDockerコンテナをVM上で動かし、ホストマシン以外から各コンテナにアクセスできるような環境を構築するのが目的です。
また、今回KVMを使うのは、個人的にKVMを使う機会がある かつ VPSのサービサーが使っていることも多く、クラウドのサービスを使う上で理解を深めておいたほうが今後のためになると思ったからです。
(AWSのEC2はXenですが、GCEや今回使うDigitalOceanはKVMを使っているようです)

ちなみに、私の現在の技術レベルですが、
DigitalOceanのDroplet(仮想マシン)上でdocker-composeでRedmine、GitLab、Jenkinsのコンテナを構築、それぞれに外からredmine(gitlab, jenkins).example.comでアクセスできるような環境を作れる
くらいです。(謎w)

DigitalOceanを使う理由

手元にLinuxのマシンがあればそれでもよかったのですが...(笑
手元には、MacBookAirとWindowsのデスクトップ機しかなく、ちょうどいいLinuxマシンがなかったのでVPSを使うことにしました。

ところがAWSのEC2、GCPのGCEなど多くのVPSはインスタンス内で仮想マシンを作成できないようです。 そんな中、いろいろ調べているとDigitalOceanだけはKVMを使えそうだったので実際に仮想マシンを立ててみました。
(まぁ仮に作成できても特殊な用途以外じゃあまり需要なさそうですよね)

一応下記コマンドを打って、flagsの中にvmxフラグがあればだいたい仮想マシンを使えるみたいです。

$ cat /proc/cpuinfo
~省略~
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 ss syscall nx pdpe1gb
rdtscp lm constant_tsc arch_perfmon rep_good nopl eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer
aes xsave avx f16c rdrand hypervisor lahf_lm arat vnmi ept fsgsbase tsc_adjust smep erms xsaveopt
bogomips        : 4799.99
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:
~省略~

KVM on DigitalOcean

さて、ここからは実際にDigitalOceanのDroplet上にKVM仮想マシンを作成していきます。
事前準備として、Dropletを作成して、作業ユーザーの追加、SSHの設定だけしておいてください。
(ここは今回の内容とは関係のない部分なので説明は省略します。ちなみに私はCentOS7.2、RAM4GB、SSD60GBでシンガポールリージョンを選びました。)

CentOS7にKVMをインストールする手順はこちらのページをほぼそのままに参考にさせていただきました。 素のままのDropletなのでGUIは一切使わず、全てCLIで作業していきます。

CentOS7上にKVM環境を構築する(CUI環境)

KVM徹底入門 Linuxカーネル仮想化基盤構築ガイドも買ったのですが、情報が少々古いのと記載されている仮想マシン作成方法がグラフィックス環境を要求するものだったのでそのままでは使えませんでした(泣
(その他の部分はめちゃくちゃ参考にしています)

Install packages

まずは必要なパッケージのインストール。

$ sudo yum install qemu-kvm qemu-img
$ sudo yum install virt-manager libvirt bridge-utils virt-install

次にlibvirtdを起動し、自動起動にも登録させます。 CentOS7では下記のコマンドですが、それ以前ではsystemctlはないので、serviceコマンドを使います。
(確かシンボリックリンクが貼られてるはずなので、serviceコマンドはCentOS7でも使えないことはないはず)

$ sudo systemctl start libvirtd
$ sudo systemctl enable libvirtd

Create Virtual Machine

さて、必要なパッケージ群のインストールが終わったらあとは仮想マシンを作成するだけです。 今回はネットワークの勉強も兼ねてるので、ネットワークに関しては何も設定せず仮想マシンを作成します。

ゲスト用OSのISOイメージの準備から。 私はゲストOSもCentOS7としました。

$ cd /tmp
$ curl -LO http://ftp.nara.wide.ad.jp/pub/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso

次に仮想マシン用のディスクイメージ(仮想ハードディスク)を用意します。 フォーマットで指定しているqcow2ですが、ディスクイメージサイズを最初に割り当てたサイズでなく、必要に応じて拡張していくことができるフォーマットで、ディスク容量を節約できます。
ちなみにqcowとはQEMU Copy on Writeを意味しているようです。

sudo qemu-img create -f qcow2 /var/lib/libvirt/images/centos7.img 10G 

ディスクイメージの作成はqemu-imgコマンドの他にもddコマンドやvirshのvol-create/vol-create-asでも作成できるようなので気になる方はぜひこちらもお試しを。

さてさて、ここまで準備できたら最後に仮想マシンを作成しましょう。 使うコマンドはvirt-installコマンドで、名前の通り仮想マシンを作成するためにあるコマンドです。

sudo virt-install --connect qemu:///system \
--name=centos7 \
--vcpus=2 \
--ram=1024 \
--disk path=/var/lib/libvirt/images/centos7.img,size=10,format=qcow2 \
--location='/tmp/CentOS-7-x86_64-Minimal-1511.iso' \
--nographics \
--extra-args='console=tty0 console=ttyS0,115200n8'

GUI環境を利用しないインストールのため、--nographicsオプションと--extra-args='console=tty0 console=ttyS0,115200n8'を指定しています。 --extra-argsオプションはKernelに渡すオプションを指定するもので、この値を渡すことでゲストOSのシリアルコンソールが有効化されるようです。
(テキストモードでのインストールが可能になるのに加え、インストール後にvirshのconsoleコマンドからシリアルコンソール接続できるようになります)

うまくいくとこのようにテキストモードでインストール画面が表示されるはずです。

centos7_installer

あとは各々の環境に沿ってインストールを進めてください。 基本的に!が付いているところを設定すればいいと思います。 設定が終わりましたらbを入力するとインストールが開始されます。

ここで一旦止まるのでEnterを押してください。

centos7_installing

インストールが完了するとlocalhost login:と表示されますので、rootと入力して先ほどの画面で設定したrootのパスワードを入力するとログインできます。

centos7_install_finished

ちなみに先ほど--extra-argsで指定した内容は/etc/default/grubを見ればそれっぽい値が反映されていることが確認できます。

[root@localhost ~]# cat /etc/default/grub 
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial --speed=115200"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap console=ttyS0,115200n8"
GRUB_DISABLE_RECOVERY="true"

これで仮想マシンの作成は完了となります。
ちなみに仮想マシンに接続したシリアルコンソールから抜ける際はCtrl + ]を押します。
再度KVMに接続する際は、sudo virsh console centos7でシリアルコンソール接続すればOKです。
ネットワーク設定をするまではSSHなどが使えないのでこれで我慢です。

まとめ

KVMはGUIでのインストールは情報が多いのですが、CUIオンリーの環境だと情報が少なくて苦労しました。 (virt-installコマンドを使っていてもvncとの併用が多いですね)
libvirtでのKVM管理は、VPSサービスの裏側が少し見えてくる(気がする)ので一度触ってみると面白いと思います。
次回は今回作ったマシンでネットワーク周りの設定を行おうと思っています。

tags: KVM, DigitalOcean