SlideShare una empresa de Scribd logo
1 de 17
wata2ki
 名前: wata2ki (watatuki)
◦ 元はハードウェアで画像処理をやっていましたが、現在は組
み込み屋をやっています
◦ 最近はJetson-TK1/TX1向けのアンオフィシャルYocto BSP
を作り、そのうえでディスクトップ環境や別ボード向けのディス
トロを動かして遊んでいます
◦ GitHub
 https://github.com/watatuki
 今日は、Jetson-TK1のOSSベースのBSPを作った時
のやりかたを説明します
 L.F.(Linux Foundation)のプロジェクトで、正式名称は
Yocto Project
◦ https://www.yoctoproject.org/
 Linuxのディストリビューションを作るのに必要なツー
ル・データを提供
◦ 最終的にはpokyという名前のリファレンスディストロとして提
供される
◦ OpenEmbedded(http://www.openembedded.org/)コミュニティ
由来のプロジェクトで、ツールも共同開発している
 GentooLinuxがクロスビルドになったようなもの
 bitbake
◦ Yoctoの根幹となるツールで、クロスビルド環境を提供してくれる
◦ ディストリビューションの構成するソフトのコンフィグやバージョンを
Recipeで管理する
 oe-core
◦ bitbakeで使うレシピのセットで、glibc, x.org, waylandからQtまで、様々
なOSSを標準でビルドできるようにしてくれる
◦ クロスビルド用のgccもoe-coreが提供してくれる
 リファレンスBSP
◦ pokyが標準でサポートしているボード向けのBSP
 Qemu, x86, x86-64, beagleboneなど
 LinuxのカーネルやU-boot, OpenGL(mesa)をそのボード向けの設定でビル
ドできるようにするレシピの形で提供される
 リファレンスBSPに関しては、少なくともビルドが通ることが確認されている
(はず。。。)
 Yoctoでは、自分の作りたいディストロをlayerを組み合
わせて構築する
自分の作りたいディストロ
meta (oe-core layer)
meta-yocto (yocto layer)
meta-jetson (BSP layer)
meta-mydistro (my layer)
標準Layer
meta-windowmng (layer)
BSP Layer
ターゲットボード用のカーネルや、ファーム
ウェア等
さらに追加したいコンポーネントが入っ
たLayerを積み上げる
今回はここの話
 Jetson-TK1でwayland環境を構築したい
◦ コンポーネントを一つ一つビルド・インストールして動かす環
境をNVIDIAが提供しているが、継続的に使えるようYoctoに
組み込みたい
 Kernelは、Upstream Kernel
 L4Tではなくnouveau/mesaベース
 L4TはX.orgのみでwaylandをサポートしていない
 使えるものは極力Yoctoのリリースに含まれるものを使う
 Jetson-TK1(最近はTX1も)向けのwayland環境を
NVIDIAがgithubで公開している
◦ https://github.com/NVIDIA/tegra-nouveau-rootfs
◦ Ubuntu14.04(ARM)のrootfsにパッチをあてたカーネル、nouveauや
mesaをビルド・インストールするスクリプトのセット
◦ westonのディスクトップシェルが動作するrootfsを作ってくれる
 ビルドが通れば…
これをベースにBSPを作成
 Yocto/OEのLayerは決まったファイルを置くだけ
◦ レイヤのスケルトンはyocto-layer create を使って作成
 Layerの設定が書かれたlayer.confを自動作成してくれる
 今回は、サンプルレシピの作成は行わない
◦ Layerディレクトリ名前はmeta-jetson
$ yocto-layer create jetson
Please enter the layer priority you'd like to use for the layer: [default: 6] 6
Would you like to have an example recipe created? (y/n) [default: n] n
Would you like to have an example bbappend file created? (y/n) [default: n] n
New layer created in meta-jetson.
Don't forget to add it to your BBLAYERS (for details see meta-jetsonREADME).
meta-jetson
├── COPYING.MIT
├── README
└── conf
└── layer.conf
 BSPを作る場合はmachine設定を新規に作成
◦ ARM/x86といったアーキテクチャの設定、最適化設定などを記載する
meta-jetson
├── README.md
└── conf
├── layer.conf
└── machine
└── jetson-tk1-upstream.conf
require conf/machine/include/tune-cortexa15.inc
DEFAULTTUNE = "cortexa15hf-neon"
PREFERRED_PROVIDER_virtual/xserver ?= "xserver-xorg"
PREFERRED_PROVIDER_virtual/kernel ?= "linux-upstream"
PREFERRED_PROVIDER_virtual/mesa ?= "mesa"
PREFERRED_PROVIDER_virtual/libgl ?= "mesa"
SERIAL_CONSOLE = "115200 ttyS0"
KERNEL_IMAGETYPE = "zImage"
MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += " 
bootconfig 
kernel-image 
kernel-devicetree 
linux-firmware-nvidia 
linux-firmware-rtl8168g 
kernel-modules 
libdrm-tegra 
libdrm-kms 
mesa-megadriver 
"
IMAGE_FSTYPES = "tar.bz2"
アーキテクチャ設定と、コンパイラの最適化オプション設定
TegraK1はCortex-A15なので、A15を設定
Kernelレシピを指定
Yoctoで用意されているカーネルは古いので、最新のカーネルを
使えるように独自のレシピを使うように設定
このmachine設定を選択した場合に強制的にインストールする
パッケージを指定
bootconfig : jetson-tk1でu-boot起動する設定ファイル
kernel-image : /boot にカーネル
kernel-devicetree : /boot にdtb
kernel-firmware-* : ファームウェア
kernel-modules : カーネルモジュール(nouveu等)
libdrm-* : libdrmのtegra用パッケージ
mesa-megadriver : mesaのドライバパッケージ(nouveau)
 ベースは別のカーネルレシピを流用
◦ TIのBSPから流用したファイルをベースに作成
 defconfigは、arch/arm/configsの下のファイル名を指定する
 カスタムコンフィグにしたい場合は、別途bbappendレシピを使って上書きすると、ディスト
ロごとにBSPレイヤを作り直さなくて済む
 Patchは必須ではないが、jetsonの場合はDTBでGPUを有効化したいので、そのため
のpatchを追加
◦ ベースのlinux-firmwareにnvidiaのファームウェアのパッケージがなかったので、
新規作成
 中の構成が頻繁にかわるためappendではなくカスタムレシピを作成。
 今回はnvidiaゆえに必要だっただけで、通常は作成しなくてよい
meta-jetson
├── README.md
├── conf
└── recipes-kernel
├── linux
├── linux-upstream
│ │ ├── defconfig
│ │ └── linux4.3_tegrak1_gpu_hdmi.patch
│ ├── linux-dtb.inc
│ ├── linux-upstream_4.7.bb
│ └── setup-defconfig.inc
└── linux-firmware
└── linux-firmware_git.bb
TIのレシピの流用品
パッチファイル(GPU有効化)
GPUとEtherファームのために作成したファームウェアレシピ
 カーネルレシピはほぼ定型文
◦ メンテ時は以下の個所しか変更していません
SECTION = "kernel"
DESCRIPTION = "Upstream Linux Kernel recipe."
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=d7810fab7487fb0aad327b76f1be7cd7"
KERNEL_IMAGETYPE = "zImage"
inherit kernel
require recipes-kernel/linux/linux-dtb.inc
require recipes-kernel/linux/setup-defconfig.inc
DEFAULT_PREFERENCE = "-1"
S = "${WORKDIR}/linux-4.5.2"
PR = "r2"
SRC_URI = "https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.5.2.tar.xz 
file://linux4.3_tegrak1_gpu_hdmi.patch 
file://defconfig"
SRC_URI[md5sum] = "eae8f700463ea73185027caece5f1c5d"
SRC_URI[sha256sum] =
"e32339db8365f0f10b873928095da47dd3e8a40f8ea5edd5501320d4ff30209f"
KERNEL_DEVICETREE = "tegra124-jetson-tk1.dtb"
カーネルのソースを指定
gitにするとcloneがとんでもなく遅いので、tar.xzを使うようにしてい
るが、gitでとってくることも可能
カスタムカーネルを使用したい場合は、自宅のgitを指すようにする
Gitの場合は、
SRC_URI = “git://192.168.1.1/linux-omap.git;protocol=git”
SRCREV = "02a84e66b30a9c9e1c00112892f0226a71098753“
というように、SRC_URIを書いて、md5/shaハッシュではなくリビジョ
ンを指定する
カーネルレシピでは、解凍先のディレクトリを指定しないといけない
必要なdtbを指定。
SUMMARY = "libdrm Tegra K1 append recipe"
EXTRA_OECONF += " --enable-tegra-experimental-api 
"
PACKAGES =+ " ${PN}-tegra "
RRECOMMENDS_${PN}-drivers += " ${PN}-tegra "
FILES_${PN}-tegra = "${libdir}/libdrm_tegra.so.*"
 libdrmが必要だが、デフォルトのレシピではTegra用のビルドがされない
◦ libdrmのメインラインにTegraK1の対応が取り込まれているので、configureの設定を変更
してビルドされるようにする
◦ そのままではrpm(ipk/deb)パッケージが作られないので、その設定も追加する
meta-jetson
├── README.md
├── conf
├── recipes-graphics
│ ├── drm
│ │ └── libdrm_%.bbappend
│ ├── mesa
│ │ ├── mesa.inc
│ │ ├── mesa_11.0.9.bb
│ │ └── mesa_11.0.9.bbappend
│ └── wayland
│ ├── weston
│ └── weston_1.9.0.bbappend
└── recipes-kernel
EXTRA_OECONFにtegra用のconfigure
オプションを追加
bbappendレシピを作成
libdrm_tegraのパッケージを作るための記述
SUMMARY = "mesa nouveau append recipe"
PACKAGECONFIG_append = " gallium "
DIR3_FEATURES = "dri3proto presentproto "
DIR3_FEATURES += " ${@bb.utils.contains('DISTRO_FEATURES', 'x11',
'libxshmfence', '', d)} "
PACKAGECONFIG[dri3] = "--enable-dri3, --disable-dri3, ${DIR3_FEATURES} "
GALLIUMDRIVERS = "nouveau"
DRIDRIVERS_append = ",nouveau"
 mesaもlibdrmと同様にnouveauを有効化しないといけない
◦ Mesaはnouveauの不具合対応が頻繁に行われるため、bbレシピも追加
 実際は、コピーしてきてバージョンをかえただけ
 バージョンを変えただけだとビルドが通らない場合があるので、その時は内容も修正
◦ Tegra対応は分離したいので、nouveauを有効化する部分のみbbappendに切り出し
meta-jetson
├── README.md
├── conf
├── recipes-graphics
│ ├── drm
│ │ └── libdrm_%.bbappend
│ ├── mesa
│ │ ├── mesa.inc
│ │ ├── mesa_11.0.9.bb
│ │ └── mesa_11.0.9.bbappend
│ └── wayland
│ ├── weston
│ └── weston_1.9.0.bbappend
└── recipes-kernel
Mesaのベースレシピとbbappendレシピを追加
bbappendの内容は、nouveauを有効化するための記述のみ
galliumの有効化記述もあるが、nouveauを使うために連鎖的に有
効化が必要になっただけ
FILESEXTRAPATHS_prepend := "${THISDIR}/weston:"
SRC_URI += "file://0001-compositor-drm-Add-new-gbm-struct-to-allow-for-a-sep.patch 
file://0002-compositor-drm-Add-support-for-Tegra-Jetson-TK1.patch 
file://0003-Add-glFinish-to-DRM-backend-to-avoid-tearing.patch 
"
 nvidiaのwestonは、westonにパッチをあてているため、Yoctoのレシピで同じ
ようにパッチをあてる
◦ libdrm-tegraのためのパッチなので、nvidia以外では必要ないことも
◦ このパッチがwestonのバージョン依存で当たらなくなるため、ポーティングが結構
めんどくさい
meta-jetson
├── README.md
├── conf
├── recipes-graphics
│ ├── drm
│ │ └── libdrm_%.bbappend
│ ├── mesa
│ │ ├── mesa.inc
│ │ ├── mesa_11.0.9.bb
│ │ └── mesa_11.0.9.bbappend
│ └── wayland
│ ├── weston
│ └── weston_1.9.0.bbappend
└── recipes-kernel
Mesaのベースレシピとbbappendレシピを追加
bbappendの内容は、パッチディレクトリの指定と、パッチあての指
定のみ
#MACHINE ?= "beaglebone"
#MACHINE ?= "genericx86"
#MACHINE ?= "genericx86-64"
#MACHINE ?= "mpc8315e-rdb"
#MACHINE ?= "edgerouter"
#
# This sets the default machine to be qemux86 if no other
machine is selected:
MACHINE ??= "jetson-tk1-upstream“
 作ったBSPレイヤの使い方は簡単
◦ bblayers.confに作ったbspレイヤを参照する設定を追加
◦ local.confのMACHINE設定をstep2で作ったbspのconfファイルの名
前にする
meta-jetson
├── README.md
└── conf
├── layer.conf
└── machine
└── jetson-tk1-upstream.conf
あとはいつものようにbuildするだけ!!
 Yocto用のbspレイヤを作ってみた
◦ 今回はリファレンスボード用のbspを作成した
◦ 実際にこの実例が生きるのは、カスタムボード用のbspを作る場合
 想定ユースケース
 カスタムボード用に移植したカーネルを組み込みたい
 専用のファームウェアを組み込みたい
◦ 今回の実例はこちら参照
 https://github.com/watatuki/meta-jetson
 今回は省略しましたが、/bootの下にブートローダのコンフィグを組み込む
ようなレシピも実例にはあります
中華パッド用のカスタムbspとかいかがでしょうか?

Más contenido relacionado

La actualidad más candente

実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjugYahoo!デベロッパーネットワーク
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと信之 岩永
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48Preferred Networks
 
5分で分かるgitのrefspec
5分で分かるgitのrefspec5分で分かるgitのrefspec
5分で分かるgitのrefspecikdysfm
 
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~モノビット エンジン
 
Multibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだことMultibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだことRecruit Lifestyle Co., Ltd.
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
Yoctoで綺麗なkernel configを作る
Yoctoで綺麗なkernel configを作るYoctoで綺麗なkernel configを作る
Yoctoで綺麗なkernel configを作るshimadah
 
Linux-HA Japanプロジェクトのこれまでとこれから
Linux-HA JapanプロジェクトのこれまでとこれからLinux-HA Japanプロジェクトのこれまでとこれから
Linux-HA Japanプロジェクトのこれまでとこれからksk_ha
 
Docker volume基礎/Project Longhorn紹介
Docker volume基礎/Project Longhorn紹介Docker volume基礎/Project Longhorn紹介
Docker volume基礎/Project Longhorn紹介Masahito Zembutsu
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Masahito Zembutsu
 
GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -zgock
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
 

La actualidad más candente (20)

実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
 
5分で分かるgitのrefspec
5分で分かるgitのrefspec5分で分かるgitのrefspec
5分で分かるgitのrefspec
 
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
 
Multibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだことMultibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだこと
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
Yoctoで綺麗なkernel configを作る
Yoctoで綺麗なkernel configを作るYoctoで綺麗なkernel configを作る
Yoctoで綺麗なkernel configを作る
 
Linux-HA Japanプロジェクトのこれまでとこれから
Linux-HA JapanプロジェクトのこれまでとこれからLinux-HA Japanプロジェクトのこれまでとこれから
Linux-HA Japanプロジェクトのこれまでとこれから
 
initramfsについて
initramfsについてinitramfsについて
initramfsについて
 
Docker volume基礎/Project Longhorn紹介
Docker volume基礎/Project Longhorn紹介Docker volume基礎/Project Longhorn紹介
Docker volume基礎/Project Longhorn紹介
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 

Similar a Yocto bspを作ってみた

Osc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 jOsc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 jAkira Yoshiyama
 
GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境Kazuhiro Nishiyama
 
第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西Masahide Yamamoto
 
Linuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書くLinuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書くTetsuyuki Kobayashi
 
qemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみたqemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみたKazuhiro Nishiyama
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presenKouhei Maeda
 
Using Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineUsing Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineEtsuji Nakai
 
ラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよnpsg
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
Firefox OS + Raspberry Pi
Firefox OS + Raspberry PiFirefox OS + Raspberry Pi
Firefox OS + Raspberry PiEnsekiTT
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックEmma Haruka Iwao
 
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
 
dodaiのProvisioning周辺探訪 - dodai勉強会 #4
dodaiのProvisioning周辺探訪 - dodai勉強会 #4dodaiのProvisioning周辺探訪 - dodai勉強会 #4
dodaiのProvisioning周辺探訪 - dodai勉強会 #4Satoshi Yazawa
 

Similar a Yocto bspを作ってみた (20)

Osc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 jOsc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 j
 
Yesod on Heroku
Yesod on HerokuYesod on Heroku
Yesod on Heroku
 
GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境
 
第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西
 
Linuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書くLinuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書く
 
qemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみたqemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみた
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presen
 
Capistrano
CapistranoCapistrano
Capistrano
 
Using Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineUsing Kubernetes on Google Container Engine
Using Kubernetes on Google Container Engine
 
ラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよ
 
Git (実践入門編)
Git (実践入門編)Git (実践入門編)
Git (実践入門編)
 
20170124 linux basic_1
20170124 linux basic_120170124 linux basic_1
20170124 linux basic_1
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
Firefox OS + Raspberry Pi
Firefox OS + Raspberry PiFirefox OS + Raspberry Pi
Firefox OS + Raspberry Pi
 
Pdp11 on-fpga
Pdp11 on-fpgaPdp11 on-fpga
Pdp11 on-fpga
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニック
 
Mincs 日本語版
Mincs 日本語版Mincs 日本語版
Mincs 日本語版
 
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
 
dodaiのProvisioning周辺探訪 - dodai勉強会 #4
dodaiのProvisioning周辺探訪 - dodai勉強会 #4dodaiのProvisioning周辺探訪 - dodai勉強会 #4
dodaiのProvisioning周辺探訪 - dodai勉強会 #4
 

Más de wata2ki

鹿児島らぐハイブリッド開催への道
鹿児島らぐハイブリッド開催への道鹿児島らぐハイブリッド開催への道
鹿児島らぐハイブリッド開催への道wata2ki
 
Linuxの2038年問題を調べてみた
Linuxの2038年問題を調べてみたLinuxの2038年問題を調べてみた
Linuxの2038年問題を調べてみたwata2ki
 
YoctoLTSについて調べてみた
YoctoLTSについて調べてみたYoctoLTSについて調べてみた
YoctoLTSについて調べてみたwata2ki
 
しょしんしゃのためのhello world
しょしんしゃのためのhello worldしょしんしゃのためのhello world
しょしんしゃのためのhello worldwata2ki
 
Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る wata2ki
 
ARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいwata2ki
 
Fireduck
FireduckFireduck
Fireduckwata2ki
 
パッチを投稿してみた話
パッチを投稿してみた話パッチを投稿してみた話
パッチを投稿してみた話wata2ki
 
Linux kernelのbspとupstream
Linux kernelのbspとupstreamLinux kernelのbspとupstream
Linux kernelのbspとupstreamwata2ki
 

Más de wata2ki (9)

鹿児島らぐハイブリッド開催への道
鹿児島らぐハイブリッド開催への道鹿児島らぐハイブリッド開催への道
鹿児島らぐハイブリッド開催への道
 
Linuxの2038年問題を調べてみた
Linuxの2038年問題を調べてみたLinuxの2038年問題を調べてみた
Linuxの2038年問題を調べてみた
 
YoctoLTSについて調べてみた
YoctoLTSについて調べてみたYoctoLTSについて調べてみた
YoctoLTSについて調べてみた
 
しょしんしゃのためのhello world
しょしんしゃのためのhello worldしょしんしゃのためのhello world
しょしんしゃのためのhello world
 
Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る 
 
ARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくい
 
Fireduck
FireduckFireduck
Fireduck
 
パッチを投稿してみた話
パッチを投稿してみた話パッチを投稿してみた話
パッチを投稿してみた話
 
Linux kernelのbspとupstream
Linux kernelのbspとupstreamLinux kernelのbspとupstream
Linux kernelのbspとupstream
 

Yocto bspを作ってみた

  • 2.  名前: wata2ki (watatuki) ◦ 元はハードウェアで画像処理をやっていましたが、現在は組 み込み屋をやっています ◦ 最近はJetson-TK1/TX1向けのアンオフィシャルYocto BSP を作り、そのうえでディスクトップ環境や別ボード向けのディス トロを動かして遊んでいます ◦ GitHub  https://github.com/watatuki
  • 4.  L.F.(Linux Foundation)のプロジェクトで、正式名称は Yocto Project ◦ https://www.yoctoproject.org/  Linuxのディストリビューションを作るのに必要なツー ル・データを提供 ◦ 最終的にはpokyという名前のリファレンスディストロとして提 供される ◦ OpenEmbedded(http://www.openembedded.org/)コミュニティ 由来のプロジェクトで、ツールも共同開発している  GentooLinuxがクロスビルドになったようなもの
  • 5.  bitbake ◦ Yoctoの根幹となるツールで、クロスビルド環境を提供してくれる ◦ ディストリビューションの構成するソフトのコンフィグやバージョンを Recipeで管理する  oe-core ◦ bitbakeで使うレシピのセットで、glibc, x.org, waylandからQtまで、様々 なOSSを標準でビルドできるようにしてくれる ◦ クロスビルド用のgccもoe-coreが提供してくれる  リファレンスBSP ◦ pokyが標準でサポートしているボード向けのBSP  Qemu, x86, x86-64, beagleboneなど  LinuxのカーネルやU-boot, OpenGL(mesa)をそのボード向けの設定でビル ドできるようにするレシピの形で提供される  リファレンスBSPに関しては、少なくともビルドが通ることが確認されている (はず。。。)
  • 6.  Yoctoでは、自分の作りたいディストロをlayerを組み合 わせて構築する 自分の作りたいディストロ meta (oe-core layer) meta-yocto (yocto layer) meta-jetson (BSP layer) meta-mydistro (my layer) 標準Layer meta-windowmng (layer) BSP Layer ターゲットボード用のカーネルや、ファーム ウェア等 さらに追加したいコンポーネントが入っ たLayerを積み上げる 今回はここの話
  • 7.  Jetson-TK1でwayland環境を構築したい ◦ コンポーネントを一つ一つビルド・インストールして動かす環 境をNVIDIAが提供しているが、継続的に使えるようYoctoに 組み込みたい  Kernelは、Upstream Kernel  L4Tではなくnouveau/mesaベース  L4TはX.orgのみでwaylandをサポートしていない  使えるものは極力Yoctoのリリースに含まれるものを使う
  • 8.  Jetson-TK1(最近はTX1も)向けのwayland環境を NVIDIAがgithubで公開している ◦ https://github.com/NVIDIA/tegra-nouveau-rootfs ◦ Ubuntu14.04(ARM)のrootfsにパッチをあてたカーネル、nouveauや mesaをビルド・インストールするスクリプトのセット ◦ westonのディスクトップシェルが動作するrootfsを作ってくれる  ビルドが通れば… これをベースにBSPを作成
  • 9.  Yocto/OEのLayerは決まったファイルを置くだけ ◦ レイヤのスケルトンはyocto-layer create を使って作成  Layerの設定が書かれたlayer.confを自動作成してくれる  今回は、サンプルレシピの作成は行わない ◦ Layerディレクトリ名前はmeta-jetson $ yocto-layer create jetson Please enter the layer priority you'd like to use for the layer: [default: 6] 6 Would you like to have an example recipe created? (y/n) [default: n] n Would you like to have an example bbappend file created? (y/n) [default: n] n New layer created in meta-jetson. Don't forget to add it to your BBLAYERS (for details see meta-jetsonREADME). meta-jetson ├── COPYING.MIT ├── README └── conf └── layer.conf
  • 10.  BSPを作る場合はmachine設定を新規に作成 ◦ ARM/x86といったアーキテクチャの設定、最適化設定などを記載する meta-jetson ├── README.md └── conf ├── layer.conf └── machine └── jetson-tk1-upstream.conf require conf/machine/include/tune-cortexa15.inc DEFAULTTUNE = "cortexa15hf-neon" PREFERRED_PROVIDER_virtual/xserver ?= "xserver-xorg" PREFERRED_PROVIDER_virtual/kernel ?= "linux-upstream" PREFERRED_PROVIDER_virtual/mesa ?= "mesa" PREFERRED_PROVIDER_virtual/libgl ?= "mesa" SERIAL_CONSOLE = "115200 ttyS0" KERNEL_IMAGETYPE = "zImage" MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += " bootconfig kernel-image kernel-devicetree linux-firmware-nvidia linux-firmware-rtl8168g kernel-modules libdrm-tegra libdrm-kms mesa-megadriver " IMAGE_FSTYPES = "tar.bz2" アーキテクチャ設定と、コンパイラの最適化オプション設定 TegraK1はCortex-A15なので、A15を設定 Kernelレシピを指定 Yoctoで用意されているカーネルは古いので、最新のカーネルを 使えるように独自のレシピを使うように設定 このmachine設定を選択した場合に強制的にインストールする パッケージを指定 bootconfig : jetson-tk1でu-boot起動する設定ファイル kernel-image : /boot にカーネル kernel-devicetree : /boot にdtb kernel-firmware-* : ファームウェア kernel-modules : カーネルモジュール(nouveu等) libdrm-* : libdrmのtegra用パッケージ mesa-megadriver : mesaのドライバパッケージ(nouveau)
  • 11.  ベースは別のカーネルレシピを流用 ◦ TIのBSPから流用したファイルをベースに作成  defconfigは、arch/arm/configsの下のファイル名を指定する  カスタムコンフィグにしたい場合は、別途bbappendレシピを使って上書きすると、ディスト ロごとにBSPレイヤを作り直さなくて済む  Patchは必須ではないが、jetsonの場合はDTBでGPUを有効化したいので、そのため のpatchを追加 ◦ ベースのlinux-firmwareにnvidiaのファームウェアのパッケージがなかったので、 新規作成  中の構成が頻繁にかわるためappendではなくカスタムレシピを作成。  今回はnvidiaゆえに必要だっただけで、通常は作成しなくてよい meta-jetson ├── README.md ├── conf └── recipes-kernel ├── linux ├── linux-upstream │ │ ├── defconfig │ │ └── linux4.3_tegrak1_gpu_hdmi.patch │ ├── linux-dtb.inc │ ├── linux-upstream_4.7.bb │ └── setup-defconfig.inc └── linux-firmware └── linux-firmware_git.bb TIのレシピの流用品 パッチファイル(GPU有効化) GPUとEtherファームのために作成したファームウェアレシピ
  • 12.  カーネルレシピはほぼ定型文 ◦ メンテ時は以下の個所しか変更していません SECTION = "kernel" DESCRIPTION = "Upstream Linux Kernel recipe." LICENSE = "GPLv2" LIC_FILES_CHKSUM = "file://COPYING;md5=d7810fab7487fb0aad327b76f1be7cd7" KERNEL_IMAGETYPE = "zImage" inherit kernel require recipes-kernel/linux/linux-dtb.inc require recipes-kernel/linux/setup-defconfig.inc DEFAULT_PREFERENCE = "-1" S = "${WORKDIR}/linux-4.5.2" PR = "r2" SRC_URI = "https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.5.2.tar.xz file://linux4.3_tegrak1_gpu_hdmi.patch file://defconfig" SRC_URI[md5sum] = "eae8f700463ea73185027caece5f1c5d" SRC_URI[sha256sum] = "e32339db8365f0f10b873928095da47dd3e8a40f8ea5edd5501320d4ff30209f" KERNEL_DEVICETREE = "tegra124-jetson-tk1.dtb" カーネルのソースを指定 gitにするとcloneがとんでもなく遅いので、tar.xzを使うようにしてい るが、gitでとってくることも可能 カスタムカーネルを使用したい場合は、自宅のgitを指すようにする Gitの場合は、 SRC_URI = “git://192.168.1.1/linux-omap.git;protocol=git” SRCREV = "02a84e66b30a9c9e1c00112892f0226a71098753“ というように、SRC_URIを書いて、md5/shaハッシュではなくリビジョ ンを指定する カーネルレシピでは、解凍先のディレクトリを指定しないといけない 必要なdtbを指定。
  • 13. SUMMARY = "libdrm Tegra K1 append recipe" EXTRA_OECONF += " --enable-tegra-experimental-api " PACKAGES =+ " ${PN}-tegra " RRECOMMENDS_${PN}-drivers += " ${PN}-tegra " FILES_${PN}-tegra = "${libdir}/libdrm_tegra.so.*"  libdrmが必要だが、デフォルトのレシピではTegra用のビルドがされない ◦ libdrmのメインラインにTegraK1の対応が取り込まれているので、configureの設定を変更 してビルドされるようにする ◦ そのままではrpm(ipk/deb)パッケージが作られないので、その設定も追加する meta-jetson ├── README.md ├── conf ├── recipes-graphics │ ├── drm │ │ └── libdrm_%.bbappend │ ├── mesa │ │ ├── mesa.inc │ │ ├── mesa_11.0.9.bb │ │ └── mesa_11.0.9.bbappend │ └── wayland │ ├── weston │ └── weston_1.9.0.bbappend └── recipes-kernel EXTRA_OECONFにtegra用のconfigure オプションを追加 bbappendレシピを作成 libdrm_tegraのパッケージを作るための記述
  • 14. SUMMARY = "mesa nouveau append recipe" PACKAGECONFIG_append = " gallium " DIR3_FEATURES = "dri3proto presentproto " DIR3_FEATURES += " ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'libxshmfence', '', d)} " PACKAGECONFIG[dri3] = "--enable-dri3, --disable-dri3, ${DIR3_FEATURES} " GALLIUMDRIVERS = "nouveau" DRIDRIVERS_append = ",nouveau"  mesaもlibdrmと同様にnouveauを有効化しないといけない ◦ Mesaはnouveauの不具合対応が頻繁に行われるため、bbレシピも追加  実際は、コピーしてきてバージョンをかえただけ  バージョンを変えただけだとビルドが通らない場合があるので、その時は内容も修正 ◦ Tegra対応は分離したいので、nouveauを有効化する部分のみbbappendに切り出し meta-jetson ├── README.md ├── conf ├── recipes-graphics │ ├── drm │ │ └── libdrm_%.bbappend │ ├── mesa │ │ ├── mesa.inc │ │ ├── mesa_11.0.9.bb │ │ └── mesa_11.0.9.bbappend │ └── wayland │ ├── weston │ └── weston_1.9.0.bbappend └── recipes-kernel Mesaのベースレシピとbbappendレシピを追加 bbappendの内容は、nouveauを有効化するための記述のみ galliumの有効化記述もあるが、nouveauを使うために連鎖的に有 効化が必要になっただけ
  • 15. FILESEXTRAPATHS_prepend := "${THISDIR}/weston:" SRC_URI += "file://0001-compositor-drm-Add-new-gbm-struct-to-allow-for-a-sep.patch file://0002-compositor-drm-Add-support-for-Tegra-Jetson-TK1.patch file://0003-Add-glFinish-to-DRM-backend-to-avoid-tearing.patch "  nvidiaのwestonは、westonにパッチをあてているため、Yoctoのレシピで同じ ようにパッチをあてる ◦ libdrm-tegraのためのパッチなので、nvidia以外では必要ないことも ◦ このパッチがwestonのバージョン依存で当たらなくなるため、ポーティングが結構 めんどくさい meta-jetson ├── README.md ├── conf ├── recipes-graphics │ ├── drm │ │ └── libdrm_%.bbappend │ ├── mesa │ │ ├── mesa.inc │ │ ├── mesa_11.0.9.bb │ │ └── mesa_11.0.9.bbappend │ └── wayland │ ├── weston │ └── weston_1.9.0.bbappend └── recipes-kernel Mesaのベースレシピとbbappendレシピを追加 bbappendの内容は、パッチディレクトリの指定と、パッチあての指 定のみ
  • 16. #MACHINE ?= "beaglebone" #MACHINE ?= "genericx86" #MACHINE ?= "genericx86-64" #MACHINE ?= "mpc8315e-rdb" #MACHINE ?= "edgerouter" # # This sets the default machine to be qemux86 if no other machine is selected: MACHINE ??= "jetson-tk1-upstream“  作ったBSPレイヤの使い方は簡単 ◦ bblayers.confに作ったbspレイヤを参照する設定を追加 ◦ local.confのMACHINE設定をstep2で作ったbspのconfファイルの名 前にする meta-jetson ├── README.md └── conf ├── layer.conf └── machine └── jetson-tk1-upstream.conf あとはいつものようにbuildするだけ!!
  • 17.  Yocto用のbspレイヤを作ってみた ◦ 今回はリファレンスボード用のbspを作成した ◦ 実際にこの実例が生きるのは、カスタムボード用のbspを作る場合  想定ユースケース  カスタムボード用に移植したカーネルを組み込みたい  専用のファームウェアを組み込みたい ◦ 今回の実例はこちら参照  https://github.com/watatuki/meta-jetson  今回は省略しましたが、/bootの下にブートローダのコンフィグを組み込む ようなレシピも実例にはあります 中華パッド用のカスタムbspとかいかがでしょうか?