Photon OS (systemd-networkd) における静的 IP アドレス設定

非常に軽量な Linux ディストリビューションである Photon OS において、固定 (静的な) IP アドレスを設定する方法を紹介します。

ただし！
Photon OS に関しては、下記の記事で紹介しているような方法で、OVA デプロイと合わせて IP アドレスまで設定してしまう方が、圧倒的に楽です。

https://qiita.com/iwaseyusuke/items/7b2a76f4538df93ba792

そのため、この記事は、デプロイ後に IP アドレスを変更する場合や、2つ目以降の NIC に IP アドレスを設定する場合などを想定して、手順を記載します。


# 前提

執筆時点で、Photon OS は ver 4.0 を利用しています。

```sh
# cat /etc/photon-release
VMware Photon OS 4.0
PHOTON_BUILD_NUMBER=2f5aad892
```


# 手順

前述の通り、1つ目の NIC に関しては、もっと簡単に設定できる方法があるので、ここでは、2つ目の NIC `eth1` に IP アドレスを設定する場面を想定して、手順を記載します。


## 仮想 NIC の追加

まずは、対象の Photon OS の VM に、仮想 NIC を追加します。
ここでは、VM 展開時に作成した `Management-Network` に接続した NIC に加えて、`Workload-Network` に接続した NIC を追加しました。

![Screenshot 2023-02-02 at 11.50.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245234/b93797cc-81cc-ebda-0b22-b42959412983.png)

実際に、VM 内で NIC の存在を確認すると、`eth1` として、新たに NIC が追加されているのが分かります。

```sh
# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:50:56:93:36:0f brd ff:ff:ff:ff:ff:ff
    altname eno1
    altname enp11s0
    altname ens192
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
    link/ether 02:42:77:f3:b5:2a brd ff:ff:ff:ff:ff:ff
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:50:56:93:0e:e7 brd ff:ff:ff:ff:ff:ff
    altname eno2
    altname enp19s0
    altname ens224
```


## (参考) 設定ファイルの場所

Photon OS 4 では、`systemd-networkd` を使って、ネットワーク設定が管理されています。
そのため、NIC に IP アドレスを設定するには、network ファイルと呼ばれる設定ファイルを作成します。

まず、`systemd-networkd` では、ユーザーが作成する設定ファイルは `/etc/systemd/network` に格納します。
例えば、[前述の記事](https://qiita.com/iwaseyusuke/items/7b2a76f4538df93ba792)のように、`eth0` は、vSphere の仕組みを使って設定している場合、下記のようなファイルが、すでに配置されています。

```sh
# ls /etc/systemd/network
10-gosc-eth0.network  99-dhcp-en.network
```

先頭に数字が振られていますが、これはソートした時に、ファイル名が先に来る方が優先される設定となるため、先頭に番号を付けて分かりやすくしています。
この例では、`10-gosc-eth0.network` として、`eth0` に対する静的な IP アドレス設定の方が、`99-dhcp-en.network` に設定されている「デフォルトでは DHCP を有効化」よりも優先されるようになっています。


## network ファイルの作成

ここでは 2つ目の NIC として、`eth1` に IP アドレスを設定するので、例えば、`11-static-eth1.network` として作成していきます。
意味合いとしては、「vSphere の機能が作成した設定の優先度 (10) よりは低いが、DHCP 設定の優先度 (99) よりは高い優先度 (11) を設定し、静的に (static) に、`eth1` に IP アドレスを設定するファイル」としています。

まず、設定ファイルの格納場所まで移動します。

```sh
cd /etc/systemd/network
```

このディレクトリに、設定ファイル `11-static-eth1.network` を作成します。

```text:11-static-eth1.network
[Match]
Name=eth1

[Network]
DHCP=no
Address=172.19.31.201/24
```

上記の例では、2つ目の NIC なので、Gateway の設定や DNS に関する設定は省略しています。
もし、Gateway や DNS を設定する際には、下記のようになります。

```text:with Gateway + DNS
[Match]
Name=eth1

[Network]
DHCP=no
Address=172.19.31.201/24
Gateway=172.19.31.254
DNS=172.19.30.1
Domains=mylab.test
```

:::note warn
注意
ありがちなミスですが、network ファイルの権限が `644` であることを、しっかり確認してください。
よくあるのは、systemd-networkd が Read 権限が無く、設定が反映されないことがあります。

```sh
# ls -l 11-static-eth1.network
-rw-r--r-- 1 root root 145 MMM DD hh:mm 11-static-eth1.network
```

もし、違う権限になっていたら、権限の変更をしておいてください。

```sh
chmod 644 11-static-eth1.network
```
:::


## (参考) VLAN の設定

Photon OS は、vSphere などのクラウド環境に展開することが多いので、そこまで多いケースではないと思いますが、もし Guest OS 側で VLAN を設定したい場合、設定ファイルがちょっと多くなります。
詳細は、下記の記事で解説しています。

https://qiita.com/iwaseyusuke/items/1e8582e78455206d8a24


## 設定の反映

設定ファイルが正しく作成されていれば、あとは下記のコマンドで設定を反映させられます。

```sh
systemctl restart systemd-networkd
```

ただ、エラーした場合であっても、このコマンドには特に応答がありません。
なので、しっかりと status コマンドで、正しく反映されているか確認します。

```sh
systemctl status systemd-networkd
```

何かミスがあった場合、コマンド出力の後半に、ログとしてエラー内容が出力されるので、その内容を確認しながら、設定ファイルを修正します。


最後に、実際に、NIC に IP アドレスが振られていることを確認して、完了です。

```sh
# ip addr

...(snip)...

4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:93:0e:e7 brd ff:ff:ff:ff:ff:ff
    altname eno2
    altname enp19s0
    altname ens224
    inet 172.19.31.201/24 brd 172.19.31.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:fe93:ee7/64 scope link
       valid_lft forever preferred_lft forever
```


# 参考

Photon OS の公式ドキュメントについては、下記の `Setting a Static IP Address` の章を参照ください。

https://vmware.github.io/photon/docs/administration-guide/managing-network-configuration/setting-a-static-ip-address/

また、Photon OS で利用している `systemd-networkd` に関しては、Arch Linux のコミュニティの Wiki が非常に詳しく解説してありますので、参考になると思います。

https://wiki.archlinux.jp/index.php/Systemd-networkd