Search code examples
yoctoopenembedded

YOCTO - Build partial image for application


I want to create a small application image. That image installed at a separate partition shall be mounted to /usr/local. I created a recipe like this:

inherit image
IMAGE_BASENAME = "appfs"
IMAGE_NAME_SUFFIX = ".appfs"

IMAGE_INSTALL_append = " app_lib "
IMAGE_INSTALL_append = " app_prog1 "
IMAGE_INSTALL_append = " app_prog2 "
IMAGE_INSTALL_append = " app_prog3 "

The result looks not bad, I can control the installation of the files by the prefix-Variable in the recipes of the application programms. So the will be installed in /bin, which means /usr/local/bin in the device.

But the image contains the whole directory structure of a root filesystem. Is there any comfortable way to generate the reduced directory structure of the /usr/local directory? Or do I need to clean it up by myself in a IMAGE_POSTPROCESS_COMMAND?

Kind regards


Solution

  • If you look at your tmp/deploy/images/<machine>/<imagename>.manifest file you will notice that in addition to the packages you specified, some additional ones such as libc6 and base-files are included.

    You can remove them by naming the packages in ROOTFS_RO_UNNEEDED. This variable is used to remove recipes such as shadow and run-postinsts which are processed when creating a read-only image. You can add the other undesirable recipes to this list until your manifest matches exactly the packages you want included.

    For example:

    # tested with Yocto 2.6
    IMAGE_FSTYPES = "ext4"
    IMAGE_INSTALL = "my-go-app" 
    inherit image
    
    # Don't run ldconfig on the rootfs
    LDCONFIGDEPEND = ""
    
    # If not building an RO filesystem, you can force use of ROOTFS_RO_UNNEEDED
    # but be aware of the other packages included in the variable by image.bbclass 
    FORCE_RO_REMOVE = "1"
    
    # Use _append because image.bbclass includes other packages
    ROOTFS_RO_UNNEEDED_append = "base-files base-files-lic \
                                bash bash-lic \
                                libc6 libc6-lic \
                                ncurses-libtinfo libtinfo5 \
                                opkg-utils-lic \
                                ncurses-terminfo-base ncurses-lic \
                                run-postinsts-lic \
                                "
    

    The resulting filesystem I get looks like this:

    tmp
    ├── etc
    │   ├── shells.rpmsave
    │   ├── timestamp
    │   └── version
    ├── lost+found [error opening dir]
    ├── usr
    │   ├── bin
    │   │   └── my-go-app
    │   ├── lib
    │   │   └── go
    │   │       └── pkg
    │   │           └── linux_arm64_dynlink
    │   │               └── libstd.so
    │   └── share
    │       ├── common-licenses
    │       │   └── license.manifest
    │       └── licenses
    │           ├── go-runtime
    │           │   ├── generic_BSD-3-Clause
    │           │   └── LICENSE
    │           └── my-go-app
    └── var
        ├── cache
        └── lib
    

    There may still be a few files left to clean up using a postprocess function:

    postprocess_partial_image() {
      rm -f ${IMAGE_ROOTFS}/etc/shells.rpmsave
      rm -rf ${IMAGE_ROOTFS}/var 
    }
    
    ROOTFS_POSTPROCESS_COMMAND += "postprocess_partial_image; "