Yocto 可以讓User自訂image以滿足特定需求, 這個章節就是在介紹如何自訂image.
最簡單的image.bb就是全部空白
images/machine-image-brook.bb
inherit image
IMAGE_FEATURES = ""
LICENSE = "MIT"
IMAGE_LINGUAS = ""
build結果
brook@vista:~/apps_proc/poky/build/tmp-glibc/work/oe-linux-gnueabi/machine-image-brook$ find 1.0-r0/rootfs/
1.0-r0/rootfs/
1.0-r0/rootfs/var
1.0-r0/rootfs/var/cache
1.0-r0/rootfs/var/cache/opkg
1.0-r0/rootfs/var/lib
1.0-r0/rootfs/var/lib/opkg
1.0-r0/rootfs/lib
1.0-r0/rootfs/lib/systemd
1.0-r0/rootfs/lib/systemd/system
1.0-r0/rootfs/lib/systemd/system/run-postinsts.service
1.0-r0/rootfs/etc
1.0-r0/rootfs/etc/timestamp
1.0-r0/rootfs/etc/version
1.0-r0/rootfs/etc/systemd
1.0-r0/rootfs/etc/systemd/system
1.0-r0/rootfs/etc/systemd/system/sysinit.target.wants
1.0-r0/rootfs/etc/systemd/system/sysinit.target.wants/run-postinsts.service
1.0-r0/rootfs/run
1.0-r0/rootfs/usr
1.0-r0/rootfs/usr/sbin
1.0-r0/rootfs/usr/sbin/run-postinsts
3.2.1. Customizing Images Using local.conf
最簡單的客製化image就是在local.conf中加入一個package, 雖然彈性有限, 但相對簡單. 比如在local.conf加入一行
IMAGE_INSTALL_append = " strace"
記住, strace前面有一個空白, 爾且是必須的. 此外, 善用+=運算符號可以增加可讀性.
images/machine-image-brook.bb
inherit image
IMAGE_FEATURES = ""
LICENSE = "MIT"
IMAGE_LINGUAS = ""
build結果
brook@vista:~/apps_proc/poky/build/tmp-glibc/work/oe-linux-gnueabi/machine-image-brook$ find 1.0-r0/rootfs/
1.0-r0/rootfs/
1.0-r0/rootfs/var
1.0-r0/rootfs/var/cache
1.0-r0/rootfs/var/cache/opkg
1.0-r0/rootfs/var/lib
1.0-r0/rootfs/var/lib/opkg
1.0-r0/rootfs/lib
1.0-r0/rootfs/lib/libnss_compat.so.2
1.0-r0/rootfs/lib/libresolv.so.2
1.0-r0/rootfs/lib/libresolv-2.28.so
1.0-r0/rootfs/lib/libnss_files.so.2
1.0-r0/rootfs/lib/libm.so.6
1.0-r0/rootfs/lib/libBrokenLocale-2.28.so
1.0-r0/rootfs/lib/libc-2.28.so
1.0-r0/rootfs/lib/libanl.so.1
1.0-r0/rootfs/lib/libutil.so.1
1.0-r0/rootfs/lib/libc.so.6
1.0-r0/rootfs/lib/libutil-2.28.so
1.0-r0/rootfs/lib/libnss_dns-2.28.so
1.0-r0/rootfs/lib/libnsl.so.1
1.0-r0/rootfs/lib/libdl-2.28.so
1.0-r0/rootfs/lib/libnss_compat-2.28.so
1.0-r0/rootfs/lib/ld-linux-armhf.so.3
1.0-r0/rootfs/lib/libnsl-2.28.so
1.0-r0/rootfs/lib/libpthread-2.28.so
1.0-r0/rootfs/lib/libnss_files-2.28.so
1.0-r0/rootfs/lib/libm-2.28.so
1.0-r0/rootfs/lib/libnss_dns.so.2
1.0-r0/rootfs/lib/librt-2.28.so
1.0-r0/rootfs/lib/libpthread.so.0
1.0-r0/rootfs/lib/libBrokenLocale.so.1
1.0-r0/rootfs/lib/libdl.so.2
1.0-r0/rootfs/lib/systemd
1.0-r0/rootfs/lib/systemd/system
1.0-r0/rootfs/lib/systemd/system/run-postinsts.service
1.0-r0/rootfs/lib/libanl-2.28.so
1.0-r0/rootfs/lib/ld-2.28.so
1.0-r0/rootfs/lib/librt.so.1
1.0-r0/rootfs/sbin
1.0-r0/rootfs/sbin/ldconfig
1.0-r0/rootfs/etc
1.0-r0/rootfs/etc/timestamp
1.0-r0/rootfs/etc/version
1.0-r0/rootfs/etc/ld.so.conf
1.0-r0/rootfs/etc/systemd
1.0-r0/rootfs/etc/systemd/system
1.0-r0/rootfs/etc/systemd/system/sysinit.target.wants
1.0-r0/rootfs/etc/systemd/system/sysinit.target.wants/run-postinsts.service
1.0-r0/rootfs/run
1.0-r0/rootfs/usr
1.0-r0/rootfs/usr/sbin
1.0-r0/rootfs/usr/sbin/run-postinsts
1.0-r0/rootfs/usr/bin
1.0-r0/rootfs/usr/bin/strace
1.0-r0/rootfs/usr/bin/strace-log-merge
3.2.2. Customizing Images Using Custom IMAGE_FEATURES and EXTRA_IMAGE_FEATURES
另一個方式是設定IMAGE_FEATURES與EXTRA_IMAGE_FEATURES, 這兩個功能相似, IMAGE_FEATURES是在recipe使用, 而EXTRA_IMAGE_FEATURES是在local.conf 使用. 可以參考meta/classes/core-image.bbclass了解更多細節
簡單來說, IMAGE_FEATURES 會被轉成是當的packages或configurations後加入IMAGE_INSTALL變數中. 而EXTRA_IMAGE_FEATURES變數會在bitbake.conf中, 將其加入IMAGE_FEATURES內.
EXTRA_IMAGE_FEATURES ??= ""
IMAGE_FEATURES += "${EXTRA_IMAGE_FEATURES}"
3.2.3. Customizing Images Using Custom .bb Files
你也可以透過recipe (.bb)自訂image內容,
images/machine-image-brook.bb
inherit image
IMAGE_INSTALL = "strace"
IMAGE_FEATURES = ""
LICENSE = "MIT"
IMAGE_LINGUAS = ""
build結果與3.2.1.結果相同
3.2.4. Customizing Images Using Custom Package Groups
複雜一點的image,可以透過創建package group recipe來客製化image, 比如在meta/recipes-core/packagegroups/創建packagegroup-image-brook.bb, 內容如下
SUMMARY = "Brook's sckagegroup"
PR = "r0"
inherit packagegroup
PACKAGES = "\
${PN}-apps \
${PN}-tools \
"
RDEPENDS_${PN}-apps = "\
strace \
"
RDEPENDS_${PN}-tools = "\
busybox \
"
RRECOMMENDS_${PN}-tools = "\
openssl \
"
加完之後, 可以使用bitbake確認是否可用
jenkins@vista:~/apps_proc/poky/build$ bitbake -s|grep brook
packagegroup-image-brook :1.0-r0
接著就可以在images/machine-image-brook.bb中使用這packagegroup
inherit image
IMAGE_INSTALL = "packagegroup-image-brook-tools"
IMAGE_FEATURES = ""
LICENSE = "MIT"
IMAGE_LINGUAS = ""
結果就是會安裝busybox, 當然你也可以安裝"packagegroup-image-brook-apps".
參考資料:
- https://www.yoctoproject.org/docs/3.1/dev-manual/dev-manual.html, The Yocto Project Development Tasks Manual