SlideShare ist ein Scribd-Unternehmen logo
1 von 27
Downloaden Sie, um offline zu lesen
クロスコンパイルだけが能ではない
組み込みLinuxシステムのCI/CDインフラ構築
八重樫 剛史 Takeshi Yaegashi
2020-07-25
July Tech Festa 2020
#JTF2020 #JTF2020E
自己紹介
八重樫 剛史 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
今日の話題
● 組み込み Linux システムの CI/CD インフラ構築
● 組み込み Linux システムのビルド環境の調査とベンチマーク
● 次の話題は扱いません
○ セキュリティ
○ ソフトウェアライセンス
○ コンテンツ保護
○ オンラインアップデートシステム
組み込み Linux システム
CI/CD インフラの構築
手作りのホビープロジェクトから量産可能な製品へ
組み込み Linux システムとは?
● OS として Linux が動作するマイコンボードを組み込んだシステム
● ビデオゲーム玩具、ネットワーク機器、キオスク端末、
ロボット玩具、IoT端末、エッジAI、デジタルサイネージ、・・・
● Raspberry Pi の登場やメイカームーブメントの流行により、
商用製品からホビープロジェクトまで裾野が広がった
より多くのユーザーに届けられる製品を作る
● 手作り・一品物システムの卒業
○ Raspbian などの既製インストール環境のカスタマイズは量産・配布が難しい
● ディスクイメージを作る
○ OSやアプリのインストール・設定が完パケ状態で入ったディスクイメージを作る
○ Raspberry Pi なら MicroSD カードに書き込むと利用できるようになる
dd if=disk.img of=/dev/sdb bs=1M
○ デュプリケータを使って何百・何千ものコピーを量産できる
● アプリ専用 OS をブートストラップする
○ アプリ専用の最小構成の OS を構築しディスクイメージのサイズを削減する
○ 再現性のあるクリーンな環境をビルド・テストできるようになり品質が向上する
embl0w-rpi プロジェクト
● ホビープロジェクトの方々にも参考にしてもらえるような
Raspberry Pi 向け組み込み Linux システム実装プロジェクトを始めました!
https://gitlab.com/embl0w/embl0w-rpi
https://github.com/embl0w/embl0w-rpi (ミラー)
embl0w-rpi の特徴とねらい
● ホビー向け・商用製品向け両方のリファレンスとなることを目指す
● 様々なクラウドサービス上でのクロスビルド CI/CD に対応する
● Raspbian/Debian で開発・テストするアプリのイメージ化を志向する
○ クロスコンパイルによるミニマルフットプリントを志向する組み込み Linux ディストリビューション
(Buildroot, OpenEmbedded, Yocto Linux など) とは立ち位置が異なる
● 想定アプリケーション (これから作る)
○ テレワーク企業向けのカスタム Wi-Fi ルータ (WireGuard VPN 対応)
○ リッチコンテンツ対応のキオスク、デジタルサイネージ端末
○ 高機能 IoT 端末
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
ビルドの課題と解決
● 実機 (Raspberry Pi) がとても遅いためセルフビルドは時間がかかる
○ ARM マイコンは CPU が遅い、ストレージ (MicroSD) や I/O も絶望的に遅い
● もっと高速なマシンでクロスビルドしたい
○ 強力な x86_64 CPU を搭載しストレージも高速なサーバでビルドしたい
○ 最近は ARM64 CPU を搭載するサーバもあるので試したい
● クラウドサービスで CI/CD を構築したい
○ クラウドが利用できれば TCO 削減や可用性、コスト伸縮性の点で大きなメリットがある
○ CI/CD サービスの無料枠を活用すればコストをほぼゼロにできるし、
逆にコストを度外視した高速化も容易に試すことができる
高速なクロスビルドの実現手法
● 仮想化・エミュレーション技術の活用が鍵
○ QEMU のようなソフトを使い高速な x86_64 サーバで ARM の実行ファイルを動かす
● ハードウェアエミュレーション
○ ターゲットシステム全体を仮想化・エミュレーションして Linux カーネルを動かす
○ オーバーヘッドが大きく非効率的、ビルドの目的では使わない
● ユーザーランドエミュレーション (qemu-user-static)
○ ターゲットの CPU アーキテクチャの実行ファイルが、
ホストシステム上の 1 プロセスとして動くようにエミュレーションする
○ ホストシステムの高速なストレージや I/O を仮想化なしに直接扱える
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 バイナリをビルド
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
を起動するカーネルの機能
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, worldn"); return 0; }
# gcc hello.c
# ./a.out
hello, world
x86_64 ホストで ARM の Debian buster をブートストラップする
x86_64 ホストで ARM の
Debian ファイルシステムを
ブートストラップする
x86_64 ホストで
ARM Debian chroot 環境に入る
組み込み Linux システム
ビルド環境の調査とベンチマーク
クラウドおよび CI/CD サービスの活用
embl0w-rpi ビルド環境
● embl0w-rpi の CI/CD には次の条件を満たすビルド環境が前提となる
○ Debian ベースの Linux システムである (コンテナでも可)
○ binfmt_misc が使える (異種アーキテクチャ実行ファイルの透過実行 )
○ loopback device が使える (ディスク・パーティションイメージの操作 )
● 様々な選択肢を実際に試しパフォーマンスやコストを比較してみた
○ 実機 vs サーバ
○ オンプレミス vs クラウド
○ x86_64 vs ARM64
○ IaaS (VM) vs SaaS (CI/CD サービス)
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
ビルド環境調査 (オンプレミス / クラウド 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
ビルド環境調査 (オンプレミス / クラウド VM)
● Raspberry Pi 実機はやはり遅い。特にストレージ (MicroSD) の遅さが大きく影響
していると思われる。
● ARM64 アーキテクチャの AWS c6g.large インスタンスが予想以上に速い。
x86_64 のインスタンスに比べてコストが低く ARM システム向けの CI ランナーと
して有望。
ビルド環境調査 (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
ビルド環境調査 (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 が使えずジョブを完遂できなかった。対処法があ
るかもしれない。
組み込み Linux システム
ビルド環境の総括
まとめとお知らせ
まとめ
● 組み込み Linux システム
● embl0w-rpi プロジェクト
● 仮想化・エミュレーション技術
● ビルド環境の調査とベンチマーク
embl0w-rpi プロジェクトの今後
● 32bit / 64bit ユーザーランド対応
● ビルドワークフローの最適化
○ 適切なアーティファクトの保存 → ビルド反復時間の短縮
○ DAG ワークフローエンジンの導入 → ビルド並列化・高速化
● アプリケーション追加
○ テレワーク企業向けカスタム Wi-Fi ルータ (WireGuard VPN 対応)
○ エンターテインメント、キオスク、デジタルサイネージ端末
お知らせ
● CEDEC 2020 でも登壇します
2020年9月3日(木) 16:45 〜 17:45
クラウド時代の組み込みLinuxエンターテインメント製品開発
● embl0w-rpi を利用したシステム開発事例を紹介します
夏休みの自由研究の成果にご期待ください!
おわり
ご清聴いただきありがとうございました
Credits
この資料は次の素材を利用して作成しました
● Free Google Slides Templates
● いらすとや

Weitere ähnliche Inhalte

Was ist angesagt?

msgraph-sshpubkey
msgraph-sshpubkeymsgraph-sshpubkey
msgraph-sshpubkeyyaegashi
 
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションPlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションKazuhiro Hara
 
Cocos2d-x(JS) ハンズオン #02 「画像表示とアクション」
Cocos2d-x(JS) ハンズオン #02 「画像表示とアクション」Cocos2d-x(JS) ハンズオン #02 「画像表示とアクション」
Cocos2d-x(JS) ハンズオン #02 「画像表示とアクション」Tomoaki Shimizu
 
Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」
Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」
Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」Tomoaki Shimizu
 
Cocos2d-x(JS) ハンズオン #06「3rd SDKの導入を簡単にするSDKBOX」
Cocos2d-x(JS) ハンズオン #06「3rd SDKの導入を簡単にするSDKBOX」Cocos2d-x(JS) ハンズオン #06「3rd SDKの導入を簡単にするSDKBOX」
Cocos2d-x(JS) ハンズオン #06「3rd SDKの導入を簡単にするSDKBOX」Tomoaki Shimizu
 
Cocos2d xで簡単なゲームを作ってみよう!
Cocos2d xで簡単なゲームを作ってみよう!Cocos2d xで簡単なゲームを作ってみよう!
Cocos2d xで簡単なゲームを作ってみよう!Tomoaki Shimizu
 
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」Tomoaki Shimizu
 
Cocos2d-x(JS) ハンズオン #09「ラベル・テキストボックス」
Cocos2d-x(JS) ハンズオン #09「ラベル・テキストボックス」Cocos2d-x(JS) ハンズオン #09「ラベル・テキストボックス」
Cocos2d-x(JS) ハンズオン #09「ラベル・テキストボックス」Tomoaki Shimizu
 
一番簡単なWebSocketの試し方
一番簡単なWebSocketの試し方一番簡単なWebSocketの試し方
一番簡単なWebSocketの試し方Shunji Konishi
 
dockerでImmutable InfrastructureなWordPressを考える
dockerでImmutable InfrastructureなWordPressを考えるdockerでImmutable InfrastructureなWordPressを考える
dockerでImmutable InfrastructureなWordPressを考えるGMOインターネット
 
HTML5 Conference 2015 悩める組込機器向けウェブコンテンツのパフォーマンス
HTML5 Conference 2015 悩める組込機器向けウェブコンテンツのパフォーマンスHTML5 Conference 2015 悩める組込機器向けウェブコンテンツのパフォーマンス
HTML5 Conference 2015 悩める組込機器向けウェブコンテンツのパフォーマンスFutomi Hatano
 
Cocos2d-x(JS) ハンズオン #03「複数あるボタンの使い分け」
Cocos2d-x(JS) ハンズオン #03「複数あるボタンの使い分け」Cocos2d-x(JS) ハンズオン #03「複数あるボタンの使い分け」
Cocos2d-x(JS) ハンズオン #03「複数あるボタンの使い分け」Tomoaki Shimizu
 
Hokuriku.net 2013 01-26 node.js
Hokuriku.net 2013 01-26 node.jsHokuriku.net 2013 01-26 node.js
Hokuriku.net 2013 01-26 node.jsTadahiro Ishisaka
 
Nuxt.js入門 2018/02/02 Vue.js入門勉強会@渋谷 発表資料
Nuxt.js入門 2018/02/02 Vue.js入門勉強会@渋谷 発表資料Nuxt.js入門 2018/02/02 Vue.js入門勉強会@渋谷 発表資料
Nuxt.js入門 2018/02/02 Vue.js入門勉強会@渋谷 発表資料慎二 山田
 
「釣り★スタ」でのCocos2d-JSを使ってのアプリアップデート事例 (1)
「釣り★スタ」でのCocos2d-JSを使ってのアプリアップデート事例 (1)「釣り★スタ」でのCocos2d-JSを使ってのアプリアップデート事例 (1)
「釣り★スタ」でのCocos2d-JSを使ってのアプリアップデート事例 (1)gree_tech
 
Pasonatech docker hands on
Pasonatech docker hands onPasonatech docker hands on
Pasonatech docker hands onssuser3a4b8c
 
kpackによるコンテナイメージのビルド
kpackによるコンテナイメージのビルドkpackによるコンテナイメージのビルド
kpackによるコンテナイメージのビルドMasanori Nara
 
cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携Tomoaki Shimizu
 
A 2-1 gitwebmatrix 2 から使う node.js on windows azure
A 2-1 gitwebmatrix 2 から使う node.js on windows azureA 2-1 gitwebmatrix 2 から使う node.js on windows azure
A 2-1 gitwebmatrix 2 から使う node.js on windows azureGoAzure
 

Was ist angesagt? (20)

msgraph-sshpubkey
msgraph-sshpubkeymsgraph-sshpubkey
msgraph-sshpubkey
 
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションPlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
 
Cocos2d-x(JS) ハンズオン #02 「画像表示とアクション」
Cocos2d-x(JS) ハンズオン #02 「画像表示とアクション」Cocos2d-x(JS) ハンズオン #02 「画像表示とアクション」
Cocos2d-x(JS) ハンズオン #02 「画像表示とアクション」
 
Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」
Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」
Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」
 
Cocos2d-x(JS) ハンズオン #06「3rd SDKの導入を簡単にするSDKBOX」
Cocos2d-x(JS) ハンズオン #06「3rd SDKの導入を簡単にするSDKBOX」Cocos2d-x(JS) ハンズオン #06「3rd SDKの導入を簡単にするSDKBOX」
Cocos2d-x(JS) ハンズオン #06「3rd SDKの導入を簡単にするSDKBOX」
 
Cocos2d xで簡単なゲームを作ってみよう!
Cocos2d xで簡単なゲームを作ってみよう!Cocos2d xで簡単なゲームを作ってみよう!
Cocos2d xで簡単なゲームを作ってみよう!
 
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
 
Cocos2d-x(JS) ハンズオン #09「ラベル・テキストボックス」
Cocos2d-x(JS) ハンズオン #09「ラベル・テキストボックス」Cocos2d-x(JS) ハンズオン #09「ラベル・テキストボックス」
Cocos2d-x(JS) ハンズオン #09「ラベル・テキストボックス」
 
一番簡単なWebSocketの試し方
一番簡単なWebSocketの試し方一番簡単なWebSocketの試し方
一番簡単なWebSocketの試し方
 
dockerでImmutable InfrastructureなWordPressを考える
dockerでImmutable InfrastructureなWordPressを考えるdockerでImmutable InfrastructureなWordPressを考える
dockerでImmutable InfrastructureなWordPressを考える
 
HTML5 Conference 2015 悩める組込機器向けウェブコンテンツのパフォーマンス
HTML5 Conference 2015 悩める組込機器向けウェブコンテンツのパフォーマンスHTML5 Conference 2015 悩める組込機器向けウェブコンテンツのパフォーマンス
HTML5 Conference 2015 悩める組込機器向けウェブコンテンツのパフォーマンス
 
Cocos2d-x(JS) ハンズオン #03「複数あるボタンの使い分け」
Cocos2d-x(JS) ハンズオン #03「複数あるボタンの使い分け」Cocos2d-x(JS) ハンズオン #03「複数あるボタンの使い分け」
Cocos2d-x(JS) ハンズオン #03「複数あるボタンの使い分け」
 
Hokuriku.net 2013 01-26 node.js
Hokuriku.net 2013 01-26 node.jsHokuriku.net 2013 01-26 node.js
Hokuriku.net 2013 01-26 node.js
 
Nuxt.js入門 2018/02/02 Vue.js入門勉強会@渋谷 発表資料
Nuxt.js入門 2018/02/02 Vue.js入門勉強会@渋谷 発表資料Nuxt.js入門 2018/02/02 Vue.js入門勉強会@渋谷 発表資料
Nuxt.js入門 2018/02/02 Vue.js入門勉強会@渋谷 発表資料
 
「釣り★スタ」でのCocos2d-JSを使ってのアプリアップデート事例 (1)
「釣り★スタ」でのCocos2d-JSを使ってのアプリアップデート事例 (1)「釣り★スタ」でのCocos2d-JSを使ってのアプリアップデート事例 (1)
「釣り★スタ」でのCocos2d-JSを使ってのアプリアップデート事例 (1)
 
Pasonatech docker hands on
Pasonatech docker hands onPasonatech docker hands on
Pasonatech docker hands on
 
kpackによるコンテナイメージのビルド
kpackによるコンテナイメージのビルドkpackによるコンテナイメージのビルド
kpackによるコンテナイメージのビルド
 
cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携
 
Cocos2d-x 3D Extension
Cocos2d-x 3D ExtensionCocos2d-x 3D Extension
Cocos2d-x 3D Extension
 
A 2-1 gitwebmatrix 2 から使う node.js on windows azure
A 2-1 gitwebmatrix 2 から使う node.js on windows azureA 2-1 gitwebmatrix 2 から使う node.js on windows azure
A 2-1 gitwebmatrix 2 から使う node.js on windows azure
 

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

「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)Kazuyuki Sato
 
Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Kazuo Asano (@kazuo_asa)
 
2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMF2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMFAtomu Hidaka
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成Izumi Tsutsui
 
コンテナ今昔物語_2021_12_22
コンテナ今昔物語_2021_12_22コンテナ今昔物語_2021_12_22
コンテナ今昔物語_2021_12_22勇 黒沢
 
OSC 2011 Hokkaido 自宅SAN友の会(後半)
OSC 2011 Hokkaido 自宅SAN友の会(後半)OSC 2011 Hokkaido 自宅SAN友の会(後半)
OSC 2011 Hokkaido 自宅SAN友の会(後半)Satoshi Shimazaki
 
NetBSD on Google Compute Engine
NetBSD on Google Compute EngineNetBSD on Google Compute Engine
NetBSD on Google Compute EngineRyo ONODERA
 
Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めYou&I
 
45分で理解する 最近のスパコン事情 斉藤之雄
45分で理解する 最近のスパコン事情 斉藤之雄45分で理解する 最近のスパコン事情 斉藤之雄
45分で理解する 最近のスパコン事情 斉藤之雄Yukio Saito
 
RでGPU使ってみた
RでGPU使ってみたRでGPU使ってみた
RでGPU使ってみたKazuya Wada
 
OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)
OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)
OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)Satoshi Shimazaki
 
はじめてのpostmarketOSインストール Windowsタブレット #kagolug Beginner for install postmar...
はじめてのpostmarketOSインストール Windowsタブレット  #kagolug  Beginner for install postmar...はじめてのpostmarketOSインストール Windowsタブレット  #kagolug  Beginner for install postmar...
はじめてのpostmarketOSインストール Windowsタブレット #kagolug Beginner for install postmar...Netwalker lab kapper
 
ET2016 Smart Japan Alliance Llilum 161118
ET2016 Smart Japan Alliance Llilum 161118ET2016 Smart Japan Alliance Llilum 161118
ET2016 Smart Japan Alliance Llilum 161118Atomu Hidaka
 
CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1Kotaro Noyama
 
Xilinx SDSoC(2016.2)解体新書ソフトウェア編
Xilinx SDSoC(2016.2)解体新書ソフトウェア編Xilinx SDSoC(2016.2)解体新書ソフトウェア編
Xilinx SDSoC(2016.2)解体新書ソフトウェア編Mr. Vengineer
 
インフラ野郎 Azureチーム v18.11 at Tech Summit 2018
インフラ野郎 Azureチーム v18.11 at Tech Summit 2018インフラ野郎 Azureチーム v18.11 at Tech Summit 2018
インフラ野郎 Azureチーム v18.11 at Tech Summit 2018Toru Makabe
 
Xilinx SDSoC(2016.3)解体新書ソフトウェア編
Xilinx SDSoC(2016.3)解体新書ソフトウェア編Xilinx SDSoC(2016.3)解体新書ソフトウェア編
Xilinx SDSoC(2016.3)解体新書ソフトウェア編Mr. Vengineer
 

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

「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
 
Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6
 
2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMF2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMF
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
 
コンテナ今昔物語_2021_12_22
コンテナ今昔物語_2021_12_22コンテナ今昔物語_2021_12_22
コンテナ今昔物語_2021_12_22
 
OSC 2011 Hokkaido 自宅SAN友の会(後半)
OSC 2011 Hokkaido 自宅SAN友の会(後半)OSC 2011 Hokkaido 自宅SAN友の会(後半)
OSC 2011 Hokkaido 自宅SAN友の会(後半)
 
NetBSD on Google Compute Engine
NetBSD on Google Compute EngineNetBSD on Google Compute Engine
NetBSD on Google Compute Engine
 
Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始め
 
GTC Japan 2017
GTC Japan 2017GTC Japan 2017
GTC Japan 2017
 
45分で理解する 最近のスパコン事情 斉藤之雄
45分で理解する 最近のスパコン事情 斉藤之雄45分で理解する 最近のスパコン事情 斉藤之雄
45分で理解する 最近のスパコン事情 斉藤之雄
 
Pdp11 on-fpga
Pdp11 on-fpgaPdp11 on-fpga
Pdp11 on-fpga
 
RでGPU使ってみた
RでGPU使ってみたRでGPU使ってみた
RでGPU使ってみた
 
OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)
OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)
OSC 2011 Tokyo/Fall 自宅SAN友の会 (Infinibandお試し編)
 
Intel graphics
Intel graphicsIntel graphics
Intel graphics
 
はじめてのpostmarketOSインストール Windowsタブレット #kagolug Beginner for install postmar...
はじめてのpostmarketOSインストール Windowsタブレット  #kagolug  Beginner for install postmar...はじめてのpostmarketOSインストール Windowsタブレット  #kagolug  Beginner for install postmar...
はじめてのpostmarketOSインストール Windowsタブレット #kagolug Beginner for install postmar...
 
ET2016 Smart Japan Alliance Llilum 161118
ET2016 Smart Japan Alliance Llilum 161118ET2016 Smart Japan Alliance Llilum 161118
ET2016 Smart Japan Alliance Llilum 161118
 
CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1
 
Xilinx SDSoC(2016.2)解体新書ソフトウェア編
Xilinx SDSoC(2016.2)解体新書ソフトウェア編Xilinx SDSoC(2016.2)解体新書ソフトウェア編
Xilinx SDSoC(2016.2)解体新書ソフトウェア編
 
インフラ野郎 Azureチーム v18.11 at Tech Summit 2018
インフラ野郎 Azureチーム v18.11 at Tech Summit 2018インフラ野郎 Azureチーム v18.11 at Tech Summit 2018
インフラ野郎 Azureチーム v18.11 at Tech Summit 2018
 
Xilinx SDSoC(2016.3)解体新書ソフトウェア編
Xilinx SDSoC(2016.3)解体新書ソフトウェア編Xilinx SDSoC(2016.3)解体新書ソフトウェア編
Xilinx SDSoC(2016.3)解体新書ソフトウェア編
 

Mehr von yaegashi

go generate 完全入門
go generate 完全入門go generate 完全入門
go generate 完全入門yaegashi
 
msgraph.go: Go言語で Microsoft Graph プログラミング
msgraph.go: Go言語で Microsoft Graph プログラミングmsgraph.go: Go言語で Microsoft Graph プログラミング
msgraph.go: Go言語で Microsoft Graph プログラミングyaegashi
 
AnsibleでAzureの インフラを管理する話 + α
AnsibleでAzureの インフラを管理する話 + αAnsibleでAzureの インフラを管理する話 + α
AnsibleでAzureの インフラを管理する話 + αyaegashi
 
Microsoft Graph API Library for Go
Microsoft Graph API Library for GoMicrosoft Graph API Library for Go
Microsoft Graph API Library for Goyaegashi
 
Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話yaegashi
 
golang binary hacks
golang binary hacksgolang binary hacks
golang binary hacksyaegashi
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件yaegashi
 
Ansible モジュール 作成・配布・貢献
Ansible モジュール 作成・配布・貢献Ansible モジュール 作成・配布・貢献
Ansible モジュール 作成・配布・貢献yaegashi
 

Mehr von yaegashi (8)

go generate 完全入門
go generate 完全入門go generate 完全入門
go generate 完全入門
 
msgraph.go: Go言語で Microsoft Graph プログラミング
msgraph.go: Go言語で Microsoft Graph プログラミングmsgraph.go: Go言語で Microsoft Graph プログラミング
msgraph.go: Go言語で Microsoft Graph プログラミング
 
AnsibleでAzureの インフラを管理する話 + α
AnsibleでAzureの インフラを管理する話 + αAnsibleでAzureの インフラを管理する話 + α
AnsibleでAzureの インフラを管理する話 + α
 
Microsoft Graph API Library for Go
Microsoft Graph API Library for GoMicrosoft Graph API Library for Go
Microsoft Graph API Library for Go
 
Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話
 
golang binary hacks
golang binary hacksgolang binary hacks
golang binary hacks
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件
 
Ansible モジュール 作成・配布・貢献
Ansible モジュール 作成・配布・貢献Ansible モジュール 作成・配布・貢献
Ansible モジュール 作成・配布・貢献
 

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

  • 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 端末
  • 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, worldn"); return 0; } # gcc hello.c # ./a.out hello, world x86_64 ホストで ARM の Debian buster をブートストラップする x86_64 ホストで ARM の Debian ファイルシステムを ブートストラップする x86_64 ホストで ARM Debian chroot 環境に入る
  • 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 が使えずジョブを完遂できなかった。対処法があ るかもしれない。
  • 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 を利用したシステム開発事例を紹介します 夏休みの自由研究の成果にご期待ください!