「Systemd-nspawn」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
41行目: 41行目:
 
これで終わりです。空のパスワードを使って "root" でログインしてください。
 
これで終わりです。空のパスワードを使って "root" でログインしてください。
   
  +
コンテナの電源を切りたいときはコンテナの中から {{ic|poweroff}} を実行することで出来ます。ホストからは、[[#machinectl|machinectl]] ツールでコンテナを制御できます。
セッションを終了するには {{ic|Ctrl}} を押しながら {{ic|]}} を3回押してください。コンテナは実行し続けますが、セッションは終了します。
 
  +
  +
{{Note|コンテナの中からコンテナを終了するには {{ic|Ctrl}} を押しながら {{ic|]}} を素早く3回押してください。}}
   
 
=== マシンのブート時にコンテナを起動する ===
 
=== マシンのブート時にコンテナを起動する ===
   
コンテナを頻繁に使用したいのならマシンの [[Arch ブートプロセス|init]] で起動させるのが楽です。
+
コンテナを頻繁に使用する場合、ブート時に 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|シャットダウンや再起動は systemd の {{ic|reboot}} や {{ic|shutdown}} コマンドをコンテナのセッションの中から実行することでも可能です。}}
+
{{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 などが参照されます。
   
==== IP マカレ ====
+
==== トのネットワクを使用 ====
  +
  +
{{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 !
   
コンテナのファイルシステムから [http://unix.stackexchange.com/questions/41840/effect-of-entries-in-etc-securetty/41939#41939 /etc/securetty を削除] してみてください
+
コンテナのファイルシステム上にある {{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-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" でログインしてください。

コンテナの電源を切りたいときはコンテナの中から poweroff を実行することで出来ます。ホストからは、machinectl ツールでコンテナを制御できます。

ノート: コンテナの中からコンテナを終了するには Ctrl を押しながら ] を素早く3回押してください。

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

コンテナを頻繁に使用する場合、ブート時に 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
ノート: 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
ヒント: 電源オフや再起動は systemctlrebootpoweroff コマンドをコンテナのセッションの中から実行することでも可能です。

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.confhosts: セクションに 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@if2host0@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] を参照。

参照