お茶漬けぶろぐ

systemd-nspawnでコンテナをブリッジ接続する

2017/02/18 /var/lib/machinesの所在についてを追記

systemd-nspawnが何かはsystemd-nspawn - ArchWikiを見ていただくとして。

systemd-nspawnはネットワークに関して何も指定せず起動すると、ホストと共通のネットワークになる。同じIPアドレスを持つ、みたいな感じ。特に何も考えなくて済むので楽と言えば楽だけど、コンテナを仮想マシンみたいな感覚で触ろうと思うと、なかなかキツい。sshのポート変えれば区別出来るけど、みたいな状況になってしまう。

-n(–network-veth)オプションをつけると、ホスト・コンテナ双方に仮想イーサネットインターフェイスを作成して、これを接続する。ホストの下に新たにネットワークを作るようなものなので、お隣のパソコンからコンテナにアクセスしようとすると、きちんとルーティングしたりIPマスカレードしたりとかしないといけないっぽい。(それで出来るかは未確認)

既存のLANにコンテナが参加出来れば、つまりホストを通してブリッジ接続出来れば、まさしく仮想的に新たなマシンを起こした感覚で操作出来る。これが一番従来通りの感覚で操作できて、お話が簡単なはずだ。

ネットワークは、
ホームルータ(ゲートウェイ、DNS):192.168.0.1
ホスト:192.168.0.3
コンテナ:192.168.0.10
ホストに接続されてるインターフェイス:enp6s0
という事にしてみよう。

参考サイト:

まとめて面倒見てくれる勢いのsystemd(隔離とネットワーク) - GeeksDev [archive]

systemd-nspawn - ArchWiki

systemd-networkd - ArchWiki

さて実際の操作。

まずコンテナをつくる。

[bash]
$ sudo pacman -S arch-install-scripts
$ mkdir cont
$ sudo pacstrap -i -c -d ./cont base –ignore linux
$ sudo systemd-nspawn -bnD ./cont
[/bash]

最後は一応の動作チェック。root(パスワード無し)でログインする。

systemd-nspawnからログインした場合はいいけど、後でさわるmachinectlからloginしようとすると、Login incorrectで怒られる。で、journalctl -xe -M contみたいな感じで当該コンテナのメッセージを見て、access denied: tty ‘pts/0’ is not secure!みたいに書いてあったら、コンテナ内の/etc/securettyにpts/0を追加すればイケるはず。

問題なさそうならpoweroffで帰ってこよう。

次にmachinectlでいじれるようにする。このままだと、

[bash]
$ machinectl start cont
Machine image ‘cont’ does not exist.
[/bash]

はい。所定の場所にmvします。machinectl image-statusあたりで調べられる。

[bash]
$ machinectl image-status
Path: /var/lib/machines
$ sudo mv ./cont /var/lib/machines/cont
$ machinectl list-images
NAME TYPE RO USAGE CREATED MODIFIED
cont directory no n/a n/a n/a
$ machinectl start cont
$ machinectl login cont
[/bash]

正しく起動出来てログイン出来ていればおk。systemctl status systemd-nspawn@contを見れば正常に起動しているのが見えてくるはず。

つぎ、仮想ブリッジをつくるぞ~。

ホスト、コンテナ両方で以下をやっておいて、余計な接続をしないようにしておく。

[bash]
$ sudo ln -sf /dev/null /etc/systemd/network/80-container-host0.network
[/bash]

ホスト側:

[bash]
$ cat /etc/systemd/network/br0.netdev
[NetDev]
Name=br0
Kind=bridge

$ cat /etc/systemd/network/br0.network
[Match]
Name=br0

[Network]
DNS=192.168.0.1
Address=192.168.0.3/24
Gateway=192.168.0.1

$ cat /etc/systemd/network/eth.network
[Match]
Name=enp6s0

[Network]
Bridge=br0
[/bash]

次にコンテナにブリッジbr0を利用するように設定する。よくわかんなかったのでsystemctl status systemd-nspawn@contしたら見えたファイルをいじったのであった。

[bash]
$ cat /usr/lib/systemd/system/systemd-nspawn@.service | grep ExecStart
#ExecStart=/usr/bin/systemd-nspawn –quiet –keep-unit –boot –link-journal=try-guest –network-veth -U –settings=override –machine=%i
ExecStart=/usr/bin/systemd-nspawn –quiet –keep-unit –boot –link-journal=try-guest –network-bridge=br0 -U –settings=override –machine=%i
[/bash]

1行目はもとあったもので、–network-vethがついている。(コメントアウトした)

2行目は–network-vethを–network-bridge=br0に差し替えたもの。

最後にコンテナ内をいじる。

[bash]
$ cat /etc/systemd/network/host0.network
[Match]
Name=host0

[Network]
DNS=192.168.0.1
Address=192.168.0.10/24
Gateway=192.168.0.1
[/bash]

最後に、てきとうにsystemd-networkdをstartしたりenableしたりしておく。

以上まででブリッジ接続出来ているはず。コンテナ、ホスト、お隣のパソコンの3者からお互いにアクセス出来る。

これで鯖を新調して仮想化ドヤァ出来るようになったぞ!あとはお金を貯めるだけだ(しろめ)

< distccでmakepkgの高速化を狙う

鯖の構成見直し >