> FPGA

PetaLinuxで手軽にZynq(MicroZed)用カスタムLinuxを作る

PetaLinuxとは何なのか

私の現時点でのPetaLinux認識は次のとおりです。

Xilinxが提供しているカスタムLinux構成管理ツール兼カーネル・rootfsビルダー。標準のYocto Linux向けビルドツールチェーンに手を加えてXilinx SoC向けの各種コンフィグを追加したり、bitbakeコマンド体系をラップして扱ってくれたり、Yocto向けの適切なレシピ管理あたりまでやってくれるもの。Vivadoが生成するハードウェア定義を利用し、当該ハードウェア向けLinux一式の構築から各種媒体への一次デプロイメントまである程度カバーする。

PetaLinuxの基本をざっと把握する

Xilinxのドキュメントをひたすら読んでいくのが良いです。

私はUG980→1156→1157→1144という順でざっと読んでいきました。順序はドキュメント一覧( https://www.xilinx.com/support/documentation-navigation/design-hubs/dh0016-petalinux-tools-hub.html)を眺めてクイックスタートガイド→ワークフローのチュートリアル→コマンドリファレンス→リファレンスガイドと適当に決めましたが、結果的に割と良い順だったと思うのでおすすめです。

本エントリの最後におまけとして、私が読んでいった中でのメモを簡単に残しています。

PetaLinuxのビルド環境を作る

ホスト(コンパイル)環境にはUbuntu 16.04を利用します。古いバージョンのPetaLinux SDKは古いバージョンのUbuntu上で利用したほうが良さそうですが、基本的に最新版を使っていきたいのでこのようにしました。

必要なパッケージの導入

今回ビルドに使った環境は元々Yocto Linuxのビルド環境を構築していたので、その際に導入したパッケージを下敷きにしています。 Yocto Project を使用して組み込み用のカスタム Linux ディストリビューションを作成するの「リスト 3. Ubuntu で必要なパッケージのインストール」を最初に導入しました。ものによっては不要なはずです。その後はUG1144の表1-3に従って不足分を補うのが良いかと思います。

PetaLinuxのSDKインストール時点で最低限のパッケージが不足していればハネられるのですが、アーカイブ(5GB超、バージョンによっては7GB)のチェックサム検証→展開→...の後に依存関係チェックがおこなわれるので、失敗すると最初からやり直しで時間がかかって厳しいです。

後述する事情によりPetaLinux 2016.2を使う必要が生じたので、

AR# 67503 / 2016.2 PetaLinux - PetaLinux インストールで 32 ビット互換ライブラリのインストールが求められる

2016.1 および 2016.2 バージョンの Petalinux インストールに対しては、32 ビット依存ライブラリが必要となります。

ということで、通常インストール状態のUbuntu 16.04でそのままビルドを通すのは無理です。このページも参考にしつついくつかパッケージを導入しました。なお、Ubuntu 16.04ではここに書かれているlib32bz2-1.0自体存在しないようで、ビルド上も問題は無かったので多分不要です。

また、

sudo apt-get install bc lib32ncurses5 lib32tinfo5

として追加いくつかインストールしておきました。

さもないと次のようなエラーで苦しむことになります。

[INFO ] build zynq_fsbl
[ERROR] make[3]: *** [xqspips.o] Error 1
[ERROR] make[2]: *** [ps7_cortexa9_0/libsrc/qspips_v3_3/src/make.libs] Error 2
[ERROR] make[1]: *** [build] Error 255

dash村からの脱出

PetaLinuxは/bin/shがbashであることを期待するので、dashをbashに戻す作業が必要です。手元ではsudo dpkg-reconfigure dashを使いました。

ロケールをゴリッと変更する

日本語ロケールで無邪気にPetaLinuxビルドを進めると次のようなエラーで終了します。

[INFO ] install linux/kernel
[ERROR] ERROR: Invalid ELF file '/home/muo/mz_7010_2016_2/images/linux/vmlinux'
[ERROR] make[1]: *** [package-subsystem-FIT] Error 255

https://forums.xilinx.com/t5/Embedded-Linux/Petalinux-2015-2-Invalid-ELF-file-vmlinux/td-p/659064

petalinux-build parses the output of readelf to check generated kernel format.

うわぁぁ…。ひどい。

特に必要のない日本語ロケールを、macOSからSSHでログインした場合にUTF8系ロケールが求められる警告メッセージがうるさいという理由でlocale-genやっていた結果がこれなので報われない。例によってMacからSSHだとアレしてソレみたいな問題があるので、http://yano3.hatenablog.jp/entry/2012/11/25/234244の結果を丸ごと~/.bashrcに書きました(もちろん~/.bash_profileでも良いでしょう)。あとはSSH入り直してok。

PetaLinux SDKを導入する

PetaLinux SDKは https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools/2016-4.htmlこのあたりから入手しますが、Xilinx SDKとは違ってWebインストーラがありません。

つまり、v2016.4の場合は8.34GBをごっそりダウンロードしてインストールするほかありません。

後述しますが、MicroZedをターゲットボードとする場合にはv2016.4をインストールしてはいけません。2016.2を選択する必要があります。2016.2はたった5.5GBで済みます、よかったですね(なお私は両方ダウンロードしました)。

PetaLinuxで諸々のLinuxイメージを生成する範囲ではXilinx SDK不要だと思いますが、必要そうならインストールしましょう。

PetaLinuxでMicroZed向けのLinux一式を構築する

事前に読んでおいたドキュメントに従ってBSPからプロジェクトを生成します。

MicroZedのBSPはhttp://zedboard.org/support/design/1519/10でひっそりと配布されているので入手します(Avnetの会員登録が必要)。MicroZed 7010/7020ともに最新版は2016.2用、と書かれています。

PetaLinuxプロジェクトを生成する

$ petalinux-create -t project -s mz_7010_2016_2.bsp

これだけですね。mz_7010_2016_2というディレクトリにプロジェクトが生成されます。この名前は変更して構わないのかな…。

PetaLinuxをひとまずビルドす・・・る?

まずはビルドしてみましょう。

$ petalinux-build
WARNING: Your PetaLinux project was last modified by PetaLinux SDK version "2016.2",
WARNING: however, you are using PetaLinux SDK version "2016.3".
Please input "y" to continue. Otherwise it will exit![n]

おう2016.3なんてSDKしらねーけど大丈夫か?と聞かれます*1。力強くyと返します。

y
INFO: Checking component...
ERROR: Cannot find XLNX__4___4 of linux-kernel
INFO: Generating make files and build linux
INFO: Generating make files for the subcomponents of linux
ERROR: Cannot find XLNX__4___4 of linux-kernel
ERROR: Failed to get subcomponents for linux
ERROR: Failed to build linux! Failed to get makefiles for subcomponents of linux!

全然大丈夫じゃありませんでした。

これはどうあがいてもPetaLinux SDK 2016.3以上でビルドを通すのは無理なので、PetaLinux SDK 2016.2をインストールしました。PetaLinux SDKは相当巨大でダウンロードから面倒なのにやり直しなの大変苦しいです。

ZedboardはPetaLinux SDKの各バージョンローンチに合わせて https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools/2016-4.htmlでBSPを配布してもらえるのにMicroZedには無い…。仕方ない、売れてない?のが悪いんや。大人はみんなそうや… 正論いやいいと思ってやがる…

ということで、実は https://forums.xilinx.com/t5/Embedded-Development-Tools/Error-when-creating-first-SDK-project-after-installation-of/td-p/643937に、なんやビルドが失敗して辛いという話がありまして、このあたりを参考にして適宜パッケージを導入しましょう。

[*1] ちなみに最新版の2016.4を使わず2016.3を使っていたのは、SDSoCの最新が2016.3でそれにあわせたためです

PetaLinux SDK 2016.2でMicroZed用Linuxをビルドする

気を取り直してもう一度。念のためさきのプロジェクトディレクトリは削除してBSPから生成し直し、ビルドコマンドを実行します。

$ petalinux-build

今度は通りました。最後にTFTP用(ネットワークブート用かな)のファイル書き出しに失敗した旨のエラーが出るので、指定ディレクトリをsudo mkdirで掘っておくと次回から安心ですね。なお、あっさり通った風に書いていますが、実際は本エントリの序盤にまとめた依存パッケージやらロケールやらの問題でずいぶん遠回りをしました。

$ petalinux-boot --qemu ...

でQEMU上での実行を確認した感じ、ざっくりいけてそうです。rootで入ってhaltまで確認しました。

halt後にQEMUは自動終了してくれない(内部管理コマンドがあった気がしますが覚えていません)ので、tmuxで専用シェルを立ち上げて実行し、終わったら画面1枚丸ごと閉じる運用をしています。

ビルドするLinuxに含めるパッケージをカスタマイズする

カスタムしてこそYocto Linux、簡単にカスタムできてこそPetaLinuxです。

petalinux-configコマンドを実行して表示されるメニューは階層化されていますが、サブメニュー内の詳細設定、たとえばrootfsに含めるパッケージの選択はpetalinux-config -c rootfsは-c rootfsで明示しないと入れません。

全体コンフィグを抜けると後処理諸々(FSBL用のBSP生成とか)が走るので時間かかります。なお、-c rootfsで実行した画面を抜けると無言で時間かかるのでkill -KILLしそうになりますが、1分程度待っていればちゃんと抜けるので我慢しましょう。

さて、手元ではQtのベースパッケージとexamples、fontあたりを含めてビルドしてみました。

Qt込みにするとrootfs.cpioが順当に膨らみます。

-rw-rw-r--  1 muo  staff  11540480  1 14 22:57 rootfs.cpio
-rw-rw-r--  1 muo  staff  73434112  1 15 07:10 rootfs.cpio

導入するパッケージ量にともなって肥大化するrootfsをどこに置くかは悩ましい問題です。SDカード上の別パーティションへ書き出す筋がスタンドアロン動作面で良いのですが、開発中は何かと面倒です。MicroZedが安定してネットワークにつながる状態ではNFSもよさそうですが、メモリを1GB積んでいるのがこのボードの良いところでもあるので、ひとまず100MBぐらいまではinitramfsでいくつもりです。

PetaLinuxに関する所感

よさそうです。Yoctoのbitbakeを直接触るよりもエラー出力が少なめな分、トラブルシュートをやりづらいと感じますが、間口を広くしたりプロジェクト内での部分オーバーラップしつつの分業体制をうまく回していくのに向いている設計だと感じました。

MicroZedのBSPが2016.2までしか提供されていない点については、差し当たり大きな問題がないこと、そろそろMPSoC時代の安価な評価ボードも出てくるであろうことから、そんなもんかなと思っています。2013年発売のボードですし、あと1年ぐらい色々と使い倒して乗り換えるぐらいのノリでいればいいと思います。

各種の関連FAQ

PetaLinuxをさらさらと使っていく上で読んだFAQエントリを簡単にまとめておきます。何かの役に立つかもしれません。

ツールチェーンの差し替え

AR# 59553 / PetaLinux 2013.10 - Can I Use A Cross-Compiler Other Than the Built-In CodeSourcery Toolsを読むと

I would like to use a cross-compiler other than the default toolchain included with PetaLinux.  Is this possible?

に対して、環境変数指定で内部のツールチェーンを部分的に差し替えられると書いています*2

[*2] そういえばhttp://www.wiki.xilinx.com/Install+Xilinx+ToolsでZynq 7000用に紹介されているツールチェーン、Code Sourcery版とlinaro版などの差が分かっていないので、そのうち調べようと思います。単純にsoftfpuとhardfpu利用の差だけなのかな

Linuxを指定Gitリポジトリからビルドする方法

Xilinxのlinux-xlnxリポジトリから派生させて手を加えたGitリポジトリのコードを使いたい場合、などの話だと思います。

AR# 60406を読むと

PetaLinux 2013.10 and later support the ability to retrieve source code for the Linux kernel or UBOOT from a Git repository.  How do I use this feature in my design workflow?

に対してpetalinux-configで実行するメニュー内での操作方法が書かれています。

PetaLinuxの生成するデバイスツリーファイル(DTS/DTSI)にイーサネットのPHYやMDIOの情報が含まれない

AR# 61117 / PetaLinux - My System Device Tree DTS Does Not Include Ethernet PHY Information

質問はタイトルどおりなので省略し、これに対する答えが

Ethernet PHY information is board level and board-specific information that PetaLinux does not have access to without user input.

ということなんだけど、イマイチ腑に落ちてない…。system-top.dtsもPetaLinuxが生成していけない理由がないように思う(PetaLinuxのプロジェクト生成時点でBSPを読み込んでいるので、ターゲットボードもそのハードウェア構成も分かっているはず)し、petalinux-configの設定画面中にもPHY設定あったような?見間違いかもしれないので、そのうちこのあたりに触れる段になったらもう一度確認してみます。

PetaLinux関連のUGめぐり読みメモ

よく分かっていない状態から段々と全容が掴めていくまでが見て取れるメモです。

UG980(Board Bringup Guide)

/subsystems/linux/configs/kernel/config will be auto updated with the top system level settings."とあって期待を持てる*** autoconfigどれぐらい選択肢あるんだろう。頑張ってほしい

UG1156(Workflow Tutorial)

UG1157(PetaLinux Command Line / Reference)

UG1144(Reference Guide)

2017/01/25 12:05

FPGA, MicroZed, PetaLinux

Show more

Copyright © Kei Nakazawa 2017, Licensed under CC-4.0-BY unless otherwise noted.