Photon OS は、クラウド環境に最適化された非常に軽量でミニマリストな Linux OS です。
簡単ですが、こちらの記事の冒頭で紹介をしております。
主に仮想環境向けの Linux OS なので、タイトルにあるような「Guest OS 側で、直接 VLAN 設定したい」というシーンは多くは無いと思います。
しかし、たま〜に必要になって、毎回調べるのも面倒なので、備忘として書き残しておきます。
設定ファイルの場所
systemd-networkd
の設定ファイル1は、/etc/systemd/network
に配置されていますので、まずは、このディレクトリまで移動します。
cd /etc/systemd/network
設定ファイルの種類
systemd-networkd
には、複数種類の設定ファイルがありますが、今回は下記の2種類の設定ファイルを作成します。
-
.network
- [Match] で指定した条件に合致するデバイスに、IP Address や Gateway、DNS などを設定。
-
.netdev
- 指定された条件で仮想ネットワークデバイスを作成。
今回は、eth0
のサブインタフェースとして、VLAN 31 を振った eth0.31
という仮想ネットワークデバイスを作成し、この eth0.31
に IP Address や Gateway、DNS を設定していきます。
そのため、.network
ファイルが eth0
と eth0.31
で2つ、.netdev
ファイルが eth0.31
で1つ、合計3つのファイルを作成します。
一方で、VLAN を割り当てず、普通に IP Address を振るだけであれば、.network
ファイルを1つ作成すれば良いです。
具体的な設定
まず、親のインタフェース eth0
に、VLAN のサブインタフェースがあることを教えるための .network
ファイルを作成します。
cat << EOF > 10-eth0.network
[Match]
Name=eth0
[Network]
VLAN=eth0.31
EOF
次に、VLAN 31 を振った仮想ネットワークデバイス eth0.31
を作るための .netdev
ファイルを作成します。
cat << EOF > 10-eth0.31.netdev
[NetDev]
Name=eth0.31
Kind=vlan
[VLAN]
Id=31
EOF
さらに、作成された eth0.31
の仮想ネットワークデバイスに IP Address や Gateway、DNS を設定するための .network
ファイルを作成します。
cat << EOF > 10-eth0.31.network
[Match]
Name=eth0.31
[Network]
Address=172.19.31.80/24
Gateway=172.19.31.254
DNS=8.8.8.8
EOF
最後に!設定ファイルの権限に注意してください!
権限が 644
になっていないと、この後の手順で、設定を反映させようとしてエラーとなります。
chmod 644 10-eth0*.{network,netdev}
補足: 設定ファイル名について
設定ファイル名を 番号-デバイス名.拡張子
としておりますが、ルールが存在しております。
systemd-networkd
では、同じディレクトリに複数の設定ファイルがある場合、ファイル名を A -> Z でソートした際に、より先に来るファイルの設定が優先されます。
そのため、同じディレクトリに、こんな感じでファイルがあった場合、
10-eth0.network
99-dhcp-en.network
10-eth0.network
で、eth0
に固定 IP アドレスを振りつつ、それ以外のインタフェースについては、デフォルトで DHCP を有効化する、という設定が可能になります。
設定の反映
systemd-networkd
を再起動させて、設定を反映させます。
systemctl restart systemd-networkd.service
ip
コマンドで、設定が反映されていることを確認します。
# ip a
...(snip)...
3: eth0.31@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:50:56:93:98:1c brd ff:ff:ff:ff:ff:ff
inet 172.19.31.80/24 brd 172.19.31.255 scope global eth0.31
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fe93:981c/64 scope link
valid_lft forever preferred_lft forever
補足: トラブルシュートの入口について
ip
コマンドで確認しても、意図した設定が反映されていない場合、まずは、systemd-networkd
のステータスを確認し、そこに表示されるログを見ることが糸口となります。
systemctl status systemd-networkd.service
参考
-
正確には、システムが提供する設定ファイルが格納されるディレクトリ
/usr/lib/systemd/network
、一時的な実行時の設定ファイルが格納されるディレクトリ/run/systemd/network
、そして/etc/systemd/network
の順で読み込まれます。後から読み込まれた設定が上書きしていく仕組みです。 ↩