macos
RaspberryPi
xl2tpd

xl2tpdをRaspberry PI向けにmacOSでクロスコンパイルする

コンパイルしたい理由

udp_xmit failed to *.*.*.*:* with err=-1:No such device このようなエラーが表示されており、VPNがうまく稼働しなかった。

GitHubを見ると、Kernel 4.15で動かないよという情報があった。
l2tp does not work with 4.15 mainline kernels

また、Raspberry PIでも似た問題が出ているよと書かれていた

For the record, xl2tpd-1.3.8 broke also when upgrading my RPi here from Kernel 4.9.51 to 4.14.30.. is it recommended to already upgrade to xl2tpd-1.3.12dev ?

そのコメントのした人曰く、githubから最新コードを取得してコンパイルし直したらいいよとのことであった。自分もこれを試す。

問題が生じた環境

$ uname -a
Linux rp2mb-usbhdd 4.14.37-v7+ #1111 SMP Thu Apr 26 13:56:59 BST 2018 armv7l GNU/Linux

4.15では無いのに問題が生じているのはどういう加減だろうか?

コンパイルする

クロスコンパイラの入手

Raspberry PIの容量が小さいのでmacOSでコンパイルをする。クロスコンパイルのツールがインターネットで見つかったのでそれを利用する。
https://www.jaredwolff.com/toolchains/
Crosstool-NG GNU Linux EABI Toolchain for RPi3をダウンロードして、dmgをマウントする。

ソースコードの入手

macOSのターミナルでgitのソースコードを取得する。

$ git -b 1.3.12 git@github.com:vyos/xl2tpd.git

関連するライブラリとソースコードの入手

  • libpcap0.8-dev_1.6.2-2_armhf.deb
  • libpcap0.8_1.6.2-2_armhf.deb 2つのdebファイルが必要だった。 これはRaspberry PI側にてapt-get download libpcap-devapt-get download libpcap0.8-devにより得られた。

これらをscpなどによりRaspberryPIからmacOSにコピーして、ar x ファイル名.debとして展開、また、tar xf data.tar.xfとしてusr以下を取得する。

makeの実行

上記の操作により作られたフォルダ構造が次のようであるとする。

  • /Volumes/xtools ... クロスコンパイルのdmgをマウントした場所
  • ~/xl2tpd_b/xl2tpd ... gitにより得られたxl2tpdのソースコードの場所
  • ~/xl2tpd_b/deb/usr ... debを展開して得られたincludeファイルとlibファイルなどの場所

その時、~/xl2tpd_b/xl2tpdで次のようにコマンドを実行するとRaspberry PI用の最新のxl2tpdがコンパイルされる。

$ CC=/Volumes/xtools/armv8-rpi3-linux-gnueabihf/bin/armv8-rpi3-linux-gnueabihf-gcc \
LDFLAGS="-L/Volumes/xtools/armv8-rpi3-linux-gnueabihf/lib/ -L../deb/usr/lib/arm-linux-gnueabihf" \
CFLAGS="-I/Volumes/xtools/armv8-rpi3-linux-gnueabihf/include/ -I../deb/usr/include/" \
make

Raspberry PIに配置する

/usr/sbin/xl2tpdが問題を起こしているファイルであるようなので、コンパイルされたもので置き換える。
コンパイルした結果をscpなどによりRaspberry PIへコピーした後、次のように上書き(!)する。

$ sudo /etc/init.d/xl2tpd stop
$ cp xl2tpd /usr/sbin/xl2tpd
$ sudo /etc/init.d/xl2tpd start

これにより問題となっていたエラーメッセージが表示されなくなる。