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 libvirt-bin virtinst libguestfs-tools
ネットワーク設定
VMのNICを接続するブリッジを作成します。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を触ったのですが、思ったより簡単でした。