JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築

JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築

5b47136bedcba2799edf4fcd27ea66d7?s=128

YAEGASHI Takeshi

July 25, 2020
Tweet

Transcript

  1. クロスコンパイルだけが能ではない 組み込みLinuxシステムのCI/CDインフラ構築 八重樫 剛史 Takeshi Yaegashi 2020-07-25 July Tech Festa

    2020 #JTF2020 #JTF2020E
  2. 自己紹介 八重樫 剛史 Takeshi Yaegashi 株式会社バンダイナムコスタジオ所属 Linux・Unix・OSS・Go 言語が好きなエンジニア 組み込みシステム開発、ゲームサーバ開発、 CI/CD

    インフラ開発、 開発環境のクラウドシフトなどの業務に従事 活動場所 ホームページ・ブログ https://l0w.dev GitHub https://github.com/yaegashi GitLab https://gitlab.com/yaegashi Twitter https://twitter.com/hogegashi
  3. 今日の話題 • 組み込み Linux システムの CI/CD インフラ構築 • 組み込み Linux

    システムのビルド環境の調査とベンチマーク • 次の話題は扱いません ◦ セキュリティ ◦ ソフトウェアライセンス ◦ コンテンツ保護 ◦ オンラインアップデートシステム
  4. 組み込み Linux システム CI/CD インフラの構築 手作りのホビープロジェクトから量産可能な製品へ

  5. 組み込み Linux システムとは? • OS として Linux が動作するマイコンボードを組み込んだシステム • ビデオゲーム玩具、ネットワーク機器、キオスク端末、

    ロボット玩具、IoT端末、エッジAI、デジタルサイネージ、・・・ • Raspberry Pi の登場やメイカームーブメントの流行により、 商用製品からホビープロジェクトまで裾野が広がった
  6. より多くのユーザーに届けられる製品を作る • 手作り・一品物システムの卒業 ◦ Raspbian などの既製インストール環境のカスタマイズは量産・配布が難しい • ディスクイメージを作る ◦ OSやアプリのインストール・設定が完パケ状態で入ったディスクイメージを作る

    ◦ Raspberry Pi なら MicroSD カードに書き込むと利用できるようになる dd if=disk.img of=/dev/sdb bs=1M ◦ デュプリケータを使って何百・何千ものコピーを量産できる • アプリ専用 OS をブートストラップする ◦ アプリ専用の最小構成の OS を構築しディスクイメージのサイズを削減する ◦ 再現性のあるクリーンな環境をビルド・テストできるようになり品質が向上する
  7. embl0w-rpi プロジェクト • ホビープロジェクトの方々にも参考にしてもらえるような Raspberry Pi 向け組み込み Linux システム実装プロジェクトを始めました! https://gitlab.com/embl0w/embl0w-rpi

    https://github.com/embl0w/embl0w-rpi (ミラー)
  8. embl0w-rpi の特徴とねらい • ホビー向け・商用製品向け両方のリファレンスとなることを目指す • 様々なクラウドサービス上でのクロスビルド CI/CD に対応する • Raspbian/Debian

    で開発・テストするアプリのイメージ化を志向する ◦ クロスコンパイルによるミニマルフットプリントを志向する組み込み Linux ディストリビューション (Buildroot, OpenEmbedded, Yocto Linux など) とは立ち位置が異なる • 想定アプリケーション (これから作る) ◦ テレワーク企業向けのカスタム Wi-Fi ルータ (WireGuard VPN 対応) ◦ リッチコンテンツ対応のキオスク、デジタルサイネージ端末 ◦ 高機能 IoT 端末
  9. embl0w-rpi ビルドワークフロー kernel image userland archive firmware bootloader kernel modules

    debootstrap prebuilt rootfs archive app build rootfs build app archive bootfs build bootfs archive disk build disk image app source appfs build appfs archive
  10. ビルドの課題と解決 • 実機 (Raspberry Pi) がとても遅いためセルフビルドは時間がかかる ◦ ARM マイコンは CPU

    が遅い、ストレージ (MicroSD) や I/O も絶望的に遅い • もっと高速なマシンでクロスビルドしたい ◦ 強力な x86_64 CPU を搭載しストレージも高速なサーバでビルドしたい ◦ 最近は ARM64 CPU を搭載するサーバもあるので試したい • クラウドサービスで CI/CD を構築したい ◦ クラウドが利用できれば TCO 削減や可用性、コスト伸縮性の点で大きなメリットがある ◦ CI/CD サービスの無料枠を活用すればコストをほぼゼロにできるし、 逆にコストを度外視した高速化も容易に試すことができる
  11. 高速なクロスビルドの実現手法 • 仮想化・エミュレーション技術の活用が鍵 ◦ QEMU のようなソフトを使い高速な x86_64 サーバで ARM の実行ファイルを動かす

    • ハードウェアエミュレーション ◦ ターゲットシステム全体を仮想化・エミュレーションして Linux カーネルを動かす ◦ オーバーヘッドが大きく非効率的、ビルドの目的では使わない • ユーザーランドエミュレーション (qemu-user-static) ◦ ターゲットの CPU アーキテクチャの実行ファイルが、 ホストシステム上の 1 プロセスとして動くようにエミュレーションする ◦ ホストシステムの高速なストレージや I/O を仮想化なしに直接扱える
  12. Build ARM executable with Go $ cat hello.go package main

    import "fmt" func main() { fmt.Println("hello, world") } $ sudo apt install golang $ GOARCH=arm go build hello.go $ file hello hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, Go BuildID=r25mtH3xAmMqsN82YvTf/76iAXGVuGm9vmj6JX2uK/wp_gTuNYGed7ykVck7Ur/mSyuD7KUTU2imdNgDNt Q, not stripped $ ./hello -bash: ./hello: cannot execute binary file: Exec format error x86_64 ホストで ARM の実行ファイルをクロスビルドする (Go 言語を使用) x86_64 ホストでは ARM バイナリは実行できない GOARCH=arm 指定で ARM バイナリをビルド
  13. qemu-user-static & binfmt_misc $ sudo apt install qemu-user-static $ qemu-arm-static

    hello hello, world $ sudo apt install binfmt-support $ ./hello hello, world $ cat /proc/sys/fs/binfmt_misc/qemu-arm enabled interpreter /usr/bin/qemu-arm-static flags: OCF offset 0 magic 7f454c4601010100000000000000000002002800 mask ffffffffffffff00fffffffffffffffffeffffff x86_64 ホストで ARM の実行ファイルを透過的に実行する qemu-arm-static で ARM バイナリ実行 binfmt_misc により x86_64 ホスト上で ARM バイナリを直接実行 binfmt_misc 特定のビット列 (magic) を 検出したら interpreter を起動するカーネルの機能
  14. qemu-debootstrap $ sudo apt install debootstrap $ sudo qemu-debootstrap --arch=armhf

    --variant=buildd buster armroot $ sudo chroot armroot # uname -m arm7l # ls bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var # cat >hello.c #include <stdio.h> int main() { printf("hello, world\n"); return 0; } # gcc hello.c # ./a.out hello, world x86_64 ホストで ARM の Debian buster をブートストラップする x86_64 ホストで ARM の Debian ファイルシステムを ブートストラップする x86_64 ホストで ARM Debian chroot 環境に入る
  15. 組み込み Linux システム ビルド環境の調査とベンチマーク クラウドおよび CI/CD サービスの活用

  16. embl0w-rpi ビルド環境 • embl0w-rpi の CI/CD には次の条件を満たすビルド環境が前提となる ◦ Debian ベースの

    Linux システムである (コンテナでも可) ◦ binfmt_misc が使える (異種アーキテクチャ実行ファイルの透過実行 ) ◦ loopback device が使える (ディスク・パーティションイメージの操作 ) • 様々な選択肢を実際に試しパフォーマンスやコストを比較してみた ◦ 実機 vs サーバ ◦ オンプレミス vs クラウド ◦ x86_64 vs ARM64 ◦ IaaS (VM) vs SaaS (CI/CD サービス)
  17. embl0w-rpi ビルドベンチマーク • embl0w-rpi の make build の総所要時間 (real) を比較する

    • mksquashfs (圧縮ファイルシステム生成) の所要時間も別途記録する • deb パッケージは同じホストで稼働する apt-cacher-ng 経由で取得する • 何度か実行して総所要時間が最も短いものを代表値とする $ make setup $ time make build APTPROXY=http://127.0.0.1:3142 ... real 8m55.359s user 7m49.594s sys 0m42.735s
  18. ビルド環境調査 (オンプレミス / クラウド VM) オンプレミス Raspberry Pi 3B オンプレミス

    Raspberry Pi 4B オンプレミス 自作PC クラウド Azure F2s_v2 クラウド AWS c6g.large 総所要時間 mksquashfs 27m38.095s 2m50.81s 14m27.295s 1m12.99s 8m55.874s 11.32s 8m34.881s 48.65s 5m24.315s 57.50s OS Raspbian 10 armhf Raspbian 10 armhf Ubuntu 20.04 amd64 Ubuntu 18.04 amd64 Ubuntu 18.04 arm64 CPU Cortex-A53 1.2GHz Cortex-A72 1.5GHz Core i7-6700 3.4GHz Xeon Platinum 8168 2.7GHz Graviton2 論理コア数/メモリ 4 / 1GB 4 / 4GB 8 / 32GB 2 / 4GB 2 / 4GB ストレージ 32GB MicroSD 32GB MicroSD 500GB SATA SSD 30GB Premium SSD 16GB Local SSD 30GB gp2 SSD コスト 約10,000円 約12,000円 約100,000円 9,428円 / mon 7,402円 / mon
  19. ビルド環境調査 (オンプレミス / クラウド VM) • Raspberry Pi 実機はやはり遅い。特にストレージ (MicroSD)

    の遅さが大きく影響 していると思われる。 • ARM64 アーキテクチャの AWS c6g.large インスタンスが予想以上に速い。 x86_64 のインスタンスに比べてコストが低く ARM システム向けの CI ランナーと して有望。
  20. ビルド環境調査 (CI/CD サービス) GitLab CI GitHub Actions Azure Pipelines AWS

    CodeBuild GCP Cloud Build 総所要時間 mksquashfs 14m2.019s 1m42.63s 9m29.951s 49.04s 11m6.074s 50.65s 10m41.740s 22.56s N/A スペック GCP n1-standard-1 Azure DS2_v2 Azure DS2_v2 AWS a1.2xlarge GCP n1-standard-1 論理コア数/メモリ 1 / 4GB 2 / 7GB 2 / 7GB 8 / 16GB 1 / 4GB コンテナ Y N N Y Y binfmt_misc Y Y Y N N loop device N Y Y Y Y self hosted Y Y Y N N コスト $8 / 1000min $0.008 / min 4480円 / mon $0.02 / min $0.003 / min 無料枠 2000min / mon 2000min / mon 1800min / mon N/A 120min / day
  21. ビルド環境調査 (CI/CD サービス) • GitLab CI: 無料ランナー GCP n1-standard-1 が非力なため時間がかかる。

    AWS ARM64 インスタンスのランナーと組み合わて使いたい。 • GitHub Actions: いちばん速い。無料 CI サービスの中では第一候補。 • Azure Pipelines: ランナーのスペックは GitHub Actions と同じはずだがなぜか 遅い。課金体系が他サービスと異なる。 • AWS CodeBuild: 唯一の ARM64 ランナーによる CI サービス。第一世代 Graviton のためかあまり速くない。また無料枠対象ではない。 • GCP Cloud Build: binfmt_misc が使えずジョブを完遂できなかった。対処法があ るかもしれない。
  22. 組み込み Linux システム ビルド環境の総括 まとめとお知らせ

  23. まとめ • 組み込み Linux システム • embl0w-rpi プロジェクト • 仮想化・エミュレーション技術

    • ビルド環境の調査とベンチマーク
  24. embl0w-rpi プロジェクトの今後 • 32bit / 64bit ユーザーランド対応 • ビルドワークフローの最適化 ◦

    適切なアーティファクトの保存 → ビルド反復時間の短縮 ◦ DAG ワークフローエンジンの導入 → ビルド並列化・高速化 • アプリケーション追加 ◦ テレワーク企業向けカスタム Wi-Fi ルータ (WireGuard VPN 対応) ◦ エンターテインメント、キオスク、デジタルサイネージ端末
  25. お知らせ • CEDEC 2020 でも登壇します 2020年9月3日(木) 16:45 〜 17:45 クラウド時代の組み込みLinuxエンターテインメント製品開発

    • embl0w-rpi を利用したシステム開発事例を紹介します 夏休みの自由研究の成果にご期待ください!
  26. おわり ご清聴いただきありがとうございました

  27. Credits この資料は次の素材を利用して作成しました • Free Google Slides Templates • いらすとや