Ubuntu Weekly Recipe

第392回Snappy Ubuntu Coreを試してみる

昨年の12月、Ubuntuの新しいイメージとしてSnappy Ubuntu Core発表されました。発表当時はテクニカルプレビューという位置づけもあって、⁠それっぽく動く(デモ以上のことをすると動かない⁠⁠」程度ではありましたが、今年の6月には最初の安定版がリリースされて、現在もそれなりの開発リソースが投入されています。

今週のRecipeでは、このSnappy Ubuntu Coreの使い方について説明しましょう。

Snappy Ubuntu Core

Snappy Ubuntu Coreの特徴や位置づけについてはUbuntu Weekly Topicsの2014年12月12日号が参考になります。

簡単にまとめておくと、この「Snappy Ubuntu Core(以下Snappy⁠⁠」はクラウドとコンテナ型仮想化や、さらにはIoTの時代まで見据えた、軽量かつ汎用的な新しいインストール済みイメージファイルです。標準でロールバック機能や個々のアプリケーションの隔離機能を備えており、さまざまなクラウドプラットフォーム上に、Ubuntuシステムをより簡単にデプロイ・リリースできるようになります。

平たく言うとCoreOSやRed HatのAtomicのUbuntu版です。Snappyがこれらと異なるのは、必ずしもDocker/rktに依存しているわけではないということです。もちろんDockerコンテナのホストとして使うことも可能ですが、SnappyならRailsやNode.jsアプリを直接隔離環境にデプロイできますし、他の構成管理ツールを用いた構築も行えます。

2015年の6月には15.04ベースの最初の安定版が、その後も何度かのリリースを経由し、9月17日には3回目の安定版リリースがありました[1]⁠。またRaspberry Pi 2向けのイメージについても最初は非公式のイメージとして提供していたものが、次のリリースあたりからはx86/BeagleBone Black向けのイメージと同様に、公式イメージサーバーから提供されるようになる予定です。

IoT向けについてはErler Roboticsが早々にUbuntu搭載ドローン蜘蛛型ロボットを販売しているのに加えて、冷蔵庫のモニタリング装置ホワイトボックススイッチなどこれまでにない分野に対するUbuntuの進出を引き出しています[2]⁠。

Snappyを起動できるプラットフォーム

Snappyのシステムイメージ自体はさまざまなプラットフォーム向けにリリースされています。

  • QEMU/KVM
  • Vagrant/VirtualBox
  • OVFに対応した仮想アプライアンス
  • Microsoft Azure
  • Google Compute Engine(GCE)
  • Amazon Web Service(AWS)
  • BeagleBone Black
  • Raspberry Pi 2(今のところ非公式)

いずれのプラットフォームもコマンド体系や使える機能は同じです[3]⁠。手っ取り早く試したいのであればQEMU/KVMイメージかVagrantを使うのが簡単です。AWSやAzure、Google Compute Engineの操作に慣れているのであれば、そちらを使うのもアリでしょう。

BeagleBone BlackやRasbperry Pi 2といった組み込み基板向けの場合、単純にサービスを立ち上げるだけでなく、I2CやSPIなどのデバイスを利用することもあるかと思います。Snappyの場合は、これらのI/Fにアクセスするために特殊な操作が必要です。これについては、また別の機会にご紹介します。

Snappyを起動する:KVM編

既にUbuntuとCPU仮想化支援機構が動いているマシンがあれば、一番簡単なのはKVMイメージを使う方法でしょう。

$ sudo apt-get install qemu-kvm
$ wget http://jp.releases.ubuntu.com/15.04/ubuntu-15.04-snappy-amd64-generic.img.xz
$ unxz ubuntu-15.04-snappy-amd64-generic.img.xz
$ kvm -m 512 -redir :4200::4200 -redir :8443::443 -redir :8022::22 ubuntu-15.04-snappy-amd64-generic.img
$ ssh -p 8022 ubuntu@localhost

stableチャンネルのリリース版のイメージをダウンロードし、展開し、起動するだけです[4]⁠。ちなみにイメージサイズは180MBほどと、CoreOSなどに比べるとかなり大きなサイズになっています。

アカウントとパスワードはそれぞれ「ubuntu」「ubuntu」です。QEMUウィンドウに直接入力してログインしても良いですが、上記のようにssh接続したほうがいろいろと便利でしょう。

4200番ポートは後で説明するWebDMで利用します。WebDMを使用しないなら指定しなくても問題ありません。同様に8443番ポートは後でインストールするownCloudパッケージのためにリダイレクトしています。こちらも必要なければオプションから外しても問題ありません。

Snappyを起動する:Vagrant/VirutalBox編

KVMを直接利用するのではなく、Vagrantを使いたい場合、もしくはUbuntuはないけれどもVirtualBoxを動かせるマシンがあるのであれば、VirutalBoxとVagrantの組み合わせでイメージを起動できます。

UbuntuSnappyを起動する場合
$ sudo apt-get install vagrant virtualbox
$ vagrant box add snappy http://cloud-images.ubuntu.com/snappy/15.04/core/stable/current/core-stable-amd64-vagrant.box
$ vagrant init snappy
$ vagrant up
$ vagrant ssh

Ubuntu以外のマシンでSnappyを起動する場合
vagrant init ubuntu/ubuntu-15.04-snappy-core-stable
vagrant up
vagrant ssh

Snappyを起動する:AWS編

手元で仮想マシンを立ち上げられないのであれば、クラウドを利用しましょう。AWSの操作はmultiverseにあるec2-api-toolsでもいいのですが、今回はPython製のawscliを使用します[5]⁠。

$ sudo apt-get install python3-pip
$ sudo pip3 install awscli
$ aws configure
AWS Access Key ID [None]: (access key)
AWS Secret Access Key [None]: (secret access key)
Default region name [None]: ap-northeast-1
Default output format [None]: json
$ ssh-keygen -t rsa -f ~/.ssh/snappy-rsa
$ aws ec2 import-key-pair --key-name snappy-key --public-key-material file://~/.ssh/snappy-rsa.pub

今回はPython 3のpipとawcliを使用しています。Python 2環境しかない場合は「python-pip」パッケージをインストールして「pip」コマンドを使用してください。

「access key」「secret access key」の取得法方はAWSのドキュメントを参照してください。ssh-keygenで鍵を作っていますが、既存の鍵を流用してもかまいません。

前述のKVMイメージもそうですが、SnappyのイメージはCloud-initに対応しています。このため設定ファイルをUser Dataとして渡すことで起動時の自動的な追加設定を行えます。今回はSnappyイメージでsshを有効化したいため、次の内容のcloud.cfgファイルを作成します。

#cloud-config
    snappy:
       ssh_enabled: True

最新のstableチャンネルのイメージを検索しましょう。⁠099720109477」はCanonicalのOwner IDです。また、検索が面倒であれば、cloud-images.ubuntu.comの最新イメージリストファイルを参照するという手もあります。

$ aws ec2 describe-images --owners 099720109477 \
    --filters "Name=name,Values=*Snappy-core-stable*"

上記で検索したImageId(ami-6c0a6704の部分)を元に、Snappyインスタンスを起動します。

$ aws ec2 run-instances --image-id ami-6c0a6704 \
  --key-name snappy-key --instance-type m3.medium
  --user-data file://cloud.cfg

出力されるInstanceIdを保存し、インスタンスのPublicDnsNameを取得します。

$ aws ec2 describe-instances --instance-ids InstanceId
$ ssh -i ~/.ssh/snappy-rsa ubuntu@PublicDnsName

Microsoft AzureやGoogle Compute Engineについても、それぞれのツールで最新イメージを検索して、インスタンスを立ち上げるという手順自体は同じです。最新のイメージIDの取得方法はツールに依存しますが、cloud-images.ubuntu.comにはAzure用GCE用のイメージリストのJSONファイルがそれぞれ用意されていますので、そちらを利用するのも良いでしょう。

Snappyをサポートしていないクラウドサービスであっても、QEMUイメージファイルやOVAファイルのインポートをサポートしているのであれば前述のKVM用のQEMUイメージファイルやOVAファイルを使ってSnappyのイメージを起動できる可能性があります。

snappyコマンドの使い方

Snappyシステムの中では「snappyコマンド」を使って、パッケージのインストールや削除、システムのアップデートを行います。従来のAPTシステムは利用できないので注意してください。

システムの状態

まずはinfoサブコマンドでシステムの状態を確認してみましょう。

$ snappy info
release: ubuntu-core/15.04/stable
architecture: amd64
frameworks: webdm
apps:

releaseフィールドは使用しているシステムの状態で、ここでは「ubuntu-coreシステムの15.04リリースのstableチャンネル」を使用していることがわかります。architectureフィールドはそのままの意味です。

frameworksフィールドにはインストールされている「フレームワーク」が、appsフィールドにはインストールされている「アプリケーション」が表示されます。アプリケーションはいわゆるdebパッケージファイルとは異なり、snappy用に作成した「snapパッケージ」としてインストールされたパッケージになります。snapパッケージは、システムとは独立したパスにインストールされ、AppArmorを用いてその実行権限が厳しく制限されています。基本的に異なるアプリケーション間での連携はできません。

アプリケーションが独立して動作するのに対して、フレームワークは複数のアプリケーションにまたがって利用されるライブラリやフレームワークをインストールする際に使われる「特別なアプリケーション」です。そのため、最初からいくつかの権限が与えられた状態でインストールされます。

KVMイメージの場合、最初からwebdmフレームワークがインストールされています。これについては後ほど紹介します。

インストールされているパッケージのバージョンリストはlistサブコマンドで確認できます。

$ snappy list -v
Name          Date       Version Developer
ubuntu-core   2015-09-17 5       ubuntu*
webdm         2015-09-17 0.9     canonical*
generic-amd64 2015-09-17 1.4     canonical*

最後についているアスタリスク(*)「-v」オプションによって表示される「アクティブフラグ」と呼ばれるもので、現在使用しているシステムを意味します。これはどういうことかというと、Snappyシステムは元から複数のシステムパーティションを持っており、システムアップデート時は「使っていないほう」のシステムを更新し、再起動後にそちらに切り替えるようになっているのです。

$ sudo parted /dev/sda print
Model: ATA QEMU HARDDISK (scsi)
Disk /dev/sda: 3900MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name         Flags
 1      4194kB  8389kB  4194kB               grub         bios_grub
 2      8389kB  75.5MB  67.1MB  fat32        system-boot  boot, esp
 3      75.5MB  1149MB  1074MB  ext4         system-a
 4      1149MB  2223MB  1074MB  ext4         system-b
 5      2223MB  3900MB  1677MB  ext4         writable

grubがブートローダーをインストールする領域で、system-bootはUEFIパーティションです。system-aとsystem-bがSnappyのコアシステムをインストールするパーティションになります。system-aとsystem-bは読み込み専用でマウントされます。基本的に稼働中のパーティションの内容を変更することはありません。

writableはユーザーデータやアプリケーション、フレームワークをインストールする領域です。また/etcのような変更が必要な一部のファイルについてもこちらにマウントされます。たとえばフレームワークやアプリケーションは/apps以下にインストールされます。

$ ls -l /apps/webdm/
drwxr-xr-x 6 clickpkg clickpkg 4096 Sep 17 12:51 0.9
lrwxrwxrwx 1 root     ubuntu      3 Oct  4 10:14 current -> 0.9

上記を見るとわかるように、アプリケーションもバージョンごとにインストールされる先が異なります。currentが現在使用中のバージョンへのシンボリックリンクになっているため、新しいバージョンをインストールしたあとも、元のバージョンへ簡単にロールバックできるようになっているのです。

システムのアップデートとロールバック

試しに古いバージョンのSnappyイメージからアップデートしてみましょう。まず、1つ前のリリースであるImage 4をダウンロードして起動します。

listサブコマンドで状態を確認してみましょう[6]⁠。アップデートの有無を確認するために「-u」オプションもつけて実行します。

$ snappy list -uv
Name          Date       Version
ubuntu-core*  2015-09-17 5
webdm*        1-01-01    0.9.2
generic-amd64 2015-07-29 1.4

より新しいubuntu-coreとwebdmがリリースされているのでアップデートしましょう。

$ sudo snappy update
Installing ubuntu-core (5)
Syncing boot files
Starting download of ubuntu-core
(中略)
Waiting for webdm_snappyd_0.9.service to stop.
Name        Date       Version Developer
ubuntu-core 2015-09-17 5       ubuntu!
webdm       1-01-01    0.9.2   canonical
Reboot to use the new ubuntu-core.

$ snappy list -v
Name          Date       Version Developer
ubuntu-core   2015-07-29 4       ubuntu*
ubuntu-core   2015-09-17 5       ubuntu!
webdm         2015-07-29 0.9     canonical
webdm         2015-10-05 0.9.2   *
generic-amd64 2015-07-29 1.4     canonical*
Reboot to use the new ubuntu-core.

$ ls -l /apps/webdm/
total 8
drwxr-xr-x 6 clickpkg clickpkg 4096 Jul 29 04:07 0.9
drwxr-xr-x 6 clickpkg clickpkg 4096 Oct  5 16:53 0.9.2
lrwxrwxrwx 1 root     root        5 Oct  5 16:53 current -> 0.9.2

listサブコマンドによって、新しいバージョンがインストールされていることがわかります。また、webdmのcurrentのリンク先も新しいバージョンになっています。

さらにアップデート時のメッセージにもあるように、ubuntu-coreの反映には再起動が必要です。再起動をする前に、現在マウントしているパーティションを確認しておきます。

$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       976M  568M  341M  63% /

どうやら/dev/sda3のようです。では、改めて再起動を行います。

$ sudo shutdown -r now

再度ログインした上で、状態を確認してみましょう。

$ snappy list -v
Name          Date       Version Developer
ubuntu-core   2015-09-17 5       ubuntu*
ubuntu-core   2015-07-29 4       ubuntu
webdm         2015-07-29 0.9     canonical
webdm         2015-10-05 0.9.2   sideload*
generic-amd64 2015-07-29 1.4     canonical*

$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda4       976M  583M  327M  65% /

アクティブフラグが新しいバージョン(Image 5)になり、さらにルートファイルシステムも、/dev/sda4になりました。

さらにSnappy特有のこれまでのUbuntuにはない機能が「ロールバック」です。updateサブコマンドで更新したものの、何らかの問題が発生したために1つ前のコアシステムに移行したいとしましょう。

$ sudo snappy rollback ubuntu-core
Setting ubuntu-core to version 4
Name        Date       Version Developer
ubuntu-core 2015-07-29 4       ubuntu!
Reboot to use the new ubuntu-core.

$ sudo shutdown -r now
$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       976M  568M  341M  63% /

$ snappy list -v
Name          Date       Version Developer
ubuntu-core   2015-07-29 4       ubuntu*
ubuntu-core   2015-09-17 5       ubuntu!
webdm         2015-07-29 0.9     canonical
webdm         2015-10-05 0.9.2   sideload*
generic-amd64 2015-07-29 1.4     canonical*

これだけです。これだけで、Image 4に戻ることができました。実際内部的に行っていることも、grubの起動パーティションを変更しているだけなのです。

アプリケーションのインストール

アプリケーションやフレームワークのインストールもsnappyコマンドを利用します。searchサブコマンドを使うとインストールできるアプリケーションやフレームワークを検索できます[7]⁠。

$ snappy search hello
Name              Version Summary
say               1.4     say
hello-world       1.0.18  hello-world (forks not shown: 2)
spi-test.pedronis 0.3     spi-test
hello-dbus-fwk    1.0.2   hello-dbus-fwk
saythis           1.3     saythis
Use --show-all to see all available forks.

helloで検索するといろいろなsnapパッケージがリストアップされますが、今回はただ「Hello World!」と表示されるhello-worldパッケージをインストールすることにします。

$ sudo snappy install hello-world
Installing hello-world
(中略)
Name          Date       Version Developer
ubuntu-core   2015-09-17 5       ubuntu
hello-world   2015-10-05 1.0.18  canonical
webdm         2015-09-17 0.9     canonical
generic-amd64 2015-09-17 1.4     canonical

$ ls -l /apps/
total 12
drwxr-xr-x 2 root ubuntu 4096 Oct  5 18:21 bin
drwxr-xr-x 3 root root   4096 Oct  5 18:21 hello-world.canonical
drwxr-xr-x 3 root ubuntu 4096 Sep 17 12:51 webdm

$ hello-world.echo
Hello World!

searchサブコマンドの結果は、インストール済みのフレームワークに依存します。つまり特定のフレームワークに依存しているアプリケーションは、そのフレームワークをインストールするまで表示されません。

$ snappy search owncloud
Name Version Summary

$ snappy search docker
Name   Version   Summary
docker 1.6.2.003 Docker

$ sudo snappy install docker
Installing docker
(中略)
Name          Date       Version   Developer
ubuntu-core   2015-09-17 5         ubuntu
docker        2015-10-05 1.6.2.003 canonical
hello-world   2015-10-05 1.0.18    canonical
webdm         2015-09-17 0.9       canonical
generic-amd64 2015-09-17 1.4       canonical

$ snappy search owncloud
Name     Version   Summary
owncloud 8.0.2.006 Owncloud 8.0.2

$ sudo snappy install owncloud
Installing owncloud
(中略)
Name          Date       Version   Developer
ubuntu-core   2015-09-17 5         ubuntu
docker        2015-10-05 1.6.2.003 canonical
hello-world   2015-10-05 1.0.18    canonical
owncloud      2015-10-05 8.0.2.006 canonical
webdm         2015-09-17 0.9       canonical
generic-amd64 2015-09-17 1.4       canonical

このowncloudアプリは単純にkickinz1/owncloud-8.0.2-sqlite3-amd64にあるDockerイメージをdocker runしているだけです。よって数分待てばdocker psに状態が表示されるようになります。インスタンスが起動したら、⁠https://localhost:8443」にアクセスしてみてください。ownCloudの初期設定の画面が表示されるはずです。

図1 現在はARMにも対応しているので、Raspberry Pi 2上でも簡単に構築できる
図1 現在はARMにも対応しているので、Raspberry Pi 2上でも簡単に構築できる

また、infoサブコマンドを実行すると、これまでインストールしたアプリケーションやフレームワークも表示されています。

$ snappy info
release: ubuntu-core/15.04/stable
architecture: amd64
frameworks: docker, webdm
apps: hello-world, owncloud

Snappyコマンドのブラウザ版:WebDM

WebDMはWebベースのSnappyシステム管理システムです。

KVM版のイメージであれば最初からWebDMが入っています。入っていない場合は、⁠sudo snappy install webdm」としてください。4300番のポートで待ち受けているので、⁠http://localhost:4300/」にアクセスしてみましょう。

図2 トップ画面はインストール済みのパッケージ一覧
図2 トップ画面はインストール済みのパッケージ一覧
図3 Snappy storeからパッケージをインストールできる
図3 Snappy storeからパッケージをインストールできる

今はまだパッケージリストの表示やインストールぐらいしかできませんが、今後はUbuntuのアプリストア相当の情報表示やレビューシステムなどが実装される見込みです。このあたりは、Ubuntu Phoneのアプリストアとどう統合していくかが課題になっています。

おすすめ記事

記事・ニュース一覧