Ubuntu18.04のマシンでKVMで仮想マシンを立ててcloud-initで初期化する

環境

Intel NUC(2コア4スレッド、メモリ32GB)にUbuntu18.04をインストールしました。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:        18.04
Codename:       bionic

vhost_netを使えるようにする

Virtioという仮想マシンNICのオーバーヘッドを減らすための技術があるので、それを使えるようにします。 参考: https://qiita.com/nyamage/items/34ab6d56967c74326f99

$ lsmod | grep vhost
# なにも表示されない
$ sudo modprobe vhost_net
$ echo "vhost_net" >> /etc/modules
$ lsmod | grep vhost
vhost_net              24576  0
vhost                  45056  1 vhost_net
tap                    24576  1 vhost_net
# カーネルモジュールがロードされた

KVM関連パッケージをインストールする

$ sudo apt install qemu-kvm bridge-utils libvirt0 libcirt-bin virtinst libguestfs-tools

ネットワーク設定

VMNICを接続するブリッジを作成します。Ubuntu18.04なので /etc/network/interfaces ではなく、netplanの設定を書きます。 手元環境だと /etc/netplan/01-netcfg.yaml を編集しました。

network:
  version: 2
  renderer: networkd
  ethernets:
    eno1:
      dhcp4: no
      dhcp6: no
  bridges:
    br0:
      interfaces:
        - eno1
      dhcp4: no
      dhcp6: no
      addresses:
        - 192.168.10.2/24
      gateway4: 192.168.10.1
      nameservers:
        addresses:
          - 8.8.8.8
      parameters:
        stp: no
      optional: yes

今回はサーバの物理NICにルータが接続されていて、ルータがNATしてインターネットに出ていく構成のため、サーバ側ではNATをしていません。必要に応じてiptablesでNATの設定を書くなりしてください。

仮想マシンを起動してみる

Ubuntu Cloud Imageを入手する

Ubuntuマシンが起動したかったのでUbuntuを例にします。UbuntuはCloudで起動する用のマシンイメージが配布されています。ISOイメージからインストール作業をしてもいいのですが、せっかくなので配布されているQCOW2形式のイメージを使います。

$ wget https://cloud-images.ubuntu.com/releases/18.04/release/ubuntu-18.04-server-cloudimg-amd64.img -O ubuntu-18.04-server.qcow2

VM用ディスクを作成する

ダウンロードしてきたイメージファイルからそのまま起動してもいいのですが、VMを作るごとにベースイメージをコピーしないといけなくてディスク容量を無駄に消費してしまいます。QCOW2形式はCopy On Writeなイメージなので、差分ディスクが作成できます。

$ qemu-img create -b ubuntu-18.04-server.qcow2 -f qcow2 v01.qcow2 8G
Formatting 'v01.qcow2', fmt=qcow2 size=2361393152 backing_file=ubuntu-18.04-server.qcow2 cluster_size=65536 lazy_refcounts=off refcount_bits=16

$ ls -lh
total 324M
-rw-rw-r-- 1 kuro kuro 324M Oct 30 01:53 ubuntu-18.04-server.qcow2
-rw-r--r-- 1 kuro kuro 193K Nov  3 15:21 v01.qcow2

v01.qcow2 は193KBしかないことがわかりますね。差分ディスクなのでOSを起動してベースイメージから差分が発生すればするほどファイルサイズが大きくなっていきます。

cloud-initのmeta-dataとuser-dataの作成

このままでもVMは起動できるのですが、Cloud Imageはcloud-initという仕組みを使って起動時にユーザアカウントなどの初期化処理が行われます。KVM単体ではcloud-initの仕組みには対応していないので、VMが起動できてもユーザ設定がされていないためログインができません。 ディスクを直接編集してrootパスワードを変更しておく方法もありますが、せっかくなのでcloud-initの仕組みを応用することにします。 ディスクを直接編集する場合はこちら: https://qiita.com/s1061123/items/fa6d54ef6705135e5969

user-dataというファイルとmeta-dataというファイルを作成します。user-dataの先頭行の#cloud-config という文字列は必須です。その2つのファイルが入ったisoイメージファイルを作成します。

$ cat user-data
#cloud-config
password: ubuntu
chpasswd: {expire: False}
ssh_pwauth: True

$ cat meta-data
instance-id: ubuntu01
local-hostname: ubuntu01
   
$ genisoimage -output userdata.iso -volid cidata -joliet -rock user-data meta-data

参考: https://access.redhat.com/ja/articles/1460743

VMの作成

起動させず、作成のみ行いたい場合は --noreboot をつけます。仮想マシンのディスクのほかにcloud-initの情報が入ったisoイメージをマウントしていてこの情報を使って初期化されます。

$ sudo virt-install --name v01 --ram 1024 --vcpus 2 --arch x86_64 --os-type linux --os-variant ubuntu16.04 --hvm --virt-type kvm --file /home/kuro/kvm/ubuntu/v01.qcow2 --cdrom /home/kuro/kvm/ubuntu/userdata.iso --boot hd --network bridge:br0 --graphics none --serial pty --console pty --autostart --noreboot
    
WARNING  CDROM media does not print to the text console by default, so you likely will not see text install output. You might want to use --location. See the man page for examples of using --location with CDROM media
    
Starting install...
Connected to domain v01
Escape character is ^]
[    0.000000] Linux version 4.15.0-38-generic (buildd@lcy01-amd64-023) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #41-Ubuntu SMP Wed Oct 10 10:59:38 UTC 2018 (Ubuntu 4.15.0-38.41-generic 4.15.18)
...

VMの起動

$ sudo virsh start v01

VMのコンソールにアタッチする

正常に起動できていれば、コンソールにアタッチできているはずです。起動中であれば起動中のログが流れてきますし、そうでなければEnterキーを押せばログインプロンプトが出てくるでしょう。

$ sudo virsh console v01
Connected to domain v01
Escape character is ^]
    
Ubuntu 18.04.1 LTS ubuntu01 ttyS0
    
ubuntu01 login: ubuntu
Password:
Last login: Sat Nov  3 07:59:49 UTC 2018 on ttyS0
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-38-generic x86_64)

初めてKVMを触ったのですが、思ったより簡単でした。