「Systemd-nspawn」の版間の差分
34行目: | 34行目: | ||
# pacstrap -i -c -d ~/MyContainer base [additional pkgs/groups] |
# pacstrap -i -c -d ~/MyContainer base [additional pkgs/groups] |
||
− | {{Tip| |
+ | {{Tip|{{ic|-i}} オプションはパッケージ選択の自動確認を無効にします。コンテナ上に Linux カーネルをインストールする必要はないため、パッケージリストの選択から[[Pacman#使い方|削除]]することができます。}} |
+ | インストールが完了したら、コンテナを起動してください ({{ic|-b}} はシェルを実行する代わりにコンテナを起動します (つまり PID=1 として {{ic|systemd}} を実行)。{{ic|-D}} にはコンテナのルートディレクトリにするディレクトリを指定します。{{ic|-n}} はホストとコンテナ間のプライベートネットワークを設定します): |
||
− | インストールが完了したら、コンテナを起動してください: |
||
− | # systemd-nspawn - |
+ | # systemd-nspawn -b -D ~/MyContainer -n |
これで終わりです。空のパスワードを使って "root" でログインしてください。 |
これで終わりです。空のパスワードを使って "root" でログインしてください。 |
||
47行目: | 47行目: | ||
コンテナを頻繁に使用したいのなら、マシンの [[Arch ブートプロセス|init]] で起動させるのが楽です。 |
コンテナを頻繁に使用したいのなら、マシンの [[Arch ブートプロセス|init]] で起動させるのが楽です。 |
||
− | # mv ~/MyContainer /var/lib/ |
+ | # mv ~/MyContainer /var/lib/machines/MyContainer |
# systemctl enable systemd-nspawn@MyContainer.service |
# systemctl enable systemd-nspawn@MyContainer.service |
||
# systemctl start systemd-nspawn@MyContainer.service |
# systemctl start systemd-nspawn@MyContainer.service |
||
− | {{Note| |
+ | {{Note|{{ic|systemd-nspawn@.service}} は nspawn コンテナが {{ic|/var/lib/machines}} にあることを想定したテンプレートユニットです。}} |
{{Tip| |
{{Tip| |
||
− | * 上記のようにコンテナを移動する代わりに、''シンボリックリンク''を作成することもできます: {{ic|# ln -s ~/MyContainer /var/lib/ |
+ | * 上記のようにコンテナを移動する代わりに、''シンボリックリンク''を作成することもできます: {{ic|# ln -s ~/MyContainer /var/lib/machines/MyContainer}}。 |
− | * ''systemd-nspawn'' サービスは次のコマンドを実行します: {{ic|<nowiki>/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=guest --directory=/var/lib/ |
+ | * ''systemd-nspawn'' サービスは次のコマンドを実行します: {{ic|<nowiki>/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=guest --directory=/var/lib/machines/%i</nowiki>}}。ディスクイメージファイルを使用したりコンテナに [[SELinux]] セキュリティを設定するために、コンテナのディレクトリから {{ic|/var/lib/container/MyCoantainer}} にシンボリックリンクが貼られていない場合、このファイルを修正してオプションを追加する必要があります。コンテナのネットワーク設定を分離させたい場合、[[systemd-networkd]] を参照してください。さらに詳しいブートオプションの情報は {{ic|systemd-nspawn(1)}} に載っています。 |
* {{ic|systemd-nspawn@.service}} を無効にすると、{{ic|# systemd-nspawn -bD /path/to/container}} を実行して手動でコンテナを起動することができます。コンテナにログインした後は、{{ic|# systemctl poweroff}} を実行すればシャットダウンします。 |
* {{ic|systemd-nspawn@.service}} を無効にすると、{{ic|# systemd-nspawn -bD /path/to/container}} を実行して手動でコンテナを起動することができます。コンテナにログインした後は、{{ic|# systemctl poweroff}} を実行すればシャットダウンします。 |
||
}} |
}} |
||
69行目: | 69行目: | ||
例: |
例: |
||
− | * 実行中のコンテナに新しいシェルを起動: {{bc|machinectl login MyContainer}} |
+ | * 実行中のコンテナに新しいシェルを起動: {{bc|$ machinectl login MyContainer}} |
− | * コンテナの詳細情報を表示: {{bc| machinectl status MyContainer}} |
+ | * コンテナの詳細情報を表示: {{bc|$ machinectl status MyContainer}} |
− | * コンテナを再起動: {{bc| machinectl reboot MyContainer}} |
+ | * コンテナを再起動: {{bc|$ machinectl reboot MyContainer}} |
− | * コンテナを電源オフ: {{bc| machinectl poweroff MyContainer}} |
+ | * コンテナを電源オフ: {{bc|$ machinectl poweroff MyContainer}} |
{{Tip|シャットダウンや再起動は systemd の {{ic|reboot}} や {{ic|shutdown}} コマンドをコンテナのセッションの中から実行することでも可能です。}} |
{{Tip|シャットダウンや再起動は systemd の {{ic|reboot}} や {{ic|shutdown}} コマンドをコンテナのセッションの中から実行することでも可能です。}} |
||
82行目: | 82行目: | ||
例: |
例: |
||
− | * 特定のマシンの journal ログを表示: {{bc| |
+ | * 特定のマシンの journal ログを表示: {{bc|$ journalctl -M MyContainer}} |
* control group の中身を表示: {{bc|$ systemd-cgls -M MyContainer}} |
* control group の中身を表示: {{bc|$ systemd-cgls -M MyContainer}} |
||
* コンテナの起動時間を表示: {{bc|$ systemd-analyze -M MyContainer}} |
* コンテナの起動時間を表示: {{bc|$ systemd-analyze -M MyContainer}} |
||
97行目: | 97行目: | ||
上で説明しているインストールでは、何も設定しなくてもネットワークが動作するコンテナが作られるので、追加の設定は必要ありません。もっと複雑なネットワークを設定してホストのネットワークからコンテナのネットワークを分離させたいときは、[[systemd-networkd]] を見て下さい。 |
上で説明しているインストールでは、何も設定しなくてもネットワークが動作するコンテナが作られるので、追加の設定は必要ありません。もっと複雑なネットワークを設定してホストのネットワークからコンテナのネットワークを分離させたいときは、[[systemd-networkd]] を見て下さい。 |
||
+ | |||
+ | ==== nsswitch.conf ==== |
||
+ | |||
+ | ホストからコンテナへの接続を楽にするために、コンテナの名前のローカル DNS 解決を有効にすることができます。{{ic|/etc/nsswitch.conf}} の {{ic|hosts:}} セクションに {{ic|mymachines}} を追加してください: |
||
+ | |||
+ | hosts: files mymachines dns myhostname |
||
+ | |||
+ | こうすると、ホスト上でホストネーム {{ic|foo}} の DNS ルックアップで {{ic|/etc/hosts}} が参照され、それからローカルコンテナの名前、上流の DNS などが参照されます。 |
||
+ | |||
+ | ==== IP マスカレード ==== |
||
+ | |||
+ | systemd には IP マスカレード (ネットワークアドレス変換) のサポートが組み込まれているため、IP アドレスを取得しなくてもホストで動作しているコンテナからインターネットにアクセスすることができます。この機能を有効にするには、ホストがパケットを転送するようにしてください: |
||
+ | |||
+ | # sysctl net.ipv4.ip_forward=1 |
||
+ | |||
+ | そして以下のようなファイルを {{ic|systemd-network}} 設定に追加してください。例えば {{ic|/etc/systemd/network/50-containers.network}} などといった名前で保存します: |
||
+ | |||
+ | [Match] |
||
+ | Name=ve-* |
||
+ | |||
+ | [Network] |
||
+ | Address=0.0.0.0/28 |
||
+ | IPMasquerade=yes |
||
+ | IPv4LL=yes |
||
+ | DHCPServer=yes |
||
+ | IPForward=yes |
||
+ | |||
+ | {{ic|# systemctl restart systemd-network}} で {{ic|systemd-network}} を再起動して、{{ic|-n}} フラグを使ってコンテナを起動してください: |
||
+ | |||
+ | # systemd-nspawn -n -b -D MyContainer |
||
=== non-systemd を使っていない環境で動作させる === |
=== non-systemd を使っていない環境で動作させる === |
2015年6月27日 (土) 22:46時点における版
systemd-nspawn は chroot コマンドに似ていますが、chroot を強化したものです。
systemd-nspawn を使えば軽量な名前空間コンテナでコマンドや OS を実行することができます。ファイルシステム構造だけでなく、プロセスツリーや様々な IPC サブシステム、ホスト・ドメイン名も完全に仮想化するため chroot よりも強力です。
systemd-nspawn は /sys
, /proc/sys
, /sys/fs/selinux
などのコンテナの様々なカーネルインターフェイスへのアクセスを読み取り専用に制限します。コンテナの中からネットワークインターフェイスやシステムクロックを変更することは出来ません。デバイスノードを作成することも不可能です。コンテナの中からホスト環境を再起動することはできず、カーネルモジュールをロードすることも制限されます。
仕組みとしては Lxc-systemd や Libvirt-lxc と異なり、とてもシンプルなツールで設定を行います。
目次
インストール
systemd-nspawn は systemd に含まれています。
サンプル
コンテナに最小限の Arch Linux ディストリビューションを作成して起動
まず公式リポジトリからパッケージ arch-install-scripts をインストールしてください。
そして、お好きな場所にディレクトリを作成してください。例えば: $ mkdir ~/MyContainer
。
pacstrap を使って最小限の arch システムをコンテナにインストールします。最低限でも base グループはインストールする必要があります。
# pacstrap -i -c -d ~/MyContainer base [additional pkgs/groups]
インストールが完了したら、コンテナを起動してください (-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
control group の中身を表示したい場合は、$ systemd-cgls
を実行してください。
管理
machinectl
コンテナの管理は原則 $ machinectl
コマンドで行います。このサービスを使って仮想マシンやコンテナの状態を確認したり操作します。オプションの詳細なリストは machinectl(1)
を参照してください。
例:
- 実行中のコンテナに新しいシェルを起動:
$ machinectl login MyContainer
- コンテナの詳細情報を表示:
$ machinectl status MyContainer
- コンテナを再起動:
$ machinectl reboot MyContainer
- コンテナを電源オフ:
$ machinectl poweroff MyContainer
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.conf
の hosts:
セクションに 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-network
で systemd-network
を再起動して、-n
フラグを使ってコンテナを起動してください:
# systemd-nspawn -n -b -D MyContainer
non-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 を削除 してみてください。