Macとsystemd-nspawnで普通の開発環境を作るまで(1)～ネットワーク設定～


# 概要

systemd-nspawnをMacBook Airで使うまでに行った設定をまとめておきます。
もっといい方法や、間違っている箇所等あれば教えてくれると嬉しいですm( _ _ )m。

# 必要なソフトの準備

今回は、Virtualboxを使用します。

今回使用したバージョンは以下の通りです。

- MacOS Sierra 10.12.6
- Virtualbox 5.1.28
- Ubuntu Server 16.04.3 LTS

Virtualboxには [Ubuntu Server 16.04.3 LTS](https://www.ubuntu.com/download/server) をインストールしていますが、16.04以降であれば基本的に変わらないかと思います。

# 今回作成するネットワーク

![network.png](https://qiita-image-store.s3.amazonaws.com/0/106549/667d5350-e9f5-ce2e-0f42-18495eab4e4b.png)

こんな感じでホストから外への接続も許して、MacBook側からはIPアドレス直打ちで（ポートフォワーディング無しで）繋がるようにします。

# VirtualBox設定

まずホストオンリーネットワークを作成します
Virtualbox -> 環境設定 -> ネットワーク -> ホストオンリーネットワーク
と進み右端の追加ボタンから追加します
![hostonly1.png](https://qiita-image-store.s3.amazonaws.com/0/106549/ef7c4cef-6b91-a7e0-b586-d0477bf81857.png)
DHCPサーバのチェックは外しておきます
![hostonly2.png](https://qiita-image-store.s3.amazonaws.com/0/106549/70c00fb6-c548-80ce-a11d-22779618ec69.png)

設定が終わったら今度はVirtualBoxマネージャ窓から、仮想マシンを選んで
設定-> ネットワーク -> アダプター１を選択してNATにします

![adapter01.png](https://qiita-image-store.s3.amazonaws.com/0/106549/6d7f6a8c-2a74-0c44-3e40-8e220bb892d2.png)

アダプター２は先ほど作ったホストオンリーネットワークを選びます
**※プロミスキャスモードをすべて許可にするのも忘れないで下さい**

![adapter02r.png](https://qiita-image-store.s3.amazonaws.com/0/106549/9f2ca0d0-438b-d3ca-5606-839aebe8b5a3.png)

# ホスト設定

今回手元の仮想マシンでは`ip a` コマンドで確認すると以下のようになったので

```
root@ubuntu-host:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:da:56:4b brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:feda:564b/64 scope link
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 08:00:27:92:0c:e2 brd ff:ff:ff:ff:ff:ff
```

- enp0s3 : アダプター１(NAT) 
- enp0s8 : アダプター２(ホストオンリーネットワーク)

として設定します
インターフェイス名は各自の環境に読み替えてください
※DHCPで既にIPアドレスが設定されている方がNATです

```bash
# 必要パッケージのインストール
apt update
apt install iptables systemd-container bridge-utils
# ブリッジ設定
curl -L https://goo.gl/MU1SDV > /etc/network/interfaces
# IPマスカレード設定
curl -L https://goo.gl/dkVBLf > /etc/network/if-pre-up.d/systemd-nspawn
chmod +x /etc/network/if-pre-up.d/systemd-nspawn
# 転送許可
curl -L https://goo.gl/JV9AZP > /etc/sysctl.conf
# 再起動
shutdown -r now
```

# コンテナ設定

```bash
# コンテナの用意
apt install debootstrap
cd /var/lib/machines
debootstrap --arch amd64 xenial ./ubuntu http://archive.ubuntu.com/ubuntu
# ホスト名を変える
echo ubuntu-guest > ubuntu/etc/hostname
perl -i -ple 's/^(127.0.0.1\slocalhost).*/$1 ubuntu-guest/' ubuntu/etc/hosts
# ネットワーク設定
curl -L https://goo.gl/2Zf3gu > ubuntu/etc/network/interfaces.d/host0
# コンテナ内に一度入ってrootパスワードを設定する
systemd-nspawn -D ./ubuntu
    # ↓ここはコンテナ内で打つコマンド
    passwd
    # 好きなパスワードを設定する
    exit
    # ↑ここまでコンテナ内
```

これで完成です
以下のコマンドで電源を押したみたいに起動すると思います


```bash
# 起動
systemd-nspawn -D ./ubuntu --network-bridge=br0 -b
```

コンテナ内にはrootユーザで先ほど設定したパスワードでログインできるかと思います
以降普通の仮想マシンのように使えます


```bash
# パッケージリスト更新
apt update
# nginxインストール後に自動的に立ち上がる
# http://192.168.56.3/ でアクセスできるはす
apt install nginx

# 終了するときはshutdownコマンドで
# ( Ctrl+] を3回押しても終了する )
shutdown -h now
```

次回: [Macとsystemd-nspawnで普通の開発環境を作るまで(2)～起動設定～](https://qiita.com/yaasita/items/78271deb8fcb6cee0a14)