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

2017年1月25日水曜日

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)

  • 諸々ビルドして、bitstream生成も込みでボード上で起動するまでが書いてある
  • おまけとしてシステム構成のコンフィグ方法も書いてあるっぽいのが良い
  • prerequisites部分にシリアルコンソール用のUARTは必須とあるけど本当かなこれ
  • Vivadoからexport hardwareでhardware description fileができる
  • PetaLinux toolsから.dtsやu-bootイメージを生成できる
  • petalinux-createでtemplateにできるのは、ドキュメント上zynqとmicroblazeだけだった
    • 今ならMPSoCとか増えてるんだろうけど、ドキュメントがちょい古い
  • petalinux-createは-t projectでプロジェクト作れるけど、-t appsならアプリ作れる
    • 想定よりも広範囲かな、と思ったけれど ビットストリーム生成まではみ出してはいかないので想定のうち
  • --get-hw-descriptionという不思議オプションがある
    • これ毎回mz7010指定するやつ?
  • petalinux-configからシステム構成設定へと進める
    • 用途とても広い: "If you want to do advanced PetaLinux project configurations such as enabling some kernel options, modifying
the default flash partition table settings and so on, or you just want to view the current configuration, you can run petalinux-config to do so."* petalinux-config -c kernelでカーネルのみの設定を開けるらしい** 同-c rootfsでrootfsをいじれる** ここに追加パッケージ入れるとかやれそうな気がするけど、そこらは直接Yoctoのレイヤを触る感じなのかな* その後にpetalinux-buildを走らせるとLinux本体(つまりカーネル)とrootfsをビルドしてくれるとある* Zynqの場合、petalinux-package --boot ...を使って.binフォーマットにまとめると** 先日触ったXilinx向けYoctoの構成でも、このへんまでbitbake petalnux-buildでやってくれてる気がする。用途の切り分けがよくわからない*** 気持ちの話をすると、Yoctoのbitbake系とPetaLinux SDKでのpetalinux-*コマンド群はiterativeに混ぜて使えてほしい* autoconfigに期待するやつ** "If a component is selected to enable autoconfig, when petailnux-config is run, its config files will be auto updated based on the top system level settings. ... device tree autoconfig is enabled, when petalinux-config runs, the kernel config file <project-root>/subsystems/linux/configs/kernel/config will be auto updated with the top system level settings."とあって期待を持てる*** autoconfigどれぐらい選択肢あるんだろう。頑張ってほしい

UG1156(Workflow Tutorial)

  • "1-1: Design Flow Overview"部分がとてもきれいに役割分担と共にまとまっていて良い。そのまま抜粋
    • Design Flow Step Tool / Workflow
    • Hardware Platform Creation Vivado
    • Create PetaLinux Project
      • petalinux-create -t project
    • Initialize PetaLinux Project
      • petalinux-config --get-hw-description
    • Configure System-Level Options
      • petalinux-config
    • Create User Components
      • petalinux-create -t COMPONENT
    • Configure the Linux Kernel
      • petalinux-config -c kernel
    • Configure the Root Filesystem
      • petalinux-config -c rootfs
    • Build the System
      • petalinux-build
    • Deploy the System
      • petalinux-package
    • Test the System
      • petalinux-boot
  • 気持ち伝わってきたので、あとは全力で飛ばし読み
    • 配布されてるボード用BSPもpetalinux-buildでビルドしてみるところからスタートするのが良さそう
      • Makefileあるけど、直接makeじゃなかったんや…
  • "This step will generate a device tree DTB file, a first stage bootloader (if selected), U-Boot, the Linux kernel, and a root filesystem image. Finally, it will generate the necessary boot images."
    • 大事
    • これでimages/.../image.ubが出て来る。これはFITイメージ?というものらしい
  • リビルドしたらQEMUで試そうな、という優しさ
  • そしてこういう丁寧版も書いてある
    • 1. Change to your project directory and boot the prebuilt linux kernel image: $ petalinux-boot --qemu --prebuilt 3
    • The --qemu option tells petalinux-boot to boot QEMU, instead of real hardware via JTAG, and the --prebuilt 3 boots the linux kernel.
  • デフォルトのログイン情報はID: root、PW: root
    • 意外とハマるやつだ
  • petalinux-bootだけはWindows環境から叩けるようにしておかないと困らない??と思うんだけど、ひょっとすると無いのかこれ
    • JTAGアクセス部分だけLinuxからやるとか微妙に不毛な気がするな...?
  • QEMUの章
    • The --kernel option is used to boot the project’s most recently built Linux image. For Microblaze, it is "<plnx-proj-root>/images/linux/image.elf". For Zynq, it is "<plnx-proj-root>/images/ linux/zImage".
      • なるほど。微妙にわかりづらい挙動やな
  • p.29にちょっと面白いのがあった: "Anatomy of a PetaLinux Project"
  • 続いてp.30。Yoctoだ!!!! となった
  • CAUTION! "<plnx-proj-root>/build/" is automatically generated. Do not manually edit it. Contents in this directory will get updated when you run petalinux-config or petalinux-build. "<plnx-proj-root>/images/" is automatically generated and managed. Files in this directory will get updated when you run petalinux-build.
    • あっ、そういうことなの
    • 若干きな臭い? 個別のパッケージ管理などはあくまでもbuild/conf/以下のファイルで制御しろということか、それすらも触るなということなのか
      • petalinux-configでインストールするrpmパッケージを選べるようになってたら特に文句はないんだけど、どこまで細かくいじれるんだろう(注: その後、petalinux-createで割となんとかなりそうな気がしてきた)
  • p.31-32にも各構成ファイルの役割が書かれていて、そのうち戻ってくるとお得な感じがする

UG1157(PetaLinux Command Line / Reference)

  • 単純にコマンドのリファレンスだと思う
    • 全体の流れが分かってきているので、流し読みぐらいで良いはず
  • petalinux-config -c rootfsからパッケージ選択いける気がしてきた
    • https://www.beyond-circuits.com/wordpress/tutorial/tutorial25/ このへんのスクショ見る感じ、パッケージ選択がある
  • あと問題は、手元の~/build/環境に放り込んであるrecipesをpetalinux-config系にどうやって取り込むか
    • 環境変数設定(setupsdk?)だけでいい感じにそっちを見に行ってくれるのならとても嬉しい
  • bitbake petalinux-imageとかpetalinux-*とついてるレシピ?が何をやってるのか気になるので読もう
    • リポジトリはそこらに生えてるはずなので読みに行けるはず
    • 逆に、petalinux-*の無印コマンドを呼んだ際にbitbakeを内部で呼んでるオチだったらシャンシャンとなる
  • petalinux-create -t COMPONENTというのが出てきた
    • なんだろうこれ
  • "The petalinux-create -t COMPONENT command allows you to create various components within the specified PetaLinux project. These components can then be selectively included or excluded from the final system by toggling them using the petalinux-config -c rootfs workflow. There are no component-specific options for the petalinux-create -t modules workflows."
    • つまり例の.bbファイル相当のもの+そのカタログ管理用ラッパーなのかな
  • 例示
    • Create an application component that is enabled in the root filesystem.
    • $ petalinux-create -t apps -n <NAME> --enable
    • Create a new install-only application component. In this flow, nothing is compiled.
    • $ petalinux-create -t apps -n <NAME> --template install
  • ふーむ
  • ATFはARM Trusted Firmwareということで例のsecure-bootやらTrustZoneやらの系統かー
  • Yoctoへの言及
    • "Introduction: PetaLinux is a development and build environment which automates many of the tasks required to boot embedded Linux on Xilinx AP SoC’s and FPGA’s. It uses Yocto Project underneath for configuring and building various components."
      • のっけにあった
    • petalinux-buildにもあった
      • This tool uses the Yocto Project underneath. Whenever petalinux-build is invoked, it internally calls bitbake. While the tool provides a single workflow, the specifics of its operation can be dictated via the petalinux-build -c and petalinux-build -x options.
      • "-x, --execute"の意
        • Execute specified build step. All yocto tasks can be passed through this option. To get all tasks of a component use “listtasks”. This is optional.
      • なるほど、ようやっと全容見えてきた
      • となると、PetaLinuxのrepoで認識できる形でYoctoの一式を維持しようとすると、PetaLinux側でソースのフェッチから何からやらなきゃいかんのかな? それともsetupsdkでつないでくれる(build/で全部やる)のか
    • まずはpetalinux-configからのワークフローを試して慣れていくのが近道な気がする

UG1144(Reference Guide)

  • Yoctoとの絡みもちょいちょい書いてあるリファレンス
  • 最終的にこれを片手にやっていく感じなのかな
  • bitbakeもちょいちょい露出してるけど、bblayersが出てこないので微妙にこれだけだと不足しそう
  • p.50あたりにprebuilt modulesの追加方法があった
    • 要は*.bbのレシピ追加と組み込みの話なので、これが大事
    • $ petalinux-create -t apps --template install --name mymodule --enable
    • これでいい感じにしてくれるのか、なるほど
    • --template installを与えずにこれやるとCで新規アプリを書いて組み込むテンプレートが生成される
      • こんなんわかるかー!となる
      • autoconfのテンプレートもあって、まあ一貫してはいる..
  • "CAUTION! You can delete the app directory if it is no longer required. Apart from deleting the app directory, you have to remove the line: IMAGE_INSTALL_append= “myapp” from <plnx-proj-root>/project-spec/meta-plnx-generated/recipes-core/images/petalinux-image.bbappend. Deleting the directory by keeping the mentioned line will throw an error."
    • これでbblayersを使ってなくても問題ない理由が明らかになった
  • -t app、-t moduleとあって、それぞれテンプレートがちょいちょいあるので、使い分けは実際やるときに読み直す
  • 原則、-t app --template installのものはビルド済みのやつ(*.ko)を単純に取り込むだけっぽい
    • もちろん他のことに使えんではないだろうけど、役割分けてる
  • p.20からのHardware Import部分もとても大事
    • ハードウェアプラットフォームと.hdfを使うとある
    • これ、BSPとの絡みはどうするんだろう
  • SDSoCからPetaLinuxへ必要なものを渡してビルド、とはならないはずなので注意する
    • SDSoCはあくまでも最終地点
    • カーネルとrootfsの両方を作り上げてSDカードへ書き込める状態にして、それをSDSoC側で設定して使う
    • なんならBSPはSDSoC側で頑張るイメージもあるんだけど、どうだろう
    • 結局bitstream差し替えの都合上、BOOT.binはSDSoCが書き換えるあるいは作り直す認識でいいのかな
    • カーネルとrootfsだけがPetaLinuxからの成果物として、その先は別フロー
    • これまでプラットフォームをエクスポートしてせっせとPetaLinux環境で頑張っていたのが順序逆転して、下回りで必要なものやアプリを組み込んだカーネル・rootfsを先にPetaLinuxで作り、メインアプリをせっせとその上にSDSoCで構築して動作確認までサクサクやる流れ、と捉えると良さそう
    • BSPの出番は更に前で、PetaLinuxのプロジェクトを作るタイミングで必要か、なるほど

1 件のコメント:

  1. お世話になります。

    DIGILENT社のzyboボード(zynq搭載)で、ubuntu を動かしたい時、petalinuxの環境で、ubuntu(linux)のカーネルをコンパイルすれば良いのでしょうか?

    petalinuxとは、linuxカーネルをzynq用にコンパイルするための環境を提供している
    という理解で良いでしょうか?

    返信削除