概要
Raspberry Pi Zero WH上にNode.jsの実行環境を構築しました。
やりたいことはRaspberry Pi Zero上での形態素解析と画像生成です。
しかしRaspberry Pi Zero WHはARMv6コア、RAM512MBと最小限のアーキテクチャです。
リッチなことをやろうとすると一筋縄ではいきません。
色々工夫して何とか実行環境を構築できました。
その時のはまりどころを情報共有します。
Agenda
主に以下3つではまったので、それぞれを説明します。
- ARMv6コア起因
- RAM不足起因
- ライブラリ不足起因
はまったところ
1. ARMv6コアによるnpmエラー
Raspberry Pi ZeroはARMv6コアを実装しています。
v6コアは2000年代前半のアーキテクチャでちょい古です。
なので、
- apt/apt-getのインストールしてもnpmがエラーを吐く
- スクリプトを使わず手動でインストールしようにもNode.js公式のTOPではv7以降しか載っていない
よって過去のdistを掘り当てて手動コピーしないといけませんでした。
手順は以下の通り。
$ wget https://nodejs.org/dist/v11.15.0/node-v11.15.0-linux-armv6l.tar.gz
$ tar zxvf node-v11.15.0-linux-armv6l.tar.gz
$ cd [解凍したディレクトリ]
$ rm CHANGELOG.md LICENSE README.md
$ sudo cp -R * /usr/local/
$ node -v
$ npm -v
v11.15.0を選んだのは、現状ARMv6対応してるlatest versionだからです。
(間違ってたら指摘お願いします…!)
2. メモリ不足によるmecab-ipadic-neologdコンパイル失敗
最適な形態素解析を行うため、mecabの新語辞書インストールの必要がありました。
しかしインストール時のコンパイルで2GBのRAMが要求されます。
Raspberry Pi ZeroはRAM512MBですw /(^o^)\
公式にもあるスワップを使用したメモリ拡張で解決しました。手順は以下。
今のところ全く問題なく、MeCabれてます。
$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=2048 # 2GBのスワップ領域を確保
$ sudo chmod 600 /swapfile1 # パーミッション設定
$ sudo mkswap /swapfile1 # スワップ領域を作る
$ sudo swapon /swapfile1 # スワップ領域を有効化
$ ./bin/install-mecab-ipadic-neologd -n # インストール
$ sudo swapoff /swapfile1 # スワップ領域を無効化
$ sudo rm /swapfile1 # スワップ領域を削除
3. ライブラリ不足によるnode-canvasのコンパイルエラー
自分はRaspberry Pi OS Liteをインストールしました。
初期ライブラリが少ないからなのか、以下の通り色々はまりました。
- npm install canvas時にcanvas moduleが見つからない
- アプリ実行時にjsdom(nodeパッケージ)がimageをロードできない的なエラーを吐く
原因は、単にライブラリが足りてないだけでした。
以下ライブラリをインストール後、エラー関連のパッケージを再インストール&ビルドして解決。
$ sudo apt-get install build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev libjpeg8-dev libgif-dev g++
$ npm install canvas --build-from-source
さいごに
本記事で実行しているアプリは、もともとherokuのslug size制限で動かせなかったものです。
こんな小さなボードでこれだけのことができることに驚愕です。
ラズパイゼロ最高。オンプレミス最高。