systemd-nspawn

提供: ArchWiki
ナビゲーションに移動 検索に移動

関連記事

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

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

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

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

インストール

systemd-nspawnsystemd に含まれています。

サンプル

コンテナに最小限の Arch Linux ディストリビューションを作成して起動

まず公式リポジトリからパッケージ arch-install-scriptsインストールしてください。

そして、お好きな場所にディレクトリを作成してください。例えば: $ mkdir ~/MyContainer

pacstrap を使って最小限の arch システムをコンテナにインストールします。最低限でも base グループはインストールする必要があります。

# pacstrap -i -c -d ~/MyContainer base [additional pkgs/groups]
ヒント: -i オプションはパッケージ選択の自動確認を無効にします。コンテナ上に Linux カーネルをインストールする必要はないため、パッケージリストの選択から削除することができます。

インストールが完了したら、コンテナを起動してください (-b はシェルを実行する代わりにコンテナを起動します (つまり PID=1 として systemd を実行)。-D にはコンテナのルートディレクトリにするディレクトリを指定します。-n はホストとコンテナ間のプライベートネットワークを設定します):

# systemd-nspawn -b -D ~/MyContainer -n

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

セッションを終了するには Ctrl を押しながら ] を3回押してください。コンテナは実行し続けますが、セッションは終了します。

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

コンテナを頻繁に使用したいのなら、マシンの init で起動させるのが楽です。

# mv ~/MyContainer /var/lib/machines/MyContainer
# systemctl enable systemd-nspawn@MyContainer.service
# systemctl start systemd-nspawn@MyContainer.service
ノート: systemd-nspawn@.service は nspawn コンテナが /var/lib/machines にあることを想定したテンプレートユニットです。
ヒント:
  • 上記のようにコンテナを移動する代わりに、シンボリックリンクを作成することもできます: # ln -s ~/MyContainer /var/lib/machines/MyContainer
  • systemd-nspawn サービスは次のコマンドを実行します: /usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=guest --directory=/var/lib/machines/%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 を実行してください。

管理

machinectl

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

例:

  • 実行中のコンテナに新しいシェルを起動:
    $ machinectl login MyContainer
  • コンテナの詳細情報を表示:
    $ machinectl status MyContainer
  • コンテナを再起動:
    $ machinectl reboot MyContainer
  • コンテナを電源オフ:
    $ machinectl poweroff MyContainer
ヒント: シャットダウンや再起動は systemd の rebootshutdown コマンドをコンテナのセッションの中から実行することでも可能です。

systemd ツールチェイン

systemd のコアツールチェインは多くがコンテナでも使えるようにアップデートされています。コンテナの名前を引数とする -M, --machine= オプションをツールに付けるだけです。

例:

  • 特定のマシンの journal ログを表示:
    $ journalctl -M MyContainer
  • control group の中身を表示:
    $ systemd-cgls -M MyContainer
  • コンテナの起動時間を表示:
    $ systemd-analyze -M MyContainer

Tips

X 環境

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

外部の X サーバーにコンテナのセッションを接続するには DISPLAY 環境変数を設定する必要があります。

ネットワーク

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

nsswitch.conf

ホストからコンテナへの接続を楽にするために、コンテナの名前のローカル DNS 解決を有効にすることができます。/etc/nsswitch.confhosts: セクションに mymachines を追加してください:

hosts: files mymachines dns myhostname

こうすると、ホスト上でホストネーム foo の DNS ルックアップで /etc/hosts が参照され、それからローカルコンテナの名前、上流の DNS などが参照されます。

IP マスカレード

systemd には IP マスカレード (ネットワークアドレス変換) のサポートが組み込まれているため、IP アドレスを取得しなくてもホストで動作しているコンテナからインターネットにアクセスすることができます。この機能を有効にするには、ホストがパケットを転送するようにしてください:

# sysctl net.ipv4.ip_forward=1

そして以下のようなファイルを systemd-network 設定に追加してください。例えば /etc/systemd/network/50-containers.network などといった名前で保存します:

[Match]
Name=ve-*

[Network]
Address=0.0.0.0/28
IPMasquerade=yes
IPv4LL=yes
DHCPServer=yes
IPForward=yes

# systemctl restart systemd-networksystemd-network を再起動して、-n フラグを使ってコンテナを起動してください:

# systemd-nspawn -n -b -D MyContainer

systemd を使っていない環境で動作させる

Init#systemd-nspawn を見て下さい。

トラブルシューティング

root ログインが失敗する

ログインしようとしたときに以下が表示される場合:

arch-nspawn login: root
Login incorrect

そして journalctl が以下のように表示する場合:

pam_securetty(login:auth): access denied: tty 'pts/0' is not secure !

コンテナのファイルシステムから /etc/securetty を削除 してみてください。

参照