Ubuntu Weekly Recipe

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

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

cloud-utilsでデータストア作成

さて,ローカルマシンでcloud-initを使う方法を考えてみましょう。一般的なクラウドサービスでは,そのサービスがメタデータとユーザーデータそのものを渡す方法やその場所を通知する方法(データストア)を実装しています。しかしながらローカルマシンでは,その方法が定義されていません。そこでcloud-initでは,ローカルのマシンやLXDのようなコンテナなどのクラウドサービス外のデータストアとしてNoCloudを実装しています。

まず最初に「どこにデータストアがあるか」を指定する方法が必要です。NoCloudには次の3つの方法が用意されています。

  1. SMBIOS(System Management BIOS)上のシリアル番号
  2. カーネルのコマンドラインパラメーター
  3. ラベルcidataが付けられたファイルシステム

複数指定された場合,上のほうが使われます※5⁠。

※5
実際はもう少し複雑で,この3つから取得したデータの中でさらに別の場所を指定することも可能です。

SMBIOSはマシン固有のデータをOSなどのソフトウェアに渡す仕組みです。Linuxであれば/sys/class/dmi以下やdmidecodeコマンドで参照できます。このうち「シリアル番号」とは,Type 1のシステム情報に記録されているデータで,一般的なPCなら「製造番号」などが記録されるフィールドです。

仮想マシンなどで使われているQEMUには,起動時にSMBIOSに任意の値を設定できる仕組みが存在します。そこでシリアル番号をデータストアに関する情報を渡しておけば,cloud-initはそれを解釈するのです。

$ sudo cat /sys/class/dmi/id/product_serial
ds=nocloud-net;seedfrom=http://10.0.0.1:8000/

上記の例なら,⁠http://10.0.0.1:8000/」にデータストアがあるとして,ネットワーク越しに情報を取得します。

カーネルのコマンドラインパラメーターは,上記のシリアル番号の内容をカーネル起動時のパラメーターとして渡す方法です。GRUBなどのブートローダーで指定したい場合に使えるでしょう。

ファイルシステムのラベルとしてcidataが付いているパーティションが存在すれば,cloud-initはそれをデータストアとして使用します。QEMU/KVMベースのNoCloudでもっとも一般的に使う方法です。さらにNoCloud以外のデータストアでも使えることが多いので,今回はこの方法を紹介しましょう。

cidataタイプのデータは次の3つの条件が満たされている必要があります。

  • ファイルシステムのラベルがcidataであること
  • システムが解釈できるファイルシステムであること(ISO9660かFATが使われることが一般的です)
  • トップディレクトリに「meta-data」「user-data」の2つのファイルが存在すること

上記の条件を満たすのデータは手作業でも作れますが,cloud-utilsにあるcloud-image-utilsパッケージを使うとよりかんたんに作成できます。

$ sudo apt install cloud-image-utils

cloud-image-utilsパッケージは,クラウドイメージを操作するために便利なツールが含まれているパッケージです。たとえばパーティションのリサイズや最新のAMIのID取得などが行なえます。今回はこのうちcloud-localdsコマンドを使用します。

$ cloud-localds --help
Usage: cloud-localds [ options ] output user-data [meta-data]

   Create a disk for cloud-init to utilize nocloud

   options:
     -h | --help             show usage
     -d | --disk-format D    disk format to output. default: raw
                             can be anything supported by qemu-img or
                             tar, tar-seed-local, tar-seed-net
     -H | --hostname    H    set hostname in metadata to H
     -f | --filesystem  F    filesystem format (vfat or iso), default: iso9660

     -i | --interfaces  F    write network interfaces file into metadata
     -N | --network-config F write network config file to local datasource
     -m | --dsmode      M    add 'dsmode' ('local' or 'net') to the metadata
                             default in cloud-init is 'net', meaning network is
                             required.
     -V | --vendor-data F    vendor-data file
     -v | --verbose          increase verbosity

   Note, --dsmode, --hostname, and --interfaces are incompatible
   with metadata.

   Example:
    * cat my-user-data
      #cloud-config
      password: passw0rd
      chpasswd: { expire: False }
      ssh_pwauth: True
    * echo "instance-id: $(uuidgen || echo i-abcdefg)" > my-meta-data
    * cloud-localds my-seed.img my-user-data my-meta-data
    * kvm -net nic -net user,hostfwd=tcp::2222-:22 \
         -drive file=disk1.img,if=virtio -drive file=my-seed.img,if=virtio
    * ssh -p 2222 ubuntu@localhost

オプションからもわかるようにホストネームやネットワークインターフェースも指定可能です。これらはcloud-configではなく,meta-data側に保存されます。

あらかじめcloud-configデータを作っておきます。今回は初期状態で存在するアカウント(ubuntu)のパスワードを「ubuntu」に設定し,パスワードでsshログインできるように変更しているだけです。

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

cloud-localdsでデータストアを作成します。設定は基本的に規定値で問題ありません。

$ cloud-localds user-data.img user-data

作られたデータストアを確認しましょう。まず,IS09660形式で,なおかつcidateのラベルが振られていることがわかります。

$ file user-data.img
user-data.img: ISO 9660 CD-ROM filesystem data 'cidata'

データストアをマウントして中身を確認してみましょう。

$ sudo mount -o ro user-data.img /mnt/

$ cat /mnt/meta-data
{
"instance-id": "iid-local01"
}

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

$ sudo umount /mnt

meta-dataにはインスタンスIDが,user-dataには作成したcloud-configが保存されていることがわかります。ちなみにインスタンスIDはその値を変えると,次回起動時にuser-dataの内容が再設定されます。インスタンスIDを変更したい場合は,cloud-localdsの第三引数にmeta-dataファイルを指定してください。

これでローカルマシン用のデータストアが作成されました。

著者プロフィール

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

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