Ubuntu Weekly Recipe

第201回Arkoseを使ってサンドボックスでアプリケーションを動かす

ArkoseはLXCを用いたサンドボックス環境を簡単に作成できるツールです。Arkoseを使うと、既存の環境に変更を加えることなく、アプリケーションのインストールしたり、実際に動作を試すことができます。

そこで今回は、このArkoseの使い方を紹介します。

Arkoseとは

Arkoseは、LXC(Linux Containers)と呼ばれる仮想化技術を用いた、CanonicalのStephane Graberが開発しているデスクトップアプリケーション用のサンドボックスツールです。

Ubuntuには数多くのデスクトップアプリケーションが存在し、ソフトウェアセンターを使えばそれらを簡単にインストールすることができます。しかしながら、そのアプリケーションが本当に目的に適ったものかどうかは実際にインストールして試してみる他ありません。試してやはり必要ないとなったときに、アンインストールすることで、できるだけインストール前の環境に戻したいというのが人情です。

幸いDebian/Ubuntuの強力なパッケージ管理システムとポリシーに従った公式リポジトリのパッケージを使っている限り、アンインストールするだけでインストールする前の環境に戻すことができます。ただし非公式リポジトリのパッケージをインストールしたり、Debianパッケージになっていないソフトウェアをインストールする場合はこの限りではありません。そもそもテストが終わるまでは本番環境へのインストール自体を避けたいという考え方もあるかもしれません。

Arkoseを使うと、アプリケーションのインストール、実行、アンインストールまでを本番とは独立した環境で行えます。

同様のことはVirtualBoxやKVMといった仮想マシンを使うことでも実現可能ではあるものの、これらはまず最初にテスト用の仮想マシンの準備が必要です。また、LXCは他の仮想化技術と比べてオーバーヘッドが小さく、実環境とほぼ同じ速度でアプリケーションを実行できるというメリットがあります。ユーザーランド部分もできる限り既存のものを流用するため、ディスクスペース的にも優しい作りになっています。

ただし、LXCはその仕組み上、仮想環境のゲストとホストが同じカーネルプロセスを使うことになります。このため、異なるカーネルでしか動作しないアプリケーションをテストすることはできません。LXC単体でなら、Ubuntu上に他のOS(のユーザーランド部分)をインストールするような作業も可能ではあるのですが、そのためにはいろいろとプラットフォーム固有の設定を行う必要があります。

ArkoseはあくまでUbuntu上でアプリケーションをテストするためのツールだと思っておいた方が良いでしょう。

ちなみに、ArkoseはほぼすべてがPythonを使って作成されています。PythonでLXCを操作したい場合はArkoseのコードを参考にすると良いかもしれません。

Arkoseを使ったアプリケーションの起動

まずはArkoseをインストールします。

$ sudo apt-get update
$ sudo apt-get install arkose arkose-gui

arkose-guiは、アプリケーションの起動や権限の設定をグラフィカルに行えるGUIツールです。上記以外にもArkoseのツールとして、Nautilusから右クリックで特定のスクリプトをサンドボックスで実行できるarkose-nautilusが存在しますが、こちらはまだGNOME 3への対応が終わっていません。

GUIアプリケーションを動作させるためには、DBusまわりの環境変数を設定するために、インストール後に一度ログアウトして再度ログインする必要があります。

実際に端末からArkose越しにGeditを起動してみましょう。

$ sudo arkose -n -c gedit

"-n"オプションはサンドボックスからネットワークを使用することを示すフラグです。GUIアプリケーションの場合は、XやDBUSなどでネットワークを使う必要があるため、このオプションは必須と考えて差し支えありません。"-c"オプションの後ろで、実際に起動するコマンドを指定しています。

図1 通常のGedit(左)とArkoseで起動したGedit(右)
図1 通常のGedit(左)とArkoseで起動したGedit(右)

図1では普通に起動したGeditとArkoseで起動したGeditを並べてみました。見た目にはメニュー意外ほとんど違いはありませんが、実際に動作させてみるとWindow間のタブの移動ができなくなっていることがわかります。なお、メニューも同じにする(UbuntuのGlobalMenuを使う)には、DBusの設定が必要です。

仮想環境のイメージや設定ファイル、ディレクトリは"~/.arkose/"に生成される一時ディレクトリに保存されます。そのため、例えばサンドボックス内で新たなファイルを生成した場合は、必要に応じてこのディレクトリから取り出すことができます。ちなみに、ホームディレクトリも同じように一時ディレクトリにCopy-on-Write(COW)で生成されますが、"-h"オプションをつけることで既存のホームディレクトリをそのまま流用することもできます。

Arkoseのプロファイル

特定のディレクトリはCOWで、特定のディレクトリは直接アクセスといったような、柔軟な設定を行いたい場合があるかもしれません。Arkoseの場合はプロファイルを作成することで実現可能です。

すでにいくつかのプロファイルサンプルが/usr/share/arkose/wrapper-profilesに用意されています。プロファイルを指定してArkoseを起動するには以下のコマンドを実行してください。

$ sudo arkose-wrapper-gui /usr/share/arkose/wrapper-profiles/gedit.conf
図2 arkose-wrapper-guiの確認画面
図2 arkose-wrapper-guiの確認画面

確認画面はその場で一時的に編集可能です。各設定項目の内容はソースコードなどを参考にしてください。

fstype: ext4 or tmpfs
fssize: size in MB. Defaults to 2GB for ext4 and 50% of available RAM for tmpfs
network: Network access: "none", "direct" or "filtered"
xserver: What kind of X access should be allowed: none, isolated, direct
dbus: DBUS access: "none", "system", "session" or "both"
dbusproxy: Configuration for DBUS proxy, these will be added line by line to the actual config
pulseaudio: Enable pulseaudio access in the container
devices: Allow the given devices in the container
ctype: Container type, either cow (copy on write) or bind (full bind-mount of the FS)
bind: List of paths to bind-mount in the container
restrict: List of paths to empty in the container (bind-mounts an empty directory)
cow: List of paths to mount as copy-on-write

gedit.confはDBusの設定も行っているため、arkose-wrapper-guiから起動したGeditのメニューは、GlobalMenuに統合された状態で表示されます。

シェル環境をArkoseで起動する

以下のようにArkoseでシェルを起動すれば、簡単に一時的な実験環境を用意できます。

$ sudo arkose -n -c "cd $PWD; $SHELL"

この環境であれば、好きなアプリケーションをインストールし放題です。シェルをexitすると実験環境でインストールされたすべてのアプリケーションが破棄された状態に戻ります。

shibata@arkose-tmpdFHjGE:~$ apt-cache policy hello
hello:
  インストールされているバージョン: (なし)

# ホストにインストールされていないhelloをインストールする
shibata@arkose-tmpdFHjGE:~$ sudo apt-get install hello
shibata@arkose-tmpdFHjGE:~$ apt-cache policy hello
hello:
  インストールされているバージョン: 2.7-1

# キャッシュにもインストールしたパッケージファイルが残っている
shibata@arkose-tmpdFHjGE:~$ ls /var/cache/apt/archives/hello*
/var/cache/apt/archives/hello_2.7-1_amd64.deb
shibata@arkose-tmpdFHjGE:~$ exit

# 実験環境からホストに戻ると、インストールが「なかったこと」にされていることがわかる
$ apt-cache policy hello
hello:
  インストールされているバージョン: (なし)

# キャッシュにも存在しない
$ ls /var/cache/apt/archives/hello*
ls: /var/cache/apt/archives/hello* にアクセスできません: そのようなファイルやディレクトリはありません

まとめ

このように、Arkoseを使うとお手軽に実験環境を構築できます。面倒なchroot環境の構築や、ネットワークの設定、果てはDBusの設定まですべてArkoseとLXCがうまくやってくれるので、複雑なことをしない限りユーザーは特別な知識なく、本番環境と同じように実験環境を使用できるのです。

現在開発中のPresiceでは、アプリケーション開発などでこのArkoseの利用をさらに推し進めるべく、様々な案が提案されています

おすすめ記事

記事・ニュース一覧