Ubuntu Weekly Recipe

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

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

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⁠。

※4
virt-managerを使う例については第561回を参照してください。

仮想マシン上の変更内容は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に変更しているだけのようです。

著者プロフィール

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

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