みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

yocto(jethro)でsystemd-networkdを有効化する

systemdを組み込んだだけだと、ネットワークインターフェイスが有効化されない。 systemdにはネットワークインターフェイスの設定を行うsystemd-networkdが存在するが、 yoctoのsystemdのレシピではデフォルトでは組み込まれない。

connmanを追加する方法もあるが、こちらはjethroではNFSやCIFSをブート時にマウントする際に問題があるため、systemd-networkdを有効化する方法を調査した。

systemd-networkdの有効化

local.confに下記を追加する。

PACKAGECONFIG_pn-systemd += " networkd"

ネットワークインターフェイスの設定

connmanと異なり、自動的にDHCPが有効になったりはしないので、設定ファイルを作成する必要がある。

DHCP

DHCPにより動的にIPアドレスを割り当てるには「/etc/systemd/network/wired.network」を下記の内容で作成する。

[Match]
Name=eth0

[Network]
DHCP=ipv4

スタティックIPアドレス

IPアドレスを静的に割り当てるには「/etc/systemd/network/wired.network」を下記の内容で作成する。

[Match]
Name=eth0

[Network]
Address=192.168.1.10/24

動作確認

$ systemctl status systemd-networkd.service
● systemd-networkd.service - Network Service
   Loaded: loaded (/lib/systemd/system/systemd-networkd.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Tue 2016-03-15 13:22:52 UTC; 7min ago
     Docs: man:systemd-networkd.service(8)
  Process: 142 ExecStart=/lib/systemd/systemd-networkd (code=exited, status=0/SUCCESS)
 Main PID: 142 (code=exited, status=0/SUCCESS)
   Status: "Shutting down..."

Mar 15 13:22:52 raspberrypi2 systemd[1]: systemd-networkd.service changed ru...m
Mar 15 13:22:52 raspberrypi2 systemd-networkd[142]: Got message type=signal s...
Mar 15 13:22:52 raspberrypi2 systemd-networkd[142]: Got message type=signal s...
Mar 15 13:22:52 raspberrypi2 systemd[1]: Got notification message for unit s...e
Mar 15 13:22:52 raspberrypi2 systemd[1]: systemd-networkd.service: Got notif...)
Mar 15 13:22:52 raspberrypi2 systemd[1]: systemd-networkd.service: got STOPP...1
Mar 15 13:22:52 raspberrypi2 systemd[1]: Child 142 belongs to systemd-networ...e
Mar 15 13:22:52 raspberrypi2 systemd[1]: systemd-networkd.service: main proc...S
Mar 15 13:22:52 raspberrypi2 systemd[1]: systemd-networkd.service changed st...d
Mar 15 13:22:52 raspberrypi2 systemd[1]: systemd-networkd.service: cgroup is...y
Hint: Some lines were ellipsized, use -l to show in full.

ネットワークインターフェイスの設定を行ったあとstatus=0/SUCCESSで終了している。

systemd-networkd.serviceを確認すると、下記のようになっているため正しい動作といえる。

[Service]
...
Restart=on-failure
...

ifconfigで確認すると、wired.networkの通りに設定されている。

$ ifconfig
eth0      Link encap:Ethernet  HWaddr B8:27:EB:A2:C7:F2  
          inet addr:192.168.21.100  Bcast:192.168.21.255  Mask:255.255.255.0
          inet6 addr: fe80::ba27:ebff:fea2:c7f2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1183 errors:0 dropped:0 overruns:0 frame:0
          TX packets:191 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:67116 (65.5 KiB)  TX bytes:32256 (31.5 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:6240 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6240 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:474240 (463.1 KiB)  TX bytes:474240 (463.1 KiB)