「Systemd-nspawn」の版間の差分
41行目: | 41行目: | ||
これで終わりです。空のパスワードを使って "root" でログインしてください。 |
これで終わりです。空のパスワードを使って "root" でログインしてください。 |
||
+ | コンテナの電源を切りたいときはコンテナの中から {{ic|poweroff}} を実行することで出来ます。ホストからは、[[#machinectl|machinectl]] ツールでコンテナを制御できます。 |
||
− | セッションを終了するには {{ic|Ctrl}} を押しながら {{ic|]}} を3回押してください。コンテナは実行し続けますが、セッションは終了します。 |
||
+ | |||
+ | {{Note|コンテナの中からコンテナを終了するには {{ic|Ctrl}} を押しながら {{ic|]}} を素早く3回押してください。}} |
||
=== マシンのブート時にコンテナを起動する === |
=== マシンのブート時にコンテナを起動する === |
||
− | コンテナを頻繁に使用 |
+ | コンテナを頻繁に使用する場合、ブート時に systemd でコンテナを起動できます。まず {{ic|systemd}} ターゲットの {{ic|machines.target}} を有効化してください: |
+ | |||
+ | # systemctl enable machines.target |
||
+ | |||
+ | それから以下を実行してください: |
||
# mv ~/MyContainer /var/lib/machines/MyContainer |
# mv ~/MyContainer /var/lib/machines/MyContainer |
||
74行目: | 80行目: | ||
* コンテナを電源オフ: {{bc|$ machinectl poweroff MyContainer}} |
* コンテナを電源オフ: {{bc|$ machinectl poweroff MyContainer}} |
||
− | {{Tip| |
+ | {{Tip|電源オフや再起動は ''systemctl'' の {{ic|reboot}} や {{ic|poweroff}} コマンドをコンテナのセッションの中から実行することでも可能です。}} |
=== systemd ツールチェイン === |
=== systemd ツールチェイン === |
||
85行目: | 91行目: | ||
* control group の中身を表示: {{bc|$ systemd-cgls -M MyContainer}} |
* control group の中身を表示: {{bc|$ systemd-cgls -M MyContainer}} |
||
* コンテナの起動時間を表示: {{bc|$ systemd-analyze -M MyContainer}} |
* コンテナの起動時間を表示: {{bc|$ systemd-analyze -M MyContainer}} |
||
+ | * リソース利用状況を表示: {{bc|$ systemd-cgtop}} |
||
== Tips == |
== Tips == |
||
93行目: | 100行目: | ||
外部の X サーバーにコンテナのセッションを接続するには {{ic|DISPLAY}} 環境変数を設定する必要があります。 |
外部の X サーバーにコンテナのセッションを接続するには {{ic|DISPLAY}} 環境変数を設定する必要があります。 |
||
+ | |||
+ | === nspawn コンテナの中で Firefox を実行 === |
||
+ | |||
+ | [[Firefox 設定#nspawn コンテナの中で Firefox を実行]]を見て下さい。 |
||
=== ネットワーク === |
=== ネットワーク === |
||
+ | 基本的な [[systemd-networkd]] のホストとコンテナの {{ic|.network}} ファイルは https://github.com/systemd/systemd/tree/master/network にあります。 |
||
− | 上で説明しているインストールでは、何も設定しなくてもネットワークが動作するコンテナが作られるので、追加の設定は必要ありません。もっと複雑なネットワークを設定してホストのネットワークからコンテナのネットワークを分離させたいときは、[[systemd-networkd]] を見て下さい。 |
||
+ | |||
+ | systemd-nspawn の -n スイッチで pacstrap と {{ic|# systemctl enable [[systemd-networkd]]}} が実行された後に、コンテナの {{ic|.network}} を手動で設定して仮想イーサネットリンクをセットアップしてください。コンテナに {{ic|/etc/resolv.conf}} を作成して DNS サーバーの IP を記述するのを忘れずに。 |
||
+ | |||
+ | もっと複雑なネットワークを設定する方法は、[[systemd-networkd#コンテナでの使用方法]] を見て下さい。 |
||
==== nsswitch.conf ==== |
==== nsswitch.conf ==== |
||
106行目: | 121行目: | ||
こうすると、ホスト上でホストネーム {{ic|foo}} の DNS ルックアップで {{ic|/etc/hosts}} が参照され、それからローカルコンテナの名前、上流の DNS などが参照されます。 |
こうすると、ホスト上でホストネーム {{ic|foo}} の DNS ルックアップで {{ic|/etc/hosts}} が参照され、それからローカルコンテナの名前、上流の DNS などが参照されます。 |
||
− | ==== |
+ | ==== ホストのネットワークを使用 ==== |
+ | |||
+ | {{ic|machinectl start MyContainer}} で起動したコンテナによって使用されるプライベートネットワークを無効化するには {{ic|systemd-nspawn}} サービスファイルを編集してください。{{ic|--network-veth}} パラメータを削除します: |
||
+ | |||
+ | {{hc|/etc/systemd/system/systemd-nspawn@.service|<nowiki> |
||
+ | ... |
||
+ | [Service] |
||
+ | #ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --network-veth --machine=%I |
||
+ | ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --machine=%I |
||
+ | ... |
||
+ | </nowiki>}} |
||
+ | 次に起動したコンテナはホストのネットワークを使用するようになります。 |
||
− | systemd には IP マスカレード (ネットワークアドレス変換) のサポートが組み込まれているため、IP アドレスを取得しなくてもホストで動作しているコンテナからインターネットにアクセスすることができます。この機能を有効にするには、ホストがパケットを転送するようにしてください: |
||
+ | ==== 仮想イーサネットインターフェイス ==== |
||
− | # sysctl net.ipv4.ip_forward=1 |
||
+ | コンテナを {{ic|systemd-nspawn ... -n}} で起動した場合、systemd は自動的にホストとコンテナに仮想イーサネットインターフェイスを作成して、仮想イーサネットケーブルで接続します。 |
||
− | そして以下のようなファイルを {{ic|systemd-network}} 設定に追加してください。例えば {{ic|/etc/systemd/network/50-containers.network}} などといった名前で保存します: |
||
+ | コンテナの名前が {{ic|foo}} ならば、仮想イーサネットインターフェイスのホストにおける名前は {{ic|ve-foo}} になり、コンテナではどんな場合でも名前は {{ic|host0}} です。 |
||
− | [Match] |
||
− | Name=ve-* |
||
− | |||
− | [Network] |
||
− | Address=0.0.0.0/28 |
||
− | IPMasquerade=yes |
||
− | IPv4LL=yes |
||
− | DHCPServer=yes |
||
− | IPForward=yes |
||
+ | {{ic|ip link}} でインターフェイスを確認すると、インターフェイスの名前には {{ic|ve-foo@if2}} や {{ic|host0@if9}} のように接尾辞が付きます。{{ic|@ifN}} は実際はインターフェイスの名前には含まれていません。仮想イーサネットケーブルが他の端末に接続されていることを示すために {{ic|ip link}} によって情報が加えられています。 |
||
− | {{ic|# systemctl restart systemd-network}} で {{ic|systemd-network}} を再起動して、{{ic|-n}} フラグを使ってコンテナを起動してください: |
||
+ | 例えば、ホストの仮想イーサネットインターフェイス {{ic|ve-foo@if2}} がコンテナ {{ic|foo}} に接続、コンテナの中の2番目のネットワークインターフェイスに接続する場合、コンテナの中から {{ic|ip link}} を実行するとインデックス 2 が付きます。同じように、コンテナの {{ic|host0@if9}} という名前のインターフェイスはホストの9番目のインターフェイスに接続します。 |
||
− | # systemd-nspawn -n -b -D MyContainer |
||
=== systemd を使っていない環境で動作させる === |
=== systemd を使っていない環境で動作させる === |
||
144行目: | 161行目: | ||
pam_securetty(login:auth): access denied: tty 'pts/0' is not secure ! |
pam_securetty(login:auth): access denied: tty 'pts/0' is not secure ! |
||
− | コンテナのファイルシステム |
+ | コンテナのファイルシステム上にある {{ic|/etc/securetty}} のターミナル名のリストに {{ic|pts/0}} を追加してください。詳しくは [http://unix.stackexchange.com/questions/41840/effect-of-entries-in-etc-securetty/41939#41939] を参照。 |
== 参照 == |
== 参照 == |
||
152行目: | 169行目: | ||
* [http://lwn.net/Articles/572957/ Creating containers with systemd-nspawn] |
* [http://lwn.net/Articles/572957/ Creating containers with systemd-nspawn] |
||
* [https://www.youtube.com/results?search_query=systemd-nspawn&aq=f Lennart Pottering による systemd-nspawn のプレゼンテーション] |
* [https://www.youtube.com/results?search_query=systemd-nspawn&aq=f Lennart Pottering による systemd-nspawn のプレゼンテーション] |
||
+ | * [http://dabase.com/e/12009/ Running Firefox in a systemd-nspawn container] |
2015年10月11日 (日) 23:18時点における版
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" でログインしてください。
コンテナの電源を切りたいときはコンテナの中から poweroff
を実行することで出来ます。ホストからは、machinectl ツールでコンテナを制御できます。
マシンのブート時にコンテナを起動する
コンテナを頻繁に使用する場合、ブート時に systemd でコンテナを起動できます。まず systemd
ターゲットの machines.target
を有効化してください:
# systemctl enable machines.target
それから以下を実行してください:
# 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
- リソース利用状況を表示:
$ systemd-cgtop
Tips
X 環境
新しいコンテナで X アプリケーションを動かす必要がある場合は Xhost を見て下さい。
外部の X サーバーにコンテナのセッションを接続するには DISPLAY
環境変数を設定する必要があります。
nspawn コンテナの中で Firefox を実行
Firefox 設定#nspawn コンテナの中で Firefox を実行を見て下さい。
ネットワーク
基本的な systemd-networkd のホストとコンテナの .network
ファイルは https://github.com/systemd/systemd/tree/master/network にあります。
systemd-nspawn の -n スイッチで pacstrap と # systemctl enable systemd-networkd
が実行された後に、コンテナの .network
を手動で設定して仮想イーサネットリンクをセットアップしてください。コンテナに /etc/resolv.conf
を作成して DNS サーバーの IP を記述するのを忘れずに。
もっと複雑なネットワークを設定する方法は、systemd-networkd#コンテナでの使用方法 を見て下さい。
nsswitch.conf
ホストからコンテナへの接続を楽にするために、コンテナの名前のローカル DNS 解決を有効にすることができます。/etc/nsswitch.conf
の hosts:
セクションに mymachines
を追加してください:
hosts: files mymachines dns myhostname
こうすると、ホスト上でホストネーム foo
の DNS ルックアップで /etc/hosts
が参照され、それからローカルコンテナの名前、上流の DNS などが参照されます。
ホストのネットワークを使用
machinectl start MyContainer
で起動したコンテナによって使用されるプライベートネットワークを無効化するには systemd-nspawn
サービスファイルを編集してください。--network-veth
パラメータを削除します:
/etc/systemd/system/systemd-nspawn@.service
... [Service] #ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --network-veth --machine=%I ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --machine=%I ...
次に起動したコンテナはホストのネットワークを使用するようになります。
仮想イーサネットインターフェイス
コンテナを systemd-nspawn ... -n
で起動した場合、systemd は自動的にホストとコンテナに仮想イーサネットインターフェイスを作成して、仮想イーサネットケーブルで接続します。
コンテナの名前が foo
ならば、仮想イーサネットインターフェイスのホストにおける名前は ve-foo
になり、コンテナではどんな場合でも名前は host0
です。
ip link
でインターフェイスを確認すると、インターフェイスの名前には ve-foo@if2
や host0@if9
のように接尾辞が付きます。@ifN
は実際はインターフェイスの名前には含まれていません。仮想イーサネットケーブルが他の端末に接続されていることを示すために ip link
によって情報が加えられています。
例えば、ホストの仮想イーサネットインターフェイス ve-foo@if2
がコンテナ foo
に接続、コンテナの中の2番目のネットワークインターフェイスに接続する場合、コンテナの中から ip link
を実行するとインデックス 2 が付きます。同じように、コンテナの host0@if9
という名前のインターフェイスはホストの9番目のインターフェイスに接続します。
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
のターミナル名のリストに pts/0
を追加してください。詳しくは [1] を参照。