Slide 1

Slide 1 text

© 2019 NTT Communications Yocto projectを用いた Custom Linux Image のつくりかた Toshifumi NISHINAGA 1

Slide 2

Slide 2 text

© 2019 NTT Communications $ who ● Name: Toshifumi NISHINAGA ● Activities: ○ Google Summer of Code 2016(Linux Foundation) ■ https://summerofcode.withgoogle.com/archive/2016/projects/6617849892175872/ ■ Porting Linux to ARM Cortex-M7 microcontroller. ○ U-Boot contributor(not active recently…) ● link: ○ https://github.com/tnishinaga ○ https://speakerdeck.com/tnishinaga 2

Slide 3

Slide 3 text

© 2019 NTT Communications 今のお仕事の目的 ● Kamueeを配布するための Kamuee Image Builderを更改したい ● Cutting Edge側の希望 ○ VyOSのようなISOインストーラーがほしい ○ ソフトウェアバージョンの冪等性確保 ○ ビルド時間短縮 ○ ライセンス管理の簡略化 ○ version切り替え及びUpdateが容易な仕組み 3 Yocto Custom Linux Installer

Slide 4

Slide 4 text

© 2019 NTT Communications 目次 1. Custom Linux ImageとYocto project 2. Handson: Let's build linux image with yocto project 3. Yocto project overview 4. Handson: Add new package to reference image 5. Appendix 4

Slide 5

Slide 5 text

© 2019 NTT Communications Custom Linux ImageとYocto project 5

Slide 6

Slide 6 text

© 2019 NTT Communications なぜカスタムLinuxイメージを作るのか ● Debian等のディストリをベースに改造したほうが便利 ● custom linux imageが必要になる場面 ○ ストレージ容量が極端に少ない ○ 余計なソフトウェアを入れたくない ○ 入っているソフトウェアのライセンスをすべて把握したい ○ ソフトウェアバージョンの冪等性を確保したい 6

Slide 7

Slide 7 text

© 2019 NTT Communications Custom Linux Imageを作るソフトウェア ● Yocto project ○ https://www.yoctoproject.org ○ 流行ってる方。将来性があるかを確かめるためにも今回開発に利用 ○ Buildrootに比べると最初のビルドからちょっと大変 ● Buildroot ○ https://buildroot.org ○ Linux kernelのmenuconfigの感覚でCustom Linux Imageが簡単に作れる。 ○ Yoctoに比べると最初のビルドは簡単 7 Ref: [Deciding between Buildroot & Yocto](https://lwn.net/Articles/682540/)

Slide 8

Slide 8 text

© 2019 NTT Communications Yocto projectとは ● Custom Linux Imageを作るため の巨大なプロジェクト ● ビルドシステム、標準ディストリ ビューションなどを内包 https://www.yoctoproject.org/ 8

Slide 9

Slide 9 text

© 2019 NTT Communications Simple Image: Yocto project Tux: © Larry Ewing, Simon Budig and Anja Gerwinski http://www.home.unix-ag.org/simon/penguin/README 9 Yocto project Build Linux Kernel + Rootfs

Slide 10

Slide 10 text

© 2019 NTT Communications Yocto features(pickup) ● Binary Reproducibility ○ アプリケーションバージョンの冪等性を保てる (ビルド番号とcommit idがあれば) ● License Manifest ○ イメージに含まれるソフトウェアのライセンスはすべて把握可能 ○ 拒否したいライセンスの除外も可 ● Supports Partial Builds ○ 2度目以降はキャッシュが使えて高速ビルドができる。ただし 1度目は遅い。 ● その他 ○ Webビルドの仕組みがある(2019/02前半にバグが直って使えるようになった) ○ Cross Toolchain(SDK)の作成も一緒にできる 10 Ref: https://www.yoctoproject.org/docs/2.6/mega-manual/mega-manual.html#gs-features

Slide 11

Slide 11 text

© 2019 NTT Communications Tutorial: Let's build linux image with yocto project 11

Slide 12

Slide 12 text

© 2019 NTT Communications Tutorial: Let's build linux image with yocto ● Contents ○ build machine requirements ○ build machine setup ○ build ○ run on QEMU 12

Slide 13

Slide 13 text

© 2019 NTT Communications build machine requirements(my experience) ● CPU ○ more than 4 core(high performance as possible as you can) ● Memory ○ more than 1GB x (cpu cores) ● Storage ○ more than 120GB(minimal) ● High speed Internet ● OS ○ Ubuntu 16.04 LTS 13

Slide 14

Slide 14 text

© 2019 NTT Communications Build machine setup ● Install packages ○ sudo apt-get install \ gawk wget git-core diffstat unzip texinfo gcc-multilib \ build-essential chrpath socat cpio python python3 python3-pip \ python3-pexpect xz-utils debianutils iputils-ping \ libsdl1.2-dev xterm xsltproc docbook-utils fop dblatex xmlto \ python-git ● Reference ○ https://www.yoctoproject.org/docs/2.6/ref-manual/ref-manual.html#requir ed-packages-for-the-build-host 14 Ref: https://www.yoctoproject.org/docs/2.6/brief-yoctoprojectqs/brief-yoctoprojectqs.html

Slide 15

Slide 15 text

© 2019 NTT Communications Build machine setup ● Clone poky repository ○ git clone git://git.yoctoproject.org/poky ~/poky ● Switch to newest stable branch(thud:2.6) ○ cd ~/poky ○ git checkout -b thud origin/thud 15 Ref: https://www.yoctoproject.org/docs/2.6/brief-yoctoprojectqs/brief-yoctoprojectqs.html

Slide 16

Slide 16 text

© 2019 NTT Communications Build ● load yocto toolchains ○ cd ~/poky ○ source oe-init-build-env ■ *** this script creates build directory(~/poky/build) and cd to it *** ■ *** it loads yocto build system tools(bitbake, devtool, etc...) *** ● build reference image ○ bitbake core-image-minimal ● Have a coffee break(more than 1 hour) ○ ☕☕☕ 16

Slide 17

Slide 17 text

© 2019 NTT Communications Run on QEMU ● runqemu qemux86 core-image-minimal nographic 17

Slide 18

Slide 18 text

© 2019 NTT Communications 前半おしまい 18

Slide 19

Slide 19 text

© 2019 NTT Communications 簡単そう? 難しそう? 19

Slide 20

Slide 20 text

© 2019 NTT Communications ここからがたいへん 20

Slide 21

Slide 21 text

© 2019 NTT Communications Yocto Challenges ● Steep Learning Curve ● Understanding What Changes You Need to Make For Your Design Requires Some Research ○ チュートリアル以降の難易度がゲキムズ ○ 「同じことをするために複数の方法があるので迷う」と公式にあるが、それどこ ろか1つもわからないときがある ○ わからない→わかる→なんもわからんの繰り返し ○ ようこそ組み込み開発の世界へ。 21 Ref: https://www.yoctoproject.org/docs/2.6/mega-manual/mega-manual.html#gs-challenges

Slide 22

Slide 22 text

© 2019 NTT Communications ● Linuxとその周辺に関する深い知識 ○ bootloaderからlogin shellが出るまでに何がどう動くかの知識 ○ Linuxのディレクトリ構造の知識 ○ package作成手順の知識 ● アプリケーションのビルド経験 ○ 問題切り分け能力 ■ Yoctoの特殊環境が原因? ただのバグ? CPUアーキテクチャ固有の問題 ? ○ 経験からくるエスパー力 ■ 情報のないエラーログからも10の原因を想定し試して解決する ● エラーに絶対負けないという根気 Yocto projectを使うのに必要な能力 22

Slide 23

Slide 23 text

© 2019 NTT Communications ● 自分が初心者の頃わからなかったことを解決していく ここからの方針 23

Slide 24

Slide 24 text

© 2019 NTT Communications ● Yocto projectの全体像 ○ recipe, config, layer, bitbakeの関係 ○ ソースコードの概要 ● 何をしたいときに何をすれば良い? ● イメージの変更方法 ○ パッケージの追加方法(recipe作成) ○ Kernel moduleの追加(kernel config) ○ CPUアーキテクチャの設定方法(Machine BSP Config) わからなかったこと 24

Slide 25

Slide 25 text

© 2019 NTT Communications 今後の目次 ● Yoctoの全体像と用語を知る ○ Overview ○ レイヤシステム ○ build system ○ ソースコードの概要 ● 何をしたいときに何をすれば良い? ● Handson: パッケージを追加してみる 25

Slide 26

Slide 26 text

© 2019 NTT Communications 今後の目次 ● Yoctoの全体像と用語を知る ○ Overview ○ レイヤシステム ○ build system ○ ソースコードの概要 ● 何をしたいときに何をすれば良い? ● Handson: パッケージを追加してみる 26

Slide 27

Slide 27 text

© 2019 NTT Communications Yocto project overview 27

Slide 28

Slide 28 text

© 2019 NTT Communications Yocto project overview ● Yocto projectを構成する要素を分解する ● 出てくる用語に迷わないようにする ○ open-embedded(oe) ○ poky ○ version(develop name) ○ bitbake ○ layer ○ recipe ○ etc... 28 Ref: https://www.yoctoproject.org/docs/2.5.2/mega-manual/mega-manual.html#what-is-the-yocto-project

Slide 29

Slide 29 text

© 2019 NTT Communications Image from : https://www.yoctoproject.org/docs/2.5.2/meg a-manual/figures/key-dev-elements.png Yocto project overview ● Yocto is not distribution name ○ Yocto is project name ○ It contains build-tools, distribution, etc… ● Poky ○ Reference Distribution ● OpenEmbedded ○ Build framework ○ It provide build system(bitbake, recipe, etc...) 29

Slide 30

Slide 30 text

© 2019 NTT Communications Simple Image: Yocto project 30 Yocto project Poky OpenEmbedded Recipe sets build system Poky based distribution (Linux Kernel + rootfs) Tux: © Larry Ewing, Simon Budig and Anja Gerwinski http://www.home.unix-ag.org/simon/penguin/README

Slide 31

Slide 31 text

© 2019 NTT Communications Yocto project version ● Here is version number and codename ○ 2.6 : thud (latest at 2019/02/01) ○ 2.5 : sumo ○ 2.4 : rocko ● Yocto using both name ○ https://git.yoctoproject.org/cgit/cgit.cgi/poky/refs/ ○ when checkout 2.6 branch(it has update since released) ■ git checkout -b thud origin/thud ○ when checkout 2.6 release ■ git checkout tags/yocto-2.6 -b yocto-2.6 31

Slide 32

Slide 32 text

© 2019 NTT Communications Build System Overview(simple version) 32 bitbake Metadata Configurations Poky based distribution (Linux Kernel + rootfs) Tux: © Larry Ewing, Simon Budig and Anja Gerwinski http://www.home.unix-ag.org/simon/penguin/README

Slide 33

Slide 33 text

© 2019 NTT Communications Build System Concepts ● Metadata(recipe + patch) ● Configurations ○ User configuration ○ Machine BSP Configuration ○ Policy Configuration ● Layer ● bitbake 33 https://www.yoctoproject.org/docs/2.6/mega-manual/mega-manual.html#openembedded-build-system- build-concepts

Slide 34

Slide 34 text

© 2019 NTT Communications Recipe ● パッケージ作成の素 ● ビルド手順(tasks)等が書いてある ● 拡張子は.bbと.bbappendの2種類ある ○ .bb : オリジナルのレシピファイル ○ .bbappend : オリジナルに変更を加える 34

Slide 35

Slide 35 text

© 2019 NTT Communications ● イメージに簡易な変更を加える設定集 ● 拡張子は.conf ● 大まかに以下の3つがある ○ User config(ここではUser configを紹介) ○ Machine BSP config ○ Policy Configuration Configurations 35 https://www.yoctoproject.org/docs/2.6/mega-manual/mega-manual.html#metadata-machine-configuration-and-poli cy-configuration

Slide 36

Slide 36 text

© 2019 NTT Communications User configuration ● ユーザーの希望する設定をビルドシステムに 伝えるもの ● build/conf以下にファイルがある ● 詳細は次ページ 36 https://www.yoctoproject.org/docs/2.6/mega-manual/mega-manual.html#user-configuration

Slide 37

Slide 37 text

© 2019 NTT Communications User configuration files 37 ● conf/bblayers.conf ○ レイヤの登録 ○ レイヤの順序関係もここで設定 ● conf/local.conf ○ ターゲットマシンの設定や出力イメージタイプの設定な どができる ○ 追加パッケージ設定もここで行える ○ 軽微な変更はとりあえずここに書けばOK https://www.yoctoproject.org/docs/2.6/mega-manual/mega-manual.html#user-configuration

Slide 38

Slide 38 text

© 2019 NTT Communications Layer(meta-XXX) ● レシピやconfigを集めたもの ● イメージはこのレイヤーを重ねて作っ ていく ● 下のレイヤでappendレシピを書くと 上のレイヤのレシピを加筆修正でき る ● レイヤの順序はconf/bblayers.conf に定義されている Distribution layer1 layer3 layer2 38 append append

Slide 39

Slide 39 text

© 2019 NTT Communications bitbake ● イメージをビルドするシステム ● Recipeとconfigを参考にソースの取得、ビ ルド、イメージ生成、SDK生成等を行う ● bitbakeコマンドで使える 39 https://www.yoctoproject.org/docs/2.6/mega-manual/mega-manual.html#bitbake-dev-environment

Slide 40

Slide 40 text

© 2019 NTT Communications これまでの用語まとめ 40 用語 概要 Yocto プロジェクト名 OpenEmbedded(OE) ビルドシステム Poky ディストリビューション名 thud 開発名。Versionでは2.6 bitbake ビルドシステムのコマンド recipe パッケージビルド方法を書いたもの layer パッケージやconfigをまとめたもの

Slide 41

Slide 41 text

© 2019 NTT Communications source code overview 41

Slide 42

Slide 42 text

© 2019 NTT Communications Yocto project source code ● Poky repository ○ https://git.yoctoproject.org/git/poky ○ Yocto projectのシステムが全て入ったリポジトリ ● 今後のためPokyディレクトリ以下の構造を簡単にご説明 42

Slide 43

Slide 43 text

© 2019 NTT Communications tree -L 1 poky 43

Slide 44

Slide 44 text

© 2019 NTT Communications tree -L 1 poky 44 bitbakeコマンドなど ビルドシステムのファイルが 入っている

Slide 45

Slide 45 text

© 2019 NTT Communications tree -L 1 poky 45 ビルド用ディレクトリ ビルド済みイメージや user configなどが入る

Slide 46

Slide 46 text

© 2019 NTT Communications tree -L 1 poky 46 最初から用意されている layer たち

Slide 47

Slide 47 text

© 2019 NTT Communications tree -L 1 poky 47 環境設定用ファイル 最初にsourceコマンドで読み 込む

Slide 48

Slide 48 text

© 2019 NTT Communications tree -L 1 poky 48 開発を便利にするスクリプトた ちがあるところ wicやrunqemuはここにある

Slide 49

Slide 49 text

© 2019 NTT Communications その他知ると便利なディレクトリ ● build/tmp/deploy/images/[machine] ○ ビルド後のイメージが入っているディレクトリ ○ .ext4やbzImageなど ● build/tmp/deploy/licenses ○ packageのライセンスが集められているディレクトリ 49

Slide 50

Slide 50 text

© 2019 NTT Communications 今後の目次 ● Yoctoの全体像と用語を知る ○ Overview ○ レイヤシステム ○ build system ○ ソースコードの概要 ● 何をしたいときに何をすれば良い? ● Handson: パッケージを追加してみる 50

Slide 51

Slide 51 text

© 2019 NTT Communications 何をしたいとき何をすれば良い? 51

Slide 52

Slide 52 text

© 2019 NTT Communications 何をしたいときに何をすれば良いかのまとめ 52 やりたいこと 方法 パッケージの追加したい recipeの追加、新規作成 既存パッケージの編集したい recipeの加筆修正 既存パッケージのconfigを変更したい local.conf修正など Linux Kernel configを変更したい recipeの加筆修正 ISOイメージからインストールしたい local.conf修正、recipeの加筆修正 Target CPUを変更したい Machine BSP configの作成 local.confの修正

Slide 53

Slide 53 text

© 2019 NTT Communications 今後の目次 ● Yoctoの全体像と用語を知る ○ Overview ○ レイヤシステム ○ build system ○ ソースコードの概要 ● 何をしたいときに何をすれば良い? ● Handson: パッケージを追加してみる 53

Slide 54

Slide 54 text

© 2019 NTT Communications Handson: Add new package to reference image 54

Slide 55

Slide 55 text

© 2019 NTT Communications ● Add cowsay command with devtool ○ cowsay: 牛が話すジョークアプリ ○ devtool: レシピの追加等をサポートする ヘルパーツール ○ https://github.com/schacon/cowsay Handson: Add new package to reference image 55

Slide 56

Slide 56 text

© 2019 NTT Communications ● レシピの書き方 ○ https://www.yoctoproject.org/docs/2.6/mega-manual/mega-manual.html#new-recipe-writing-a- new-recipe ○ https://www.slideshare.net/iwamatsu/ss-31662659 ● devtoolの使い方 ○ https://www.yoctoproject.org/docs/2.6/mega-manual/mega-manual.html#using-devtool-in-your- sdk-workflow ○ https://www.yoctoproject.org/docs/2.6/mega-manual/mega-manual.html#ref-devtool-reference ○ https://kumadasu.com/2017/05/14/devtool%E3%81%AE%E4%BD%BF%E3%81%84%E6%96 %B9-1%EF%BC%9A%E7%92%B0%E5%A2%83%E6%BA%96%E5%82%99%E3%81%A8% E3%83%AC%E3%82%B7%E3%83%94%E4%BD%9C%E6%88%90%E3%81%AE%E6%B5 %81%E3%82%8C/ Reference: devtool, recipe 56

Slide 57

Slide 57 text

© 2019 NTT Communications devtoolを用いたレシピ作成手順 1. レシピの雛形作成 2. レシピ編集 3. ビルド 4. テスト 5. 2. から 4.の繰り返し 6. layerへのレシピ追加 7. ビルドテスト 57

Slide 58

Slide 58 text

© 2019 NTT Communications 雛形作成 ● レシピの雛形作成 ○ devtool [options] [package name] [source url] ○ example: devtool add cowsay https://github.com/schacon/cowsay ● options ○ add : recipeの新規作成(.bb) ○ modify: 既存recipeの修正(.bbappend) ○ upgrade: recipeのバージョンUP 58

Slide 59

Slide 59 text

© 2019 NTT Communications devtool add 実行後の変化 59 build/workspace レイヤが増える

Slide 60

Slide 60 text

© 2019 NTT Communications workspaceディレクトリの中身 60 レシピ(.bb)ファイル のあるところ

Slide 61

Slide 61 text

© 2019 NTT Communications workspaceディレクトリの中身 61 ビルドに使うソース gitで管理されてる 編集内容はパッチにできる

Slide 62

Slide 62 text

© 2019 NTT Communications cowsay_git.bb 62

Slide 63

Slide 63 text

© 2019 NTT Communications cowsay_git.bb 63 Variables Tasks

Slide 64

Slide 64 text

© 2019 NTT Communications cowsay_git.bb 64 ライセンス指定 known licenseなら自動設定

Slide 65

Slide 65 text

© 2019 NTT Communications cowsay_git.bb 65 ソースコードの取得指定

Slide 66

Slide 66 text

© 2019 NTT Communications cowsay_git.bb 66 Yocto側のパッケージ バージョン指定

Slide 67

Slide 67 text

© 2019 NTT Communications cowsay_git.bb 67 ソースコードのリビジョン (gitのcommit id)

Slide 68

Slide 68 text

© 2019 NTT Communications cowsay_git.bb 68 ビルドする ソースコードの場所指定

Slide 69

Slide 69 text

© 2019 NTT Communications cowsay_git.bb 69 build taskたち makeでは以下に対応 ./configure make make install

Slide 70

Slide 70 text

© 2019 NTT Communications Tips: ビルド手順の指定(tasks) ● recipeはbuild tasks(do_***)を記述するもの ● 基本はdo_configure, do_compile, do_installの3つ ● known build system(make, cmake)は省略可(inherit) ○ ただし変更がある場合はtasksの記述が必要 ● 参考 ○ https://www.yoctoproject.org/docs/2.6/mega-manual/mega-manual.html# normal-recipe-build-tasks 70

Slide 71

Slide 71 text

© 2019 NTT Communications tasksの書き方 1. 通常のインストール手順を確認する 2. recipeのdo_***に記述 3. ビルド 4. デバッグ 71

Slide 72

Slide 72 text

© 2019 NTT Communications cowsay_git.bb diff 72 ● ./install.sh PREFIX_PATHでインストールできる ● インストール先は ${D}/${prefix}

Slide 73

Slide 73 text

© 2019 NTT Communications Tips: ${prefix}などの変数定義 ● ${D}の他にも変数がある ○ ${prefix} : /usr ○ ${bindir} : ${prefix}/bin ○ ${datadir} : ${prefix}/share ○ … ● 詳細な定義は以下を参照 ○ http://git.yoctoproject.org/cgit.cgi/poky/plain/meta/conf/bitbake.conf?h=bli nky 73

Slide 74

Slide 74 text

© 2019 NTT Communications ● とりあえずビルドしてみる ○ devtool build cowsay ビルド 74

Slide 75

Slide 75 text

© 2019 NTT Communications 75 Error

Slide 76

Slide 76 text

© 2019 NTT Communications エラー修正 ● logファイルを格納した場所の案内がある ● このファイルを参考に原因を探っていく 76

Slide 77

Slide 77 text

© 2019 NTT Communications Tips: build/.../[package]/[version]/temp 以下の話 ● [package]/[version]/[temp] 以下は各タスクの実行スクリプト とそのログがある ● エラー原因はここで調べる 77

Slide 78

Slide 78 text

© 2019 NTT Communications log.do_configure ● recipeにはパッケージに含めるファイル一覧記述が必要 ● FILESで設定する。設定内容と実態が異なるとエラー。 ○ https://www.yoctoproject.org/docs/2.6/mega-manual/mega-manual.html#var-FILES 78

Slide 79

Slide 79 text

© 2019 NTT Communications cowsay_git.bb 79 ● ${D}/usr/ 以下にインストールされたファイルたちを列挙 ● これでビルド成功

Slide 80

Slide 80 text

© 2019 NTT Communications ● パッケージを実際に動くか確かめてみる ● devtool deploy-target [package] [email protected] ○ runqemuで動かしたイメージにパッケージを転送するコマンド ○ runqemuで動かすイメージにSSH serverが必要 deploy 80

Slide 81

Slide 81 text

© 2019 NTT Communications Tips: imageへのSSHサーバー追加 ● conf/local.confに変更を加えて再ビルド ○ EXTRA_IMAGE_FEATURESにssh-server-opensshを追加 ○ 再ビルドコマンドは bitbake core-image-minimal 81

Slide 82

Slide 82 text

© 2019 NTT Communications deploy ● Terminal 1でqemuを起動 ○ runqemu nographic core-image-minimal # enter sudo password ● Terminal 2でパッケージを転送 ○ devtool deploy-target cowsay [email protected] -c ○ -c: no ssh-hostkey check 82

Slide 83

Slide 83 text

© 2019 NTT Communications Test cowsay on qemu 83

Slide 84

Slide 84 text

© 2019 NTT Communications debug 84 cowsayは入ってる

Slide 85

Slide 85 text

© 2019 NTT Communications debug 85 shebangがおかしい ビルドマシンのパスを見てる perlが欲しそう

Slide 86

Slide 86 text

© 2019 NTT Communications debug 86 Perl入ってない

Slide 87

Slide 87 text

© 2019 NTT Communications 解決すべき問題 ● 依存パッケージのperlを入れる ● recipeを修正してshebangを正す 87

Slide 88

Slide 88 text

© 2019 NTT Communications Fix runtime package dependency problems 88 ● 正しい手順 ○ 依存情報をレシピに記載する(RDEPENDS) ○ RDEPENDS_${PN} += "perl perl-modules" とレシピに書いておけばビルド時に勝手に依存関係が解決 ● 今回の手順 ○ devtoolはruntime依存パッケージインストールができない ■ 知らないだけ…? ○ local.confに書いて最初から入れる方法を取る

Slide 89

Slide 89 text

© 2019 NTT Communications Tips: DEPENDS と RDEPENDS ● DEPENDS ○ build time depend packageを追加する変数 ○ 参考 ■ https://www.yoctoproject.org/docs/2.6/mega-manual/mega-manual.html#var-DEPENDS ● RDEPENDS ○ runtime depend packageを追加する変数 ○ ここに書いたパッケージは依存で勝手にインストールされる ■ (はずなのだけど私の環境ではうまく動いてない時がある ) ○ RDEPENDS_${PN} += "perl perl-modules" を書いておく 89

Slide 90

Slide 90 text

© 2019 NTT Communications Add package to image 90 ● conf/local.conf に以下を追記 ○ CORE_IMAGE_EXTRA_INSTALL += "perl perl-modules" ● rebuild ○ bitbake core-image-minimal

Slide 91

Slide 91 text

© 2019 NTT Communications shebang修正 91 Installerがshebangを書き換え $usethisperlにはビルドシステム のperlのパスが入ってる

Slide 92

Slide 92 text

© 2019 NTT Communications shebang修正 ● workspace/sources/cow say/cowsay を修正 ○ envコマンドでperlを参照 ○ cowsのパスを固定 92

Slide 93

Slide 93 text

© 2019 NTT Communications Success! 93

Slide 94

Slide 94 text

© 2019 NTT Communications 残りの作業 ● デバッグ後はレシピをレイヤに登録する ● レイヤがないときは新規作成する 94

Slide 95

Slide 95 text

© 2019 NTT Communications Add new layer ● poky/build/meta-joke layerを作る ○ bitbake-layers create-layer "$BUILDDIR/meta-joke" ● poky/build/meta-joke layerをlayerとして追加する ○ bitbake-layers add-layer "$BUILDDIR/meta-joke" 95

Slide 96

Slide 96 text

© 2019 NTT Communications Layerへのレシピ登録 ● devtool finish cowsay meta-joke ○ devtoolで作ったrecipe(cowsay)をlayer(meta-joke)に登録する ● sourceを編集した場合 ○ workspace/sourceで変更点をgit commitする ○ untracked fileなどが残ってるとdevtool finishがエラーになる ○ in-source buildなコードはこのあたりで辛くなる ○ 絶対にout-of-source buildしよう!! 96

Slide 97

Slide 97 text

© 2019 NTT Communications Add package to image 97 ● CORE_IMAGE_EXTRA_INSTALLにパッケージを書く ● conf/local.conf に以下を追記 ○ CORE_IMAGE_EXTRA_INSTALL += "cowsay" ● rebuild ○ bitbake core-image-minimal

Slide 98

Slide 98 text

© 2019 NTT Communications Finish!! 98

Slide 99

Slide 99 text

© 2019 NTT Communications まとめ 99

Slide 100

Slide 100 text

© 2019 NTT Communications ● Yocto project makes that easy(:thinking_face:) to create custom linux image. まとめ 100

Slide 101

Slide 101 text

© 2019 NTT Communications Certificate You are master of Yocto because you finished this handson. Welcome to embedded world!! 101

Slide 102

Slide 102 text

© 2019 NTT Communications Yoctoの学び方 ● エラー内容でググる ● やりたいことの単語でググる ● 既存のレシピを読んで書き方を覚える ● ビルドシステムのコードを読んで理解する 102

Slide 103

Slide 103 text

© 2019 NTT Communications Appendix 103

Slide 104

Slide 104 text

© 2019 NTT Communications 1. Machine BSP Configのつくりかた 2. Installerのつかいかた Appendix 104

Slide 105

Slide 105 text

© 2019 NTT Communications Appendix 1. Machine BSP configの作り方 105

Slide 106

Slide 106 text

© 2019 NTT Communications ● ターゲットマシンを定義するconfig ○ local.confのMACHINE変数で選択してるやつ ● なぜ作るか ○ 既存のMACHINEで希望が満たせないときに作る ○ 例:Core iシリーズ以降でないと動かないプログラムを使いたい ● 書く場所 ○ meta-hoge/conf/machine/[machine-name].conf Machine BSP configとは 106

Slide 107

Slide 107 text

© 2019 NTT Communications おすすめの書き方 ● すでに書かれたconfigを参考に作る ○ meta-intel ○ https://git.yoctoproject.org/cgit.cgi/meta-intel/tree/conf/machine/intel-corei 7-64.conf?h=thud ● 107

Slide 108

Slide 108 text

© 2019 NTT Communications Machine BSP Configに書くこと ● 実機で動かす向けの設定 ○ DEFAULTTUNE ○ MACHINE_FEATURES ○ KERNEL_FEATURES ● qemu向けの設定(runqemu動かすのに必要) ○ virtioの追加 ○ QB_***変数の追加 108

Slide 109

Slide 109 text

© 2019 NTT Communications 実機で動かす向け設定 ● アーキテクチャやCPUを設定する ● 既存の.incファイルは以下にある ○ poky/meta/conf/machine/ ● 例: core-iシリーズ(nehalem)以降が欲しい時 ○ DEFAULTTUNE ?= "corei7-64" ○ require conf/machine/include/tune-corei7.inc ○ require conf/machine/include/genericx86-common.inc 109

Slide 110

Slide 110 text

© 2019 NTT Communications qemu向けの設定 ● runqemuを動かすための設定がいる ○ virtioドライバ追加 ○ kernel optionの追記 ○ その他 ● QB_***の設定を行っていく 110

Slide 111

Slide 111 text

© 2019 NTT Communications kamuee-corei7-64.conf 111

Slide 112

Slide 112 text

© 2019 NTT Communications kamuee-corei7-64.conf 112 qemuを依存に追加

Slide 113

Slide 113 text

© 2019 NTT Communications kamuee-corei7-64.conf 113 image class追加

Slide 114

Slide 114 text

© 2019 NTT Communications kamuee-corei7-64.conf 114 kamuee-corei7-64でつかうqemu バイナリの指定

Slide 115

Slide 115 text

© 2019 NTT Communications kamuee-corei7-64.conf 115 qemuとkvmで使うCPU設定

Slide 116

Slide 116 text

© 2019 NTT Communications kamuee-corei7-64.conf 116 その他qemuオプション追記

Slide 117

Slide 117 text

© 2019 NTT Communications kamuee-corei7-64.conf 117 メモリサイズ設定

Slide 118

Slide 118 text

© 2019 NTT Communications kamuee-corei7-64.conf 118 Kernel cmdline設定

Slide 119

Slide 119 text

© 2019 NTT Communications kamuee-corei7-64.conf 119 virtioモジュール追加 ※ストレージアクセスに必要 無いとKernelがrootfs検出に失敗 する

Slide 120

Slide 120 text

© 2019 NTT Communications Appendix 2. Installerの使い方 120

Slide 121

Slide 121 text

© 2019 NTT Communications ● Yoctoが標準で持ってるinstaller ● IMAGE_FSTYPEにISOを追加 するとgrubのエントリとして出てく る YoctoのInstaller 121

Slide 122

Slide 122 text

© 2019 NTT Communications Installerの実態 ● initrd-scriptsパッケージにある a. meta/recipes-core/initrdscripts ● インストールスクリプト a. meta/recipes-core/initrdscripts/files/init-install*.sh ● 起動の流れ a. grub b. linux kernel c. sysinit/systemd d. init-install*.sh 122

Slide 123

Slide 123 text

© 2019 NTT Communications init-install*.shの動作 ● インストール先ディスク選択 ● パーティション作成 ● fstab作成 ○ init-install*.sh内記述から生成。外部ファイルは参照しない ● grubインストール ● grubエントリ作成 ○ こちらもinit-install*.sh内記述から生成 123

Slide 124

Slide 124 text

© 2019 NTT Communications 注意点 ● fstabとgrubエントリはinit-install*.shから作られる ○ 他のレシピで設定した内容は無視される ○ インストール後のFS等を設定したいならinit-install*.shを設定する 124