昨年の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向けのイメージと同様に、公式イメージサーバーから提供されるようになる予定です。
[1] Snappyはコアシステムとアプリケーション層が独立しているため、別々のリリーススケジュールを持っています。「 Snappyのリリース」と言う場合は基本的にコアシステムのほうで、最新のUbuntuリポジトリの状態をベースに、Snappy特有のシステムを追加したルートファイルシステムです。Snappyのstableチャンネルで提供されるイメージは数週間ごとのマイルストーン的なリリースを行っています。またSnappyイメージの開発者向けに、15.04リリースとは別にrollingリリースのedgeチャンネルにて最新の開発版イメージを提供しています。
IoT向けについてはErler Roboticsが早々にUbuntu搭載ドローン や蜘蛛型ロボット を販売しているのに加えて、冷蔵庫のモニタリング装置 やホワイトボックススイッチ などこれまでにない分野に対するUbuntuの進出を引き出しています[2] 。
[2] ロボット開発プラットフォームとして定番のROS がUbuntuをベースとしていることもあって、ロボットとUbuntuは比較的親和性が高いようです。先日行われたROSConでも、マーク・シャトルワースが講演を行っています。
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などに比べるとかなり大きなサイズになっています。
[4] 最新のedgeチャンネルを使用したい場合は、「 http://cdimages.ubuntu.com/ubuntu-snappy/15.04/edge/」を指定してください。こちらは日本のミラーはありません。
アカウントとパスワードはそれぞれ「ubuntu」と「ubuntu」です。QEMUウィンドウに直接入力してログインしても良いですが、上記のようにssh接続したほうがいろいろと便利でしょう。
4200番ポートは後で説明するWebDMで利用します。WebDMを使用しないなら指定しなくても問題ありません。同様に8443番ポートは後でインストールするownCloudパッケージのためにリダイレクトしています。こちらも必要なければオプションから外しても問題ありません。
Snappyを起動する:Vagrant/VirutalBox編
KVMを直接利用するのではなく、Vagrantを使いたい場合、もしくはUbuntuはないけれどもVirtualBoxを動かせるマシンがあるのであれば、VirutalBoxとVagrantの組み合わせでイメージを起動できます。
● Ubuntu で Snappy を起動する場合
$ 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] 。
[5] AWSの進化に対して、Ubuntuの公式リポジトリにあるパッケージはどうしても遅れがちです。用途に合わせてUbuntuパッケージ版を使うか、公式リリース版を使うかを判断する必要があります。もちろんWebインターフェースからでもかまいません。
$ 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」オプションもつけて実行します。
[6] オプションなし、もしくは「-v」オプションをつけた場合、ローカルのバージョンだけを確認するのに対し、「 -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上でも簡単に構築できる
また、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 トップ画面はインストール済みのパッケージ一覧
図3 Snappy storeからパッケージをインストールできる
今はまだパッケージリストの表示やインストールぐらいしかできませんが、今後はUbuntuのアプリストア相当の情報表示やレビューシステムなどが実装される見込みです。このあたりは、Ubuntu Phoneのアプリストアとどう統合していくかが課題になっています。