Ubuntu Weekly Recipe

第561回 ローカルインストール時もcloud-initを活用する

この記事を読むのに必要な時間:およそ 6.5 分

QEMUでNoCloudを使用する

では作成したデータストアをQEMUで使ってみましょう。必要なパッケージとイメージファイルをダウンロードします。

$ sudo apt install qemu-kvm qemu-utils ovmf
$ wget https://cloud-images.ubuntu.com/releases/18.04/release/ubuntu-18.04-server-cloudimg-amd64.img
$ qemu-img resize ubuntu-18.04-server-cloudimg-amd64.img 10G

最後のコマンドでイメージサイズを2GiBから10GiBに変更しています。この時点ではディスクのサイズが変わっただけで,パーティションのサイズはオリジナルのままになっています。本来はパーティションのリサイズも必要ですが,実はcloud-initが自動的にルートパーティションのサイズを変更してくれますので,このままでかまいません※6⁠。

※5
このリサイズはcloud-guest-utilsパッケージのgrowpartコマンドが行います。もし細かく調整したい場合は,cloud-configのgrowpartモジュールで設定してください。

さらに今回は第441回でも紹介したように,UEFI/OVMF版のファームウェアをインストールしていますが,もちろん従来のSeaBIOSでも可能です。

$ cp /usr/share/OVMF/OVMF_VARS.fd .

UEFI/OVMFを使うなら,変数領域を別途コピーしておくと良いでしょう。詳しいことは第441回を参照してください。

最後にルートファイルシステムに加えて,先程作ったデータストアもドライブとして指定して起動します。

$ sudo qemu-system-x86_64 \
    -m 2G -enable-kvm -nographic \
    -net user,hostfwd=tcp::2222-:22 \
    -drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
    -drive if=pflash,format=raw,file=OVMF_VARS.fd \
    -drive file=ubuntu-18.04-server-cloudimg-amd64.img,format=qcow2 \
    -drive file=user-data.img,format=raw

データストアとして必要なのは最後の1行だけです。起動してしばらくすると,次のようなメッセージが表示されることでしょう。

[   20.396382] cloud-init[1131]: Cloud-init v. 18.5-21-g8ee294d5-0ubuntu1~18.04.1 finished at Sun, 17 Mar 2019 12:03:34 +0000. Datasource

これでcloud-initの設定完了ですので,設定したアカウントとパスワードでログインできるか確認してください。さらにhostfwdオプションも指定しているので,ホストマシンのポート2222からsshログインできるはずです。

$ ssh -p 2222 ubuntu@localhost

virt-managerでNoCloudを使用する

もう一つの例として,virtinstパッケージにあるvirt-installコマンドからデータストアを追加してみましょう。まずはあらかじめ,必要なパッケージをインストールしておきます。

$ sudo apt install virtinst

あとは「cloudtest」の名前で仮想マシンを作ってみましょう。

$ virt-install \
  --name cloudtest \
  --vcpus 1 --ram 2048 \
  --hvm --virt-type kvm \
  --os-type linux --os-variant ubuntu18.04 \
  --graphics none --serial pty --console pty \
  --import --noreboot \
  --disk path=ubuntu-18.04-server-cloudimg-amd64.img \
  --disk path="$PWD/user-data.img,bus=ide,device=cdrom"

こちらも渡しているオプションのうちデータストア関連は最後の1行だけです。

実際に仮想マシンを起動し,コンソールから設定したパスワードでログインできるか確認しておきましょう。

$ virsh start cloudtest
$ virsh console cloudtest

SMBIOSで指定する方法

最後にSMBIOSで設定する方法も紹介しておきます。この方法の最も便利な点は,任意のURL上にメタデータとユーザーデータを置けることです。

まずあらかじめ,仮想マシンからHTTP/HTTPS/FTPアクセスできる場所に,meta-dataファイルとuser-dataファイルを配置してください。今回は「https://example.com/cloud-init/」とします。つまり,⁠https://example.com/cloud-init/meta-data」でmeta-dataファイルそのものが,⁠https://example.com/cloud-init/user-data」でuser-dataファイルそのものが取得できる状態になっているはずです。

あとはuser-data.imgファイルの代わりにsmbiosオプションを指定して仮想マシンを起動します。

$ sudo qemu-system-x86_64 \
    -m 2G -enable-kvm -nographic \
    -net user,hostfwd=tcp::2222-:22 \
    -drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
    -drive if=pflash,format=raw,file=OVMF_VARS.fd \
    -drive file=ubuntu-18.04-server-cloudimg-amd64.img,format=qcow2 \
    -smbios "type=1,serial=ds=nocloud-net;seedfrom=https://example.com/cloud-init/"

「type=1」でType 1の(つまりシステム情報の)設定を行い,⁠serial=」でシリアル番号の値を変更しています。シリアル番号の値はds=nocloud-net;seedfrom=https://example.com/cloud-init/です。中にセミコロンが含まれているのでダブルクオーテーションで括ってください。

「ds=nocloud-net」はネットワーク経由でデータストアを取得することを意味します。これはつまりインスタンスのネットワーク設定が完了するまでは,cloud-initは実施されません。⁠seedfrom=」で取得するデータのURLを指定します。

「ds=nocloud」と指定することも可能です。この場合はインスタンスのローカルファイルからデータを取得できます。⁠seedfrom=」「/」から「file://」で始まる絶対パスを指定してください。ルートファイルシステムイメージにcloud-configのデータまで入れておきたい場合に便利でしょう。

うまく設定できていれば,次のようにDMIの値が変わっているはずです。

$ sudo cat /sys/class/dmi/id/product_serial
ds=nocloud-net;seedfrom=https://examplecom/cloud-init/

cloud-initそのものの実行ログは/var/log/cloud-init.logに,cloud-initによる設定ログは/var/log/cloud-init-output.logに記録されます。うまく動かないようなら,そちらも確認しておくと良いでしょう。ただしクラウドイメージは,そのままだとログインできるアカウントが設定されていません。つまりcloud-initが失敗するとログインできません。トライアンドエラーを行うなら,デバッグ用のアカウントをあらかじめ作成済みのイメージを用意してそちらを使用してください。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。