archLinux
systemd

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

$ 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` 以下の設定ファイルに

[Match]
Name=eth0

[Network]
#DHCP=ipv4 
DHCP=yes

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

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

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

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

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

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

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

$ sudo systemctl enable wpa_supplicant@wlan0

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

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

wifiの自動起動の設定はArchWikiが参考になります。以下は、DHCPの設定です。IPを固定する場合は別の方法になります。これもArchWikiの下のほうに掲載されていますので参照してください。

$ sudo cp /etc/wpa_supplicant/wpa_supplicant-wlan0.conf /etc/wpa_supplicant.conf
$ sudo vim /etc/systemd/system/network-wireless@.service
/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
$ 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-networkdwpa_supplicant なんですが、自分の環境ではどうやら具合が悪いのではないかという結論になってる。

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

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

その後

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

/etc/systemd/network/wlan0.network
DHCP=ipv4
#DHCP=yes