Ubuntu Weekly Recipe

第565回サーバー向けインストール済みイメージを活用しよう

第561回ではローカルのマシンでもcloud-initを用いて初期設定できる方法を解説しました。そこで今回は、Ubuntuが提供する各種クラウド向けイメージの活用方法を紹介します。

クラウドイメージの利点

Ubuntuでは通常のインストーラー付きイメージとは別にクラウドイメージも提供しています。これは最新のアップデートを適用した「インストール済み」のイメージで、各種仮想マシンやコンテナでそのまま起動できる形式で配布されています。

配布形式はディスクイメージだったり、単にルートファイルシステムをtarでアーカイブしたものだったりとさまざまです。アカウントは設定されていません。rootもロックされた状態なので、もしクラウドイメージを起動してログインする必要があるなら、cloud-initを用いた設定が必要です。もちろん手作業で展開・カスタマイズ・再アーカイブもできます。

主なターゲットはパブリックもしくはプライベートのクラウドサービスです[1]⁠。これらのクラウドサービスでは、インスタンスの立ち上げごとにインストーラーを起動していては煩雑になってしまいます。そこで立ち上げ時に機械的にカスタマイズ可能なインストール済みイメージを提供することで、各サービスベンダーはインスタンスの作成を容易に自動化できるのです。

さらにクラウドイメージは「最新のアップデートが適用済み」の状態で提供されています。つまり定期的にビルドが行われているのです。このためインストール後からアップデート完了までのリスク期間も減らせます。

そもそもUbuntuサーバーを「普通に」インストールしようとしたら、インストールディスク(800MiB程度)をダウンロードし、マシンにインストールし、最新のアップデート(タイミングによっては200MiB程度)をダウンロードし、それを適用しなくてはなりません。それに比べたら、300MiBぐらいのアップデート適用済みイメージをダウンロードして起動したほうがはやいのは当然ですよね。

もちろんこれらの利点はクラウドサービス以外でも意味があります。第561回のように、仮想マシンインフラでもクラウドイメージ(とcloud-init)を活用すれば、個人のネットワークの「ギガが減る」ことなくUbuntuサーバーを構築できるのです[2]⁠。

「クラウドイメージ」だからと言ってクラウドでしか使えないわけではありません。UbuntuはおおよそFLOSSで構築されていますし、Linuxサーバーとして使うにあたってサブスクリプションなども不要です。自分が便利だと思う方法でどんどん活用していきましょう[3]⁠。

クラウドイメージの種類

2019年4月時点でUbuntu 18.04 LTS向けに提供されているクラウドイメージには次の種類が存在します。

ubuntu-18.04-server-cloudimg-amd64-root.tar.xz
  • ルートファイルシステムをただtar.xzで固めたアーカイブです(約140MiB)
  • カーネルやブートローダーはインストールされていません
  • コンテナのベースイメージや組み込みシステムでの利用を想定しています
  • 最小のルートファイルシステムが欲しいなら、Ubuntu BaseUbuntu Minimalを使いましょう
ubuntu-18.04-server-cloudimg-amd64.img
  • QEMU/KVM向けのQCOWイメージです(約300MiB)
  • QEMU/KVMベースの仮想マシン管理システムやOpenStackなどで使われます
  • カーネルやブートローダーもインストールされています
ubuntu-18.04-server-cloudimg-amd64.ova
  • OVA(Open Virtual Appliance)形式のイメージです(約300MiB)
  • VirtualBoxやVMWareをはじめとするOVA対応の仮想マシンシステムで使います
  • フォーマットが異なるだけで内容はQCOWイメージと同じです
ubuntu-18.04-server-cloudimg-amd64-vagrant.box
  • VirtualBox向けのVagrant Boxファイル(OVF形式)です(約300MiB)
  • フォーマットが異なるだけで内容はQCOWイメージと同じです
ubuntu-18.04-server-cloudimg-amd64.vhd.zip
  • VHD(Virtual Hardk Disk)形式のイメージです(約400MiB)
  • 主にHyper-Vで使います
  • フォーマットが異なるだけで内容はQCOWイメージと同じです
ubuntu-18.04-server-cloudimg-amd64.vmdk
  • VMDK(Virtual Machine Disk)形式のイメージです(約300MiB)
  • 主にVMWareで使います
  • 実はOVAやVagrant Boxにはこのファイルがそのまま入っています
  • フォーマットが異なるだけで内容はQCOWイメージと同じです
ubuntu-18.04-server-cloudimg-amd64.squashfs
  • squashfs形式のルートファイルシステムです(約200MiB)
  • 読み込み専用のファイルシステムとしてマウントします
  • 通常はOverlayFS2などと併用して書き込み領域可能を用意します
ubuntu-18.04-server-cloudimg-amd64.tar.gz
  • ext4イメージファイルをtar.gzでアーカイブしたものです(約300MiB弱)
  • QEMU/KVMやXenなど各種仮想マシン管理システムで使えます
  • BIOS用のMBRやUEFI用のESPは別途用意する必要があります
  • フォーマットが異なるだけで内容はQCOWイメージと同じです
ubuntu-18.04-server-cloudimg-amd64-lxd.tar.xz
  • LXD向けのテンプレートです(約1KiB)
  • サイズからもわかるように、これ単体は起動可能なイメージファイルではありません
  • 別途ダウンロードしたルートファイルシステムなどと組みあわせて使います

どのイメージも、インストールされているものはほぼ同じです。異なるのはブートローダー関連とカーネルがインストールされているかどうか、です。ディスクイメージタイプはインストールされていて、ただのアーカイブタイプはインストールされていません。

よって使用している仮想マシン管理システムにあわせてダウンロードするフォーマットを決めてください。よく使われるVirtualBoxやVMWareであれば、OVAを選んでおけば問題ないです。

ディスクイメージタイプのルートファイルシステムのパーティションサイズはおおよそ2GiB(tar.gzのext4だけ1GiB)に設定されています。これはインストールされている状態でほぼ使用率100%に近いので、実際に使う場合はパーティションを拡張する必要があります。仮想マシンシステムごとにデプロイする際にパーティションサイズを指定できるはずです。なおファイルシステムのサイズは、パーティションのサイズにあわせて自動拡張されます。

今回は上記の中でも特に「そのまま使える形式」である、QCOW形式、Vagrant Box形式、OVA形式について説明します。

また、QCOWとOVAについてはcloud-initで初期セットアップできると便利です。第561回にローカルでcloud-initを使うためのイメージの作り方を解説していますので、そちらもあわせて参照してください。とりあえず今回はパスワードの設定が必須なので、次のようにcloud-init用のイメージファイルを作っておくこととします。

$ sudo apt install cloud-image-utils
$ cat >user-data <<EOF
#cloud-config
password: ubuntu
chpasswd: { expire: False }
ssh_pwauth: True
EOF
$ cloud-localds user-data.img user-data

QCOW形式の使い方

QCOW形式については実は第561回で活用しています。他の方式との比較のために、改めてそのコマンドを紹介しておきましょう。

まずは必要なパッケージをインストールしておきます。

$ 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
$ cp /usr/share/OVMF/OVMF_VARS.fd .

今回もUEFI/OVMFを使う例にしているため、最後にOVMFの変数領域を別途コピーしています。詳しいことは第441回を参照してください。

最後にQCOWイメージを起動します。最後の行では、cloud-init用のデータストアをマウントしています。

$ 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

これで「ubuntu」アカウントとcloud-initで設定したパスワードでログインできるはずです[4]⁠。

仮想マシン上の変更内容はQCOWイメージに保存されます。よって必要に応じてイメージファイルをコピーしておけば、同じ設定の複数のインスタンスを立ち上げることも可能です。

仮想マシンを起動せずにQCOWイメージをカスタマイズしたいなら、NBD(Network Block Device)としてマウントしてしまいましょう。

$ sudo modprobe nbd
$ sudo qemu-nbd -c /dev/nbd0 ubuntu-18.04-server-cloudimg-amd64.img
$ sudo parted /dev/nbd0 print
モデル: 不明 (unknown)
ディスク /dev/nbd0: 2361MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始    終了    サイズ  ファイルシステム  名前  フラグ
14    1049kB  5243kB  4194kB                          bios_grub
15    5243kB  116MB   111MB   fat32                   boot, esp
 1    116MB   2361MB  2245MB  ext4
$ sudo mount /dev/nbd0p1 /mnt/

「ファイルシステム」「ext4」になっているパーティションがルートファイルシステムです。初期状態では2GiBのパーティションであり、ほぼすべて使い切っています。カスタマイズが終わったら次のようにアンマウントします。

$ sudo umount /mnt
$ sudo qemu-nbd -d /dev/nbd0
/dev/nbd0 disconnected

Vagrant Box形式の使い方

Vagrant Box形式では、まず最初に必要なパッケージをインストールしておきます。Ubuntuの提供するVagrant Boxはプロバイダーとして「virtualbox」が記載されていますので、Vagrantに加えてVirtualBoxもインストールしておきましょう。

$ sudo apt install vagrant virtualbox

Boxファイルを追加します。名前は「bionic」にしていますが、任意の名前でかまいません。

$ vagrant box add bionic https://cloud-images.ubuntu.com/releases/18.04/release/ubuntu-18.04-server-cloudimg-amd64-vagrant.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'bionic' (v0) for provider:
    box: Unpacking necessary files from: file:///home/shibata/cloud/images/ubuntu-18.04-server-cloudimg-amd64-vagrant.box
==> box: Successfully added box 'bionic' (v0) for 'virtualbox'!

Vagrantからこのイメージを起動するためには、Vagrantfileが必要です。⁠vagrant init」でVagrantfileを生成しましょう。

$ vagrant init bionic
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

「bionic」は先程追加したBoxの名前です。カレントディレクトリにVagrantfileが生成されるので必要にあわせて調整してください。Vagrantについては、cloud-initを使うよりもVagrantfileに設定を書いたほうがかんたんかもしれません。もしcloud-initを使いたい場合は、Vagrantfileに次のように記述します。

Vagrant.configure("2") do |config|
  # 中略

  config.vm.provider "virtualbox" do |vb|
    vb.customize ["storageattach", :id, "--storagectl", "IDE",
                  "--port", "0", "--device", "0", "--type", "dvddrive",
                  "--medium", "user-data.iso"]
  end

  # 中略
end

気をつけたいことは、Vagrant(というかVirtualBox)はファイルの拡張子が「.iso」でないとDVD/CDイメージファイルとして認識してくれない点です。前述の「user-data.img」「user-data.iso」に名前を変更しておいてください。

「vagrant up」でインスタンスを立ち上げます。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'bionic'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: vagrant_default_1552725553144_75219
(以下略)

特にエラーメッセージ等が表示されなかったら、無事に起動していることになります。Vagrantで作ったインスタンスなら、cloud-initの有無に関わらず「vagrant ssh」コマンドでログインできます。

$ vagrant ssh

ログインするのは「vagrant」という名前の自動生成されたアカウントです。cloud-initを利用していたら「ubuntu」アカウントも作られていることでしょう。

ちなみにUbuntuが提供するVagrant BoxにはConfigDrive方式のデータストアが最初から同梱されています。ただしこのデータストアは、ホスト名「ubuntu-bionic」とし、manage_etc_hostslocalhostに変更しているだけのようです。

OVA形式の使い方

OVA(Open Virtual Appliance)は各種仮想マシン管理システムが対応している、業界標準の仮想マシンイメージフォーマットです。最近のVirtualBoxやVMWareなどはOVAをサポートしているので、まずはこのフォーマットを試すと良いでしょう。

VMWare vSphere Hypervisor(ESXi)の場合

VMWareのvSphere Hypervisor(ESXi)の場合は、⁠仮想マシンの作成/登録」からOVAファイルをインポートできます。ここではバージョン6.7のWebクライアントを元に説明します。

図1 まずは「仮想マシンの作成/登録」から「作成タイプの選択」にて「OVF ファイルまたは OVA ファイルから仮想マシンをデプロイ」を選択
画像
図2 ⁠OVF ファイルと VMDK ファイルの選択」ではダウンロードしたOVAファイルもしくはVMDKファイルを選択
画像
図3 起動する前にcloud-init関連の設定を行いたいので「デプロイのオプション」では「自動的にパワーオン」のチェックを外す
画像
図4 これだけで仮想マシンの作成は完了
画像

次にESXiのデータストアに、あらかじめ作成しておいたcloud-init用のデータストアイメージをアップロードしておいてください。

仮想マシンを起動する前に、仮想マシンの編集画面から必要な設定を変更します。

図5 ⁠CD/DVD ドライブ」から「データストア ISO ファイル」を選択し、アップロードしたcloud-init用のイメージを選択
画像
  • 初期状態だとストレージのサイズは10GiBです。必要に応じて増やしてください。
  • 他CPUやメモリ・ネットワークなども適宜調整すると良いでしょう。

あとは通常通り起動するだけです。cloud-initの設定が適用されて無事に最新のUbuntu環境が構築されました。

VirtualBoxの場合

VirtualBoxもまたOVAに対応したソフトウェアです。次の流れで作成してみましょう。

ファイルブラウザーからOVAファイルをダブルクリックするか、⁠ファイル」から「仮想アプライアンスのインポート」を選択しOVAファイルを指定します。⁠仮想アプライアンスのインポート」ダイアログが開くので、設定を調整します。

図6 仮想アプラインスのインポートメニュー
画像
図7 仮想アプライアンスのインポートダイアログ
画像
図8 設定を調整して「インポート」ボタンを押せば、仮想マシンの作成は完了
画像

VirtualBoxの場合、ローカルにあるISOイメージファイルをマウントできます。よって起動する前にcloud-init用のデータストアイメージをマウントするように設定しておきましょう。Vagrantのときと同様にファイルの拡張子が「.iso」でないとDVD/CDイメージファイルとして認識してくれません。

作成した仮想マシンを選択し設定ボタンを押します。ストレージの「コントローラー:IDE」にある光学ドライブを追加するアイコンをクリックして、⁠ディスクを選択」ボタンを押します。ディスクファイルとしてcloud-init用のデータストアイメージを選択してください。

図9 user-data.isoを選択
画像

ついでに使わないフロッピーデバイスは削除しておいてもいいかもしれません。

Ubuntuのクラウド向けイメージはOpenSSHサーバーも自動起動するため、基本的にネットワーク越しにログインできます。ただ、VirtualBoxをヘッドレスではない形で使うならシリアルコンソールも使えたほうが便利かもしれません。同じ設定画面の「シリアルポート」「ポート1」「シリアルポートを有効化」にチェックを入れておきましょう。

図10 シリアルポートの有効化
画像

あとは通常通り起動するだけです。cloud-initの設定が適用されて無事に最新のUbuntu環境が構築されました。

おすすめ記事

記事・ニュース一覧