# Arch systemd container (日本語)

関連記事

- systemd
- Linux Containers
- systemd-networkd
- Docker
- Lxc-systemd

systemd-nspawn は chroot コマンドに似ていますが、chroot を強化したものです。

systemd-nspawn を使えば軽量な名前空間コンテナでコマンドや OS を実行することができます。ファイルシステム構造だけでなく、プロセスツリーや様々な IPC サブシステム、ホスト・ドメイン名も完全に仮想化するため chroot よりも強力です。

systemd-nspawn は /sys, /proc/sys, /sys/fs/selinux などのコンテナの様々なカーネルインターフェイスへのアクセスを読み取り専用に制限します。コンテナの中からネットワークインターフェイスやシステムクロックを変更することは出来ません。デバイスノードを作成することも不可能です。コンテナの中からホスト環境を再起動することはできず、カーネルモジュールをロードすることも制限されます。

仕組みとしては Lxc-systemd や Libvirt-lxc と異なり、とてもシンプルなツールで設定を行います。

## pacstrap でインストール

公式リポジトリからパッケージ arch-install-scripts をインストールする必要があります。 そして、お好きな場所にディレクトリを作成してください。例えば `$ mkdir ~/MyContainer`。

次のコマンドで base グループから全てのパッケージがインストールされます。base-devel グループのパッケージも全てインストールすることを強く推奨します。

    # pacstrap -i -c -d ~/MyContainer base

Tip: -i オプションはパッケージ選択の自動確認を無効にします。コンテナ上に Linux カーネルをインストールする必要はないため、パッケージリストの選択から削除することができます。

インストールが完了したら、コンテナを起動してください:

    # systemd-nspawn -bD ~/MyContainer

これで終わりです。空のパスワードを使って "root" でログインしてください。

## 使用方法

### machinectl

コンテナの管理は原則 `$ machinectl` コマンドで行います。このサービスを使って仮想マシンやコンテナの状態を確認したり操作します。オプションの詳細なリストは `machinectl(1)` を参照してください。

### マシンのブート時にコンテナを起動する

コンテナを頻繁に使用したいのなら、マシンの init で起動させるのが楽です。それから machinectl を使ってログインすることが出来ます。

まず、ホストにコンテナを登録する必要があります。登録するには、`# mv /path/to/MyContainer /var/lib/container/MyContainer` を実行するかまたはディレクトリのシンボリックリンクを作成してください:

    # ln -s /path/to/MyContainer /var/lib/container/MyContainer

その後 `systemd-nspawn@MyContainer.service` を有効化・起動してください。コンテナが登録されていることを確認するために、次のコマンドを実行してください:

    $ machinectl list

    MACHINE                          CONTAINER SERVICE
    MyContainer                      container nspawn

    1 machines listed.

Tip:

- systemd-nspawn サービスは次のコマンドを実行します: `/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=guest --directory=/var/lib/container/%i` 。ディスクイメージファイルを使用したりコンテナに SELinux セキュリティを設定するために、コンテナのディレクトリから `/var/lib/container/MyCoantainer` にシンボリックリンクが貼られていない場合、このファイルを修正してオプションを追加する必要があります。コンテナのネットワーク設定を分離させたい場合、systemd-networkd を参照してください。さらに詳しいブートオプションの情報は `systemd-nspawn(1)` に載っています。
- `systemd-nspawn@.service` を無効にすると、`# systemd-nspawn -bD /path/to/container` を実行して手動でコンテナを起動することができます。コンテナにログインした後は、`# systemctl poweroff` を実行すればシャットダウンします。

control group の中身を表示したい場合は、`$ systemd-cgls` を実行してください。

### コンテナにログイン・ログアウト

#### systemd-nspawn コマンド

まだ `systemd-nspawn@MyContainer.service` を有効化・起動していない場合は、次のコマンドを実行してください:

`# systemd-nspawn -bD /path_to/MyContainer`

#### machinectl コマンド

新しいターミナルウィンドウを開いて次のコマンドを実行してください:

    # machinectl login MyContainer

    Connected to container MyContainer. Press ^] three times within 1s to exit session.
    Arch Linux Custom Kernel (pts/1)
    MyContainer login:

他のターミナルからログインすることで複数のセッションを開くことができます。

Note: `^]` corresponds to the `Ctrl+]` key sequence. Hold `Ctrl`, press tree times `]` and the connection will terminate. The container will still be UP, but you will be logged out the container

### コンテナのシャットダウン

`# machinectl terminate MyContainer` はコンテナの全てのプロセスを終了し、そのインスタンスで使われていたリソースの割り当てを全て解除します。

詳しいオプションは man machinectl を見て下さい。

### X 環境

新しいコンテナで X アプリケーションを動かす必要がある場合は Xhost を見て下さい。

### ネットワーク

上で説明しているインストールでは、何も設定しなくてもネットワークが動作するコンテナが作られるので、追加の設定は必要ありません。もっと複雑なネットワークを設定してホストのネットワークからコンテナのネットワークを分離させたいときは、systemd-networkd を見て下さい。

## 参照

- systemd-nspawn man ページ
- Creating containers with systemd-nspwan
- machinectl man ページ

Category:

- Virtualization (日本語)