archlinuxでsystemdを使ってnetworkを設定する[systemd-networkd]

```sh
$ sudo systemctl list-unit-files --no-pager |grep -e network

$ sudo systemctl start systemd-networkd　

$ ls /sys/class/net
eth0
wlan0

$ sudo vim /etc/systemd/network/eth0.network
[Match]
Name=eth0
[Network]
Address=192.168.x.x/x
Gateway=192.168.x.1
DNS=192.168.x.1

$ sudo cp /etc/systemd/network/eth0.network /etc/systemd/network/wlan0.network
$ sudo vim !$
- Name=eth0
+ Name=wlan0

$ sudo systemctl restart systemd-networkd

# wifiのdeviceが起き上がってない場合の処理
$ ip link set wlan0 up
```

もしローカルIPを動的にする場合は、 ｀sudo systemctl start dhcpcd｀ とかして ｀/etc/systemd/network｀ 以下の設定ファイルに

```sh
[Match]
Name=eth0

[Network]
#DHCP=ipv4 
DHCP=yes
```

と書きます。その際は、ゲートウェイとDNSとかは削除します。Nameはwifiの場合、`wlan0`などになります。

設定が完了しているかどうかは、以下のコマンドで確認します。関係ありませんが、`systemd-resolved`を使ってみてもいいかもしれません。

```sh
$ ip a
$ sudo systemctl status systemd-networkd
$ sudo systemctl status systemd-resolved
```

設定を永続化するには、以下です。

```sh
$ sudo systemctl enable systemd-networkd
# sudo systemctl daemon-reload
```

wifiを永続化するのにちょっとハマりました。どうやら `systemctl enable wpa_supplicant`が必要みたいです。起動時には有効にならず `systemctl restart systemd-networkd`で有効になる現象に遭遇していました。

```sh
$ sudo vim /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
network={
    ssid="xxxxx"
    psk="xxxx"
}

$ sudo systemctl enable wpa_supplicant@wlan0
```

ssidなど調べるのが面倒なら `wifi-menu`などで作成したファイルなどから持ってくると良いです。あと、平文で保存されるのが嫌な場合は、以下のように暗号化して保存します。コメントの行は削除します。

```sh
$ sudo wpa_passphrase ssid pass > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
$ sudo chmod 600 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
```

wifiの自動起動の設定は[ArchWiki](https://wiki.archlinux.jp/index.php/%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9%E8%A8%AD%E5%AE%9A#.E3.82.AB.E3.82.B9.E3.82.BF.E3.83.A0.E3.82.B9.E3.82.BF.E3.83.BC.E3.83.88.E3.82.A2.E3.83.83.E3.83.97.E3.82.B9.E3.82.AF.E3.83.AA.E3.83.97.E3.83.88.E3.83.BB.E3.82.B5.E3.83.BC.E3.83.93.E3.82.B9)が参考になります。以下は、DHCPの設定です。IPを固定する場合は別の方法になります。これもArchWikiの下のほうに掲載されていますので参照してください。

```sh
$ sudo cp /etc/wpa_supplicant/wpa_supplicant-wlan0.conf /etc/wpa_supplicant.conf
$ sudo vim /etc/systemd/system/network-wireless@.service
```

```sh:/etc/systemd/system/network-wireless@.service
[Unit]
Description=Wireless network connectivity (%i)
Wants=network.target
Before=network.target
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/ip link set dev %i up
ExecStart=/usr/bin/wpa_supplicant -B -i %i -c /etc/wpa_supplicant.conf
ExecStart=/usr/bin/dhcpcd %i
ExecStop=/usr/bin/ip link set dev %i down
[Install]
WantedBy=multi-user.target
```

```sh
$ sudo systemctl enable network-wireless@wlan0.service
$ sudo systemctl start network-wireless@wlan0.service
```

細かい設定は、`/etc/systemd/system/network@.service`, `/usr/lib/systemd/system/systemd-networkd.*`などを見てみるといいかもしれませんね。


## 問題

新たな問題が出てきました。

色々やってみたのですが、接続できたりできなかったりで、主に `systemd-networkd` と `wpa_supplicant` なんですが、自分の環境ではどうやら具合が悪いのではないかという結論になってる。

まず、 `enable wpa_supplicant` すると、何故かwifiで接続できない状態が続いてしまう。
disableしてから、 `netctl start` すると普通に接続できるのですが、wpa_supplicantがenableされている状態では、たとえ、stopさせても、wlan0 downさせてもnetctl startで接続できなくなってしまう。

systemd-networkdのほうは、wifiの設定を入れると、eth0まで接続できなくなってしまうことがあるみたいです。


## その後

どうやら私の環境ではwifiは`DHCP`を書かないとうまく動作しないっぽい。有線は固定もできて接続もできるんだけど、それをwifiで設定すると、うまくいかないみたいです。

```sh:/etc/systemd/network/wlan0.network
DHCP=ipv4
#DHCP=yes
```