Intel EdisonのYocto OSにOpenVPNを追加する

# 1 概要

　Intel Edisonを使っているとOpenVPNを使って自宅のサーバとつなぎたくなることがあります。しかし、Yocto OSで動作しているEdisonにOpenVPNをインストールするにはソースからインストールしなければなりません。
　ここではソースからOpenVPNをインストールする方法を紹介します。OpenVPNはOpenSSL、lzo、PAMにそれぞれ依存しています。OpenSSLはEdisonにインストールされているため、それ以外のライブラリをインストールする必要があります。手順としては以下のようになります。

1. lzoのインストール
2. PAMのインストール
3. OpenVPNのインストール
4. OpenVPNのSystemd Unitファイル作成

順を追って説明して行きます。

# 2 lzoインストール

lzoライブラリはopkgでインストールすることができます。opkgのリポジトリを準備していない場合は、以下
のリポジトリを追加してください。
intel-iotdk.conf

```
src intel-iotdk http://iotdk.intel.com/repos/1.1/intelgalactic
src intel-all     http://iotdk.intel.com/repos/1.1/iotdk/all
src intel-quark   http://iotdk.intel.com/repos/1.1/iotdk/quark
src intel-i586    http://iotdk.intel.com/repos/1.1/iotdk/i586
src intel-x86     http://iotdk.intel.com/repos/1.1/iotdk/x86
```

下記のコマンドでインストールします

```
root@edison~:opkg update
root@edison~:opkg install liblzo2 liblzo2-dev
```

# 3

次にPAMライブラリをインストールします。PAMライブラリはソースからインストールしますが、EdisonにインストールされているBerkeleyDBにdbmが含まれていないため、そのままではインストールできません。そこでBerkeleyDBもソースからビルドします。

## 3.1 BerkeleyDBのインストール

はじめに既にインストールされているdbをアンインストールします。他のパッケージに依存している場合は当該のパッケージを削除するか強制リムーブします

```
root@edison~:opkg remove db
```

強制の場合は

```
root@edison~:opkg remove --force-depends db
```

以下のコマンドでBerkeleyDBをダウンロードします
```
root@edison~:wget http://download.oracle.com/berkeley-db/db-6.0.20.tar.gz
```
続けてダウンロードしたファイルを解凍してビルドとインストールを行います。

```
root@edison~:tar xvf db-6.0.20.tar.gz
root@edison~:cd db-6.0.20/build_unix
root@edison~:../dist/configure --prefix=/usr/local --enable-dbm
root@edison~:make
root@edison~:make install
```

## 3.2 PAMのインストール
BerkeleyDBのインストールが完了したらPAMをインストールします。以下のコマンドでPAMのソースをダウンロードしましょう。

```
root@edison~:wget http://www.linux-pam.org/library/Linux-PAM-1.2.1.tar.gz
```

ダウンロードしたファイルを解凍してインストールします。

```
root@edison~:tar xvf Linux-PAM-1.2.1.tar.gz
root@edison~:cd Linux-PAM-1.2.1
root@edison~:./configure --prefix=/usr/local
root@edison~:make
root@edison~:make install
```

# 4 OpenVPNのインストール
続いてOpenVPNのインストールです。下記コマンドでOpenVPNをダウンロードします。

```
root@edison~:wget https://swupdate.openvpn.org/community/releases/openvpn-2.3.8.zip
```

ファイルを解凍してビルドとインストールを行います。解凍後シェルスクリプトに軒並み実行権限が付いていないため、実行権限を付ける必要があります。

```
root@edison~:tar xvf openvpn-2.3.8
root@edison~:cd openvpn-2.3.8
root@edison~:chmod 755 *sh
root@edison~:./configure
root@edison~:make
root@edison~:make install
```

※今回の環境ではmakeの一回目は失敗しました。2回目にmakeを叩くと成功しました。謎です。

# 5 SystemdのUnitファイルを作成する

EdisonのYocto OSはSystemdのため、OpenVPNを動作させるためのUnitファイルを作成する必要があります。
以下のファイルを作成します。見よう見まねで作成したため、おかしい点があるかもしれません。

*/etc/systemd/system/openvpn@.service

```
[Unit]
Description=OpenVPN connection to %i
After=network.target

[Service]
PrivateTmp=true
Type=oneshot
RemainAfterExit=yes
PIDFile=/var/run/openvpn/%i.pid
ExecStart=/usr/sbin/openvpn --daemon --writepid /var/run/openvpn/%i.pid --cd /etc/openvpn/ --config %i.conf
WorkingDirectory=/etc/openvpn

[Install]
WantedBy=multi-user.target
```

あとはOpenVPNの設定ファイルと鍵を以下のフォルダに格納します。

```
/etc/openvpn/
```

設定ファイルをclient.confとした場合、次のコマンドでOpenVPNを起動します。

```
root@edison~:systemctl start openvpn@client.service
```

Edison起動時にVPN接続したい場合は以下のコマンドであらかじめOpenVPNの設定を行います。

```
root@edison~:systemctl enable openvpn@client.service
```

# 6 まとめ

1. PAMのインストールのためにBerkeleyDBを--enable-dbmオプションをつけてビルドする
2. lzoはopkg経由でインストール
3. SystemdのためにUnitファイルは自分で作成する。