yocto(2.6 Thud)でRaspberry-pi Zero W - Step2 - 無線自動接続

# はじめに

[前回](https://qiita.com/ext_dada/items/1d39ca1f9e533a2fa008)にイメージビルドし起動まで確認できました。
今後のマイルストーンは以下のように考えています

1. yoctoでraspberry pi w zeroのイメージを作成
2. 起動時のwlan0自動接続のためレシピを追加　←　イマココ
3. 起動時のsshd自動起動
4. USB-LTEモジュールの接続とテスト
5. GPSモジュールの接続とテスト
6. soracom harvestで位置情報取得

今回は、自動接続のための設定を行います。

# 実施詳細

手順を順に示します。

## レイヤの追加

新規でレシピを編集するため、レシピを追加します。

```bash
$ cd ~/poky-thud/oe-init-build-env ~/yocto_raspberrypi-zero
$ bitbake-layers create-layers meta-raspberrypi-append
$ bitbake-layers add-layer meta-raspberrypi-append
```

以上の動作でbuildディレクトリ(今回は```~/yocto_raspberrypi-zero```)に```meta-raspberrypi-append```が作成されます。
この際、conf/bblayers.confには自動で追加されます(以下はhomedirを置換したあとのものです)

```diff
$ git diff
index 43baa06..4d1d090 100644
--- a/conf/bblayers.conf
+++ b/conf/bblayers.conf
@@ -14,4 +14,6 @@ BBLAYERS ?= " \
   ${HOME}/poky-thud/meta-openembedded/meta-perl \
   ${HOME}/poky-thud/meta-openembedded/meta-python \
   ${HOME}/poky-thud/meta-raspberrypi \
+  ${HOME}/yocto_raspberrypi_zero/meta-raspberrypi-append \
   "
diff --git a/conf/local.conf b/conf/local.conf
```

## /etc/network/interfaceの編集

/etc/network/interfaceの配置はrecipes-coreのinit-ifupdownにて行っているため、このレシピを編集します。
まずは```devtool```を用いてレシピ編集用のworkspaceを作成します。

```bash
$ cd ~/yocto_raspberrypi-zero
$ devtool status
$ ls -d ~/yocto_raspberrypi-zero/workspace/
```

```devtool modify```により既存のレシピを取得します

```
$ devtool modify init-ifupdown
$ tree -L
.
├── README
├── appends
│   └── init-ifupdown
├── conf
│   └── layer.conf
└── sources
    └── init-ifupdown
```

ソースファイルはsourcesに保管されているため、```source/ifupdown/interfaces```を前回通りに編集

```bash
$ cat workspace/source/ifupdown/interfaces
# The loopback interface
auto lo
iface lo inet loopback

# Wireless interfaces
allow-hotplug wlan0
iface wlan0 inet dhcp
	wpa-conf /etc/wpa_supplicant.conf
```

これらのファイルはgit管理されているため、```git diff```で変更内容を確認できます。
また、```git checkout .```等で状態を戻すことも可能です。

変更内容に問題がなければ```devtool finish```でレシピレイヤに追加します

```bash
$ devtool finish meta-raspberrypi-append
$ tree ~/yocto_raspberrypi_zero/meta-raspberrypi-append/
├── COPYING.MIT
├── README
├── conf
│   └── layer.conf
└── recipes-core
    └── init-ifupdown
        ├── init-ifupdown
        │   └── interfaces
        └── init-ifupdown_%.bbappend
```

最後に、conf/local.confにてインストール対象として```init-ifupdown```を追加すれば良い

```diff
dada@dada-VirtualBox:~/yocto_raspberrypi_zero$ git diff
diff --git a/conf/bblayers.conf b/conf/bblayers.conf
index 648e3a0..089a362 100644
--- a/conf/local.conf
+++ b/conf/local.conf
@@ -31,7 +31,7 @@ PARALLEL_MAKE = "-j 12"
 
 CONF_VERSION = "1"
 #IMAGE_INSTALL_append = " linux-firmware-bcm43430 connman connman-client pulseaudio pulseaudio-server usbutils sudo wiringpi"
-IMAGE_INSTALL_append = " linux-firmware-rpidistro-bcm43430 usbutils sudo wiringpi wpa-supplicant"
+IMAGE_INSTALL_append = " linux-firmware-rpidistro-bcm43430 usbutils sudo wiringpi wpa-supplicant packagegroup-core-ssh-dropbear init-ifupdown"
 IMAGE_FEATURES_append = " ssh-server-dropbear"
```

## /etc/wpa_supplicant.confの編集

基本的には操作は同じです。
wpa_supplicant.confはbb内のdo_installにてコピーされているため、
対象ファイルはoe-local-filesに配置されています。

```
$ cat workspace/sources/wpa-supplicant/oe-local-files/wpa_supplicant.conf-sane 
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
update_config=1

network={
    ssid="ssid"
    proto=WPA2
    key_mgmt=WPA-PSK
    pairwise=CCMP
    group=CCMP
    psk="pass"
}
```

## ifup/ifdownのservice登録

接続設定自体は問題ありませんが、自動でifupされないためsystemdのサービス登録が必要になります。
今回は、ifupdownレシピを編集します。

```:sources/ifupdown/oe-local-files/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=/sbin/ifup %i
ExecStop=/sbin/ifdown %i
[Install]
WantedBy=multi-user.target
```

```:appends/ifupdown_0.8.16.bbappend 
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
FILESPATH_prepend := "/home/dada/yocto_raspberrypi_zero/workspace/sources/ifupdown/oe-local-files:"
# srctreebase: /home/dada/yocto_raspberrypi_zero/workspace/sources/ifupdown

inherit externalsrc

BBCLASSEXTEND
EXTERNALSRC_pn-ifupdown = "/home/dada/yocto_raspberrypi_zero/workspace/sources/ifupdown"
EXTERNALSRC_BUILD_pn-ifupdown = "/home/dada/yocto_raspberrypi_zero/workspace/sources/ifupdown"

SRC_URI += "file://network-wireless@.service"
SYSTEMD_SERVICE_${PN} += " network-wireless@wlan0.service"

do_install_append() {
    install -d ${D}/${systemd_system_unitdir}
    install -m 0644 ${WORKDIR}/network-wireless@.service ${D}/${systemd_system_unitdir}
    install -d ${D}/${sysconfdir}/systemd/system/multi-user.target.wants/
    ln -sf ${systemd_system_unitdir}/network-wireless@.service \
        ${D}/${sysconfdir}/systemd/system/multi-user.target.wants/network-wireless@wlan0.service
}

FILES_${PN} += "/lib/systemd/system"

REQUIRED_DISTRO_FEATURES= "systemd"
```

- SRC_URIで追加したnetwork-wireless@.serviceを指定
- SYSTEMD_SERVICE_${PN}でsystemdサービス追加
- do_install_append()でdo_install()の後続としてserviceファイルのコピーを実行

編集後に```devtool finish ifupdown meta-raspberrypi-append```で適用

# 今回の成果

起動時にwlan0が有効になり、自動で接続可能となりました。
次回はsshd設定を行う予定です。

```bash
dada@dada-VirtualBox:~/yocto_raspberrypi_zero/meta-raspberrypi-append$ tree
.
├── COPYING.MIT
├── README
├── conf
│   └── layer.conf
├── recipes-connectivity
│   └── wpa-supplicant
│       ├── wpa-supplicant
│       │   └── wpa_supplicant.conf-sane
│       └── wpa-supplicant_%.bbappend
└── recipes-core
    ├── ifupdown
    │   ├── ifupdown
    │   │   └── network-wireless@.service
    │   └── ifupdown_%.bbappend
    └── init-ifupdown
        ├── init-ifupdown
        │   └── interfaces
        └── init-ifupdown_%.bbappend

9 directories, 9 files
```



# 参考サイト

- [devtoolの使い方 (1)：環境準備とレシピ作成の流れ – Create what creates joy](https://kumadasu.com/2017/05/14/devtool%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9-)
- [yocto pulseaudio.socketをレシピからenableする](http://mickey-happygolucky.hatenablog.com/category/yocto?page=1458360150)