Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

YAEGASHI Takeshi

July 25, 2020
Tweet

More Decks by YAEGASHI Takeshi

Other Decks in Technology

Transcript

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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 サービス)

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide