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

Pocket

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

 

さて実際の操作。

まずコンテナをつくる。

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

最後は一応の動作チェック。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でいじれるようにする。このままだと、

$ machinectl start cont
Machine image 'cont' does not exist.

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

$ 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

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

 

 

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

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

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

ホスト側:

$ 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

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

$ 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

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

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

 

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

$ 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

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

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

 

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

お茶漬け

たまーに飲み屋で食べるお茶漬けめちゃウマい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です