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]
さて実際の操作。
まずコンテナをつくる。
[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者からお互いにアクセス出来る。
これで鯖を新調して仮想化ドヤァ出来るようになったぞ!あとはお金を貯めるだけだ(しろめ)