カテゴリー「Raspberry Pi」の6件の記事

WSLでクロスコンパイルするのは結局あきらめた

WSLを使ってみて、ベータ版だからか、いくつか肝心な機能が使えないことが分かって、クロスコンパイル環境を仮想マシン(Hyer-VやVMWare)上のLinuxで再構築することにしました。主な理由は下記の通り。

  1. 致命的なことにchrootが実装されていないので、chroot方式のクルスコンパイル環境が作れない。
  2. loopデバイスが無いので、WSL上でext4ファイルシステムイメージを操作できない。
  3. Raspbianのinitramfs作成に失敗する(細かく調査していないが2.と同じ原因か)

これだと仮想環境で普通にUbuntuを動かした方が早いし、これまで書いてきた記事はUbuntu上の環境でも使える。また、Windows用の実行イメージ作るならMingW64で十分だと思う。これが現時点のベータ版WSLを1か月使ってみた結論。

実際のところ、どういう利用パターンがあるんだろうか???

WSL上でクロスコンパイルしたLinux(Raspberry Pi 3に近いもの)をQEMUで動かす

今回はRaspberry Pi用Linuxのクロスコンパイルに挑戦してみます。
といっても、そのままでは面白くないので、QEMUで動作するLinuxをビルドしてみます。

まずは、WSLへのQEMUの導入です。足りないライブラリがあったら一緒に導入してください。

$ sudo apt install qemu-system-arm

次にRaspBianのソースコードを作業用ディレクトリに展開します。(ここらあたりを参考に)
クロスコンパイルですが、今回はQEMU用に"vexpress-a9"対応のLinuxをビルドします。

$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ make vexpress_defconfig <--- Raspberry用と違います(実機には使えません)
$ make zImage dtbs -j8      <--- -jはWSL-PCのCPUコア数で調整してください
$ cp arch/arm/boot/zImage ~/work/kernel-qemu.img
$ cp arch/arm/boot/dts/vexpress-v2p-dtb ~/work/

完成したzImageとdtbファイルをQEMU用の作業ディレクトリにコピーしておきます。
※ ~/work/に置きましたが、これは好きなところでOK

次にRaspberry PiでRaspBian(Jessie)が動いているSDカードのDDイメージを抜きだしてきます。ここらあたりから入手して使っても良いですが少々面倒です。

クロスコンパイルしたLinux(QEMU用)で起動します。別途、WSLが入ったPC上にVNCクライアント(UltraVNCなど)を用意しておいてください。

$ qemu-system-arm -kernel ~/work/kernel-qemu.img      \
    -drive if=sd,format=raw,file=~/work/Jeassi_8GB.ddi      \
    -dtb ~/work/vexpress-v2p-ca9.dtb                           \
    -append "rw root=/dev/mmcblk0p2 rootfstype=ext4 console=ttyAMA0,115200"   \
    -M vexpress-a9 -smp 4 -m 1024 -vnc :0 -k ja            \
    -serial stdio -net nic -net user,hostfwd=tcp::5022-:22

メモリ1GB、4コアCPUでQEMUが動作します。最後の設定はSSHをポート5022で動作させる為のものです。VNCクライアントで127.0.0.1:0に接続するとブート画面が表示されます
余談ですが、この設定を見つけるのに苦労しましたが、殆どのWeb記事は-dtbオプションの指定が無くてQEMUで動作しないものばかりでした。

これで最初に立ち上げると、ファイルシステムのエラーになってemergency modeに入りますので、QEMU用に以下の作業をしてください。

$ vi /etc/fstab     <--- エディタはnanoでもお好きなもので。

proc        /proc  ...
# /dev/mmcblk0p1    /boot   ...
# /dev/mmcblk0p2    /         ...

$ systemctl reboot

mmcnlkに関するマウント指定2行を削除してリブートすると使えるようになります。ただし、VNC側のkeymapが変になっているので、VNCクライアントを使う為にキーマップの設定を行います。

$ sudo mount /dev/mmcblk0p1 /boot
$ sudo raspi-config

「4. Internationalization Options」に入って、「I3 Change Keyborad Layout」を選び、「Generic 105-key (Intl) PC」で、「Other」-「Japanese」を選択すると「Japanese (OADG 109A)」が選べます。あとはデフォルトのままで構わないでしょう。
raspi-configの設定が終わったら「sudo shutdown -r now」などでリブートします。

これでVNCクライアントから使えるQEMU環境ができあがりました。少々遅いですが、X11なども導入すればGUIも動きます。

今回の方法で動かせるのは、Raspberry Pi固有のハードウエアを使わないアプリケーションだけです。vexpressのカーネルを使ってますからね。でも、メモリ1G、4コアのARMv7で動作するQEMU環境は、何かと役に立つのではないかと思います。

Qemuraspi3_3
※ 今回のカーネルはハードウエア乱数(/dev/hwrng)機能を有効にしていないので、このままだとSSHが動作しません。SSH設定済みドライブのDDイメージを使うか、カーネル設定を変更してビルドする必要があります。

WSL(Windows10)上にxaptでRaspberry Piのクロスコンパイル用ライブラリをダウンロードする

前回までの記事でffmpegがクロスコンパイルできるようになったので、次はOpenCVにチャレンジようと思います。OpenCVのインストール記事はこちらを参照。

上記の記事を調べてみると様々な開発用ライブラリを入手しないとコンパイルできないようですが、せっかくクロスコンパイル環境を作ったので、なんとか、ここで必要なライブラリを入手できないかと思って調べていたら、xaptというコマンドがあることが分かりました。

早速、Raspberry Pi用のパッケージを入手する環境を構築しました。

まず、必要なパッケージをWSLに導入します。

$ sudo apt install dpkg-cross xapt

他のクロスコンパイルは実行しないのでxaptの設定ファイルをRaspbian Pi用に書き換えてしまいます。(必要ならバックアップを取っておいてください)

# sudo vi /etc/xapt.d/debian.conf    ---> エディターはnanoでもお好きなものを

[debian]
# full name of the apt mirror, including http:// or ftp:// prefix
# mirror=http://cdn.debian.net/debian/
mirror=http://mirrordirector.raspbian.org/raspbian/
# space separated list, passed to apt in the sources.list
components=main contrib non-free rpi
# suite can be specified as an override
# default, not defined.
suite=jessie
# allow unauthenticated repositories
noauth=true
# check if the cross package is already installed or newer
checknewer=true

これで、Raspberry Piのリポジトリからパッケージをxaptできるようになります。

あとは必要なライブラリのパッケージ(libxxxx-dev)をxaptでダウンロードしましょう。

(実行例)
$ sudo xapt -k -a armhf libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
$ sudo xapt -k -a armhf libatlas-base-dev python2.7-dev python3-dev
    :

これでクロスコンパイル用ライブラリが指定したアーキテクチャのディレクトリ(/usr/arm-linux/gnueabihf/libなど)に導入されます。

※ UPDATE: xaptは古いやり方でサポートされなくなったらしいです。手間がかかるのでRaspberry Pi 3上でライブラリを入手して、クロスコンパイル環境に持ってきてコンパイルするしかなさそうです...

WSL(Windows10)でRaspberry Pi 3用のffmpegをクロスコンパイルする

[STEP1] x264パッケージ
ソースファイルを作業ディレクトリに展開して、以下でビルドしました。

$ ./configure --enable-static --disable-gpl --host=arm-linux \
   --cross-prefix=/usr/bin/arm-linux-gnueabihf-                  \
   --prefix=/usr/arm-linux-gnueabihf/ --disable-asm            \
   --disable-opencl
$ make     --->  マルチプロセッサであれば、make -j8 などで早く終わります
$ sudo make install-lib-static

ここではconfigure最後の--disable-openclが大事。これが無いと、ffmpegのconfigure時にopenclが見つからないと言われて相当悩みました。

[STEP2]ffmpeg (最新の3.2.4を使ってみました)
ソースファイルを作業ディレクトリに展開して、以下でビルドしました。

CROSS_TRIPPLE=arm-linux-gnueabihf
CROSS_PREFIX=/usr/arm-linux-gnueabihf
./configure --enable-gpl --enable-version3 --enable-nonfree \
        --enable-libx264                                                      \
        --disable-doc --disable-htmlpages --disable-podpages \
        --disable-txtpages --disable-debug                            \
        --pkg-config-flags="--static"                                    \
        --enable-mmal --enable-omx --enable-omx-rpi           \
        --arch=armel --cpu=armv7-a  --target-os=linux           \
        --enable-cross-compile                                            \
        --prefix=${CROSS_PREFIX}                                        \
        --sysroot=${CROSS_PREFIX}/opt/vc                           \
        --cross-prefix=/usr/bin/${CROSS_TRIPPLE}-              \
        --extra-cflags="-I${CROSS_PREFIX}/opt/vc/include -I${CROSS_PREFIX}/opt/vc/include/IL"
$ make               --->  マルチプロセッサであれば、make -j8 などで早く終わります
$ sudo make install-libs
$ sudo make install-headers

以上で、出来上がったffmpeg、ffserver、x264などをRaspberry PiのSD Cardに入れれば使えます。video4linux2などを使ってカメラ画像をライブ配信されている方の記事も参考に試したら無事に動作しました。

なお、ffmpegを--enable-omx-rpiでコンパイルするには、前の記事で書いたuserlandのライブラリやインクルードファイルを用意しておく必要があります。
また、最後のsudo make installは、${CROSS_PREFIX}下にRaspberry Pi上の実行イメージやライブラリを置いておくもので、他のツールのクロスコンパイルでもlibavライブラリなどが使えるようにしようというものです。

β版とはいえ、Windows 10(64bit)のWSLでもRaspberry Pi用バイナリがクロスコンパイルできたのは、少々感動ものでした。

WSL(Windows10)にRaspberry Pi 3用のクロスコンパイル環境を整備する

Raspberry Pi 3に実装されているハードウエアエンコーダーのOpenMAXなどを使ってみたいので、クロスコンパイル環境上でライブラリを作成してみました。

まず、今後のクロスコンパイルで使いそうなツールを一式入れておきます。

$ sudo apt install build-essential gperf bison flex libtool git autoconf automake cmake
$ sudo apt install gcc-arm-linux-gnueabihf
$ sudo apt install g++-arm-linux-gnueabihf
$ sudo apt install pkg-config-arm-linux-gnueabihf
$ sudo apt install libncurses5-dev gettext libiconv-hook1 libiconv-hook-dev zlib1g-dev

足りないものがあったら後から追加していけば良いでしょう。

つぎに適当な作業ディレクトリにRaspberry Pi用のuserlandを入手して、クロスコンパイルします。

$ git clone https://github.com/raspberrypi/userland.git
$ cd userland
$ ./buildme
$ sudo ./buildme /usr/arm-linux-gnueabihf

ビルドコマンドの引数はクロスコンパイル環境でのインストール先です。上記は、私の使った例ですが、あまりこだわりはありませんが、後でffmpegのコンパイルで指定するものと合わせる必要があります。

これで、OpenMAXやMMALなどのハードウエアライブラリが作成できました。

WSL(Windows Subsystem for Linux)にRaspberry Pi用のクロスコンパイラを導入する

Raspberry Pi 3を買ったので、クロスコンパイル環境をWindows 10(64Bit)上に構築しようとして、MingWなども試した結果、WSLにたどり着きました。

ct-ngなどに悪戦苦闘していたのが嘘のように、簡単にインストール出来ました。

WSL自体のインストール方法は、@IT記事などを見てください。

まずはubuntuをアップデートしておきます。

$ sudo apt-get update
$ sudo apt-get upgrade

記事を書いた時点のWSLは、ubuntu 14.04です。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.5 LTS
Release:        14.04
Codename:       trusty

次に良く使う開発環境をセットアップします。

$ sudo apt install build-essential gperf bison flex libtool git autoconf automake

最後にクロスコンパイラをインストールします。なんと、これだけ!!

$ sudo apt install gcc-arm-linux-gnueabihf

試しにクロスコンパイラの中身をチェックしてみましたが、Raspbianで配布しているcross compiling toolchainと同じものでした。

$ arm-linux-gnueabihf-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.8.4-2ubuntu1~14.04.1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/arm-linux-gnueabihf/include/c++/4.8.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --disable-libitm --disable-libquadmath --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-armhf-cross/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-armhf-cross --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-armhf-cross --with-arch-directory=arm --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libgcj --enable-objc-gc --enable-multiarch --enable-multilib --disable-sjlj-exceptions --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- --includedir=/usr/arm-linux-gnueabihf/include
Thread model: posix
gcc version 4.8.4 (Ubuntu/Linaro 4.8.4-2ubuntu1~14.04.1)

次はカーネルビルドにチャレンジしてみようと思います。

その他のカテゴリー