Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 八重樫 剛史 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

Slide 3

Slide 3 text

今日の話題 ● 組み込み Linux システムの CI/CD インフラ構築 ● 組み込み Linux システムのビルド環境の調査とベンチマーク ● 次の話題は扱いません ○ セキュリティ ○ ソフトウェアライセンス ○ コンテンツ保護 ○ オンラインアップデートシステム

Slide 4

Slide 4 text

組み込み Linux システム CI/CD インフラの構築 手作りのホビープロジェクトから量産可能な製品へ

Slide 5

Slide 5 text

組み込み Linux システムとは? ● OS として Linux が動作するマイコンボードを組み込んだシステム ● ビデオゲーム玩具、ネットワーク機器、キオスク端末、 ロボット玩具、IoT端末、エッジAI、デジタルサイネージ、・・・ ● Raspberry Pi の登場やメイカームーブメントの流行により、 商用製品からホビープロジェクトまで裾野が広がった

Slide 6

Slide 6 text

より多くのユーザーに届けられる製品を作る ● 手作り・一品物システムの卒業 ○ Raspbian などの既製インストール環境のカスタマイズは量産・配布が難しい ● ディスクイメージを作る ○ OSやアプリのインストール・設定が完パケ状態で入ったディスクイメージを作る ○ Raspberry Pi なら MicroSD カードに書き込むと利用できるようになる dd if=disk.img of=/dev/sdb bs=1M ○ デュプリケータを使って何百・何千ものコピーを量産できる ● アプリ専用 OS をブートストラップする ○ アプリ専用の最小構成の OS を構築しディスクイメージのサイズを削減する ○ 再現性のあるクリーンな環境をビルド・テストできるようになり品質が向上する

Slide 7

Slide 7 text

embl0w-rpi プロジェクト ● ホビープロジェクトの方々にも参考にしてもらえるような Raspberry Pi 向け組み込み Linux システム実装プロジェクトを始めました! https://gitlab.com/embl0w/embl0w-rpi https://github.com/embl0w/embl0w-rpi (ミラー)

Slide 8

Slide 8 text

embl0w-rpi の特徴とねらい ● ホビー向け・商用製品向け両方のリファレンスとなることを目指す ● 様々なクラウドサービス上でのクロスビルド CI/CD に対応する ● Raspbian/Debian で開発・テストするアプリのイメージ化を志向する ○ クロスコンパイルによるミニマルフットプリントを志向する組み込み Linux ディストリビューション (Buildroot, OpenEmbedded, Yocto Linux など) とは立ち位置が異なる ● 想定アプリケーション (これから作る) ○ テレワーク企業向けのカスタム Wi-Fi ルータ (WireGuard VPN 対応) ○ リッチコンテンツ対応のキオスク、デジタルサイネージ端末 ○ 高機能 IoT 端末

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

ビルドの課題と解決 ● 実機 (Raspberry Pi) がとても遅いためセルフビルドは時間がかかる ○ ARM マイコンは CPU が遅い、ストレージ (MicroSD) や I/O も絶望的に遅い ● もっと高速なマシンでクロスビルドしたい ○ 強力な x86_64 CPU を搭載しストレージも高速なサーバでビルドしたい ○ 最近は ARM64 CPU を搭載するサーバもあるので試したい ● クラウドサービスで CI/CD を構築したい ○ クラウドが利用できれば TCO 削減や可用性、コスト伸縮性の点で大きなメリットがある ○ CI/CD サービスの無料枠を活用すればコストをほぼゼロにできるし、 逆にコストを度外視した高速化も容易に試すことができる

Slide 11

Slide 11 text

高速なクロスビルドの実現手法 ● 仮想化・エミュレーション技術の活用が鍵 ○ QEMU のようなソフトを使い高速な x86_64 サーバで ARM の実行ファイルを動かす ● ハードウェアエミュレーション ○ ターゲットシステム全体を仮想化・エミュレーションして Linux カーネルを動かす ○ オーバーヘッドが大きく非効率的、ビルドの目的では使わない ● ユーザーランドエミュレーション (qemu-user-static) ○ ターゲットの CPU アーキテクチャの実行ファイルが、 ホストシステム上の 1 プロセスとして動くようにエミュレーションする ○ ホストシステムの高速なストレージや I/O を仮想化なしに直接扱える

Slide 12

Slide 12 text

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 バイナリをビルド

Slide 13

Slide 13 text

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 を起動するカーネルの機能

Slide 14

Slide 14 text

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 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 環境に入る

Slide 15

Slide 15 text

組み込み Linux システム ビルド環境の調査とベンチマーク クラウドおよび CI/CD サービスの活用

Slide 16

Slide 16 text

embl0w-rpi ビルド環境 ● embl0w-rpi の CI/CD には次の条件を満たすビルド環境が前提となる ○ Debian ベースの Linux システムである (コンテナでも可) ○ binfmt_misc が使える (異種アーキテクチャ実行ファイルの透過実行 ) ○ loopback device が使える (ディスク・パーティションイメージの操作 ) ● 様々な選択肢を実際に試しパフォーマンスやコストを比較してみた ○ 実機 vs サーバ ○ オンプレミス vs クラウド ○ x86_64 vs ARM64 ○ IaaS (VM) vs SaaS (CI/CD サービス)

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

ビルド環境調査 (オンプレミス / クラウド 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

Slide 19

Slide 19 text

ビルド環境調査 (オンプレミス / クラウド VM) ● Raspberry Pi 実機はやはり遅い。特にストレージ (MicroSD) の遅さが大きく影響 していると思われる。 ● ARM64 アーキテクチャの AWS c6g.large インスタンスが予想以上に速い。 x86_64 のインスタンスに比べてコストが低く ARM システム向けの CI ランナーと して有望。

Slide 20

Slide 20 text

ビルド環境調査 (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

Slide 21

Slide 21 text

ビルド環境調査 (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 が使えずジョブを完遂できなかった。対処法があ るかもしれない。

Slide 22

Slide 22 text

組み込み Linux システム ビルド環境の総括 まとめとお知らせ

Slide 23

Slide 23 text

まとめ ● 組み込み Linux システム ● embl0w-rpi プロジェクト ● 仮想化・エミュレーション技術 ● ビルド環境の調査とベンチマーク

Slide 24

Slide 24 text

embl0w-rpi プロジェクトの今後 ● 32bit / 64bit ユーザーランド対応 ● ビルドワークフローの最適化 ○ 適切なアーティファクトの保存 → ビルド反復時間の短縮 ○ DAG ワークフローエンジンの導入 → ビルド並列化・高速化 ● アプリケーション追加 ○ テレワーク企業向けカスタム Wi-Fi ルータ (WireGuard VPN 対応) ○ エンターテインメント、キオスク、デジタルサイネージ端末

Slide 25

Slide 25 text

お知らせ ● CEDEC 2020 でも登壇します 2020年9月3日(木) 16:45 〜 17:45 クラウド時代の組み込みLinuxエンターテインメント製品開発 ● embl0w-rpi を利用したシステム開発事例を紹介します 夏休みの自由研究の成果にご期待ください!

Slide 26

Slide 26 text

おわり ご清聴いただきありがとうございました

Slide 27

Slide 27 text

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