Ubuntu Weekly Recipe

第582回 いろいろなディストリビューションでsnapとLXDを利用する

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

snapの実行パスについて

snapはシステムからの隔離を目的の一つにあげています。よって標準の設定では,アプリの中からシステムのファイルシステムにはアクセスできないようになっています。このため実行バイナリは一般的な実行PATHにはインストールしていません。snapパッケージでインストールされた実行コマンドは/snap/bin⁠からリンクしている/snap/パッケージ名/バージョン/bin⁠)にありますので,/snap/binをPATHに追加する必要があります。

どのディストリビューション向けのsnapdパッケージも,/etc/profile以下のファイルとして上記PATH設定を行うファイルがインストールされます。よって一般ユーザーであれば,この設定で問題ありません。

気をつけなくてはいけないのは,sudoでコマンドを実行する際です。sudoのとき実行PATHはスクリーニングされますので,/snap/binを明示的に指定しなくてはなりません。Ubuntuの場合は/etc/sudoersに次のような/snap/binを追加する設定がありますので,必要に応じて他のディストリビューションでも同じ設定を行っておくと良いでしょう。

Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

AppArmorが動かない環境でのsnapの制限

前述のようにsnapはAppArmorやseccompを利用して隔離環境を実現しています。つまりAppArmorが動いていない環境ではsnapの隔離機能は動作しません。システムで動作している隔離機能のリストは次のように確認できます。

$ snap debug sandbox-features
apparmor:             kernel:caps kernel:dbus kernel:domain kernel:file kernel:mount
    kernel:namespaces kernel:network kernel:network_v8 kernel:policy kernel:ptrace
    kernel:query kernel:rlimit kernel:signal parser:unsafe policy:default support-level:full
confinement-options:  classic devmode strict
dbus:                 mediated-bus-access
kmod:                 mediated-modprobe
mount:                freezer-cgroup-v1 layouts mount-namespace per-snap-persistency
    per-snap-profiles per-snap-updates per-snap-user-profiles stale-base-invalidation
seccomp:              bpf-actlog bpf-argument-filtering kernel:allow kernel:errno
    kernel:kill_process kernel:kill_thread kernel:log kernel:trace kernel:trap kernel:user_notif
udev:                 device-cgroup-v1 tagging

特に注意すべきは「confinement-options」です。これの「strict」が有効になっていないと,完全な隔離は実行されません。今回インストールした環境だと,残念ながらAppArmorが動いている環境も含めて,いずれもstrictは有効化されませんでした。

ちなみにstrictな環境だとhello-worldパッケージと一緒にインストールされる,hello-world.evilコマンドがエラーになります。

$ hello-world.evil
Hello Evil World!
This example demonstrates the app confinement
You should see a permission denied error next
/snap/hello-world/29/bin/evil: 9: /snap/hello-world/29/bin/evil: cannot create /var/tmp/myevil.txt: Permission denied

上記のようなエラーメッセージが表示されない場合,何がしかの隔離機能が無効化されていると言えます。

snap版LXDをいろいろなディストリビューションにインストールする

最後にsnapdをインストールした環境にシステムコンテナマネージャーであるLXDをインストールしましょう。LXDは第521回でも紹介しているように,Linux上でシステムコンテナを動かすためのツールです。ホストから隔離された軽量の環境を,かんたんに構築できます。

LXDは現在snapパッケージへの移行しています。よって最新のLXDやLTS版のLXDをインストールしたいならsnap版が便利です。

$ snap info lxd
(前略)
channels:
  stable:         3.16        2019-08-18 (11672) 57MB -
  candidate:      3.16        2019-08-17 (11672) 57MB -
  beta:           ↑
  edge:           git-4a0aa0a 2019-08-17 (11667) 57MB -
  3.16/stable:    3.16        2019-08-18 (11672) 57MB -
  3.16/candidate: 3.16        2019-08-17 (11672) 57MB -
  3.16/beta:      ↑
  3.16/edge:      ↑
  3.0/stable:     3.0.4       2019-07-23 (11348) 55MB -
  3.0/candidate:  3.0.4       2019-07-23 (11348) 55MB -
  3.0/beta:       ↑
  3.0/edge:       git-81b81b9 2019-07-23 (11362) 55MB -
  2.0/stable:     2.0.11      2018-07-30  (8023) 28MB -
  2.0/candidate:  2.0.11      2018-07-27  (8023) 28MB -
  2.0/beta:       ↑
  2.0/edge:       git-c7c4cc8 2018-10-19  (9257) 26MB -

snapは「channel」という仕組みで,複数のリリースブランチを管理できます。LXDの場合はstable/candidate/beta/edgeをフィーチャーリリースのリリースブランチとして利用し,それとは別に最新の3.x系,LTSリリースである3.0と2.0のリリースブランチを用意しています。

今回はUbuntu 18.04 LTSにインストールされているバージョンと同じLTSリリースである3.0系の最新安定版をインストールしましょう。

$ sudo snap install lxd --channel=3.0/stable
Warning: /snap/bin was not found in your $PATH. If you've not restarted your session since you
         installed snapd, try doing that. Please see https://forum.snapcraft.io/t/9469 for more
         details.
lxd (3.0/stable) 3.0.4 from Canonical✓ installed

詳しくは第521回を参照していただくとして,LXDを利用するにはまず初期設定を行いましょう。基本的に標準の設定を使えば問題ありません。

$ sudo /snap/bin/lxd init
Would you like to use LXD clustering? (yes/no) [default=no]: 
Do you want to configure a new storage pool? (yes/no) [default=yes]: 
Name of the new storage pool [default=default]: 
Name of the storage backend to use (btrfs, ceph, dir, lvm) [default=btrfs]: 
Create a new BTRFS pool? (yes/no) [default=yes]: 
Would you like to use an existing block device? (yes/no) [default=no]: 
Size in GB of the new loop device (1GB minimum) [default=15GB]: 
Would you like to connect to a MAAS server? (yes/no) [default=no]: 
Would you like to create a new local network bridge? (yes/no) [default=yes]: 
What should the new bridge be called? [default=lxdbr0]: 
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 
Would you like LXD to be available over the network? (yes/no) [default=no]: 
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] 
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: 

早速コンテナを構築・起動します。

$ sudo /snap/bin/lxc launch ubuntu:18.04 bionic
To start your first container, try: lxc launch ubuntu:18.04

Creating bionic
Starting bionic

lxc listで起動したコマンドを確認できます。

$ sudo /snap/bin/lxc list
+--------+---------+-----------------------+-----------------------------------------------+------------+-----------+
|  NAME  |  STATE  |         IPV4          |                     IPV6                      |    TYPE    | SNAPSHOTS |
+--------+---------+-----------------------+-----------------------------------------------+------------+-----------+
| bionic | RUNNING | 10.225.172.104 (eth0) | fd42:ac24:7376:aba2:216:3eff:fed3:7ce6 (eth0) | PERSISTENT | 0         |
+--------+---------+-----------------------+-----------------------------------------------+------------+-----------+

たとえばlxc execでコンテナの中のコマンドを実行可能です。

$ sudo /snap/bin/lxc exec bionic cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

LXDの詳しい使い方は第521回から始まるシリーズをご確認ください。

ぜひ他のディストリビューションのユーザーも,snapやLXDを活用いただけたらうれしいです。

著者プロフィール

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

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