Introduction

Hi everyone, here are my thoughts in my mind when I study about Yocto/OpenEmbedded on one of projects

  • Design the system with High Available solution in mind. That is:
    • We ensure the system is designed and operated with dual power supplies.
    • Power if possible we should use N+1
    • System diagram is on the way
  • We need to have an integrated solution in mind. For example one vehicle view may not be assisted the total solution when combining with many vehicle views (vehicle ~ tank or vehicle ~ boat/ship etc…i.e. we can not win the battle with the view of one vehicle but we can have a better opportunity to win the battle when all views are combined)
  • Design the OS running on the read only the partition where the filesystem is configured to read only. That is the Yocto/OpenEmbedded OS is loaded to the readonly filesystem partition. By doing so we will less likely to brick the system.
  • Use the docker to develop the application in the cross the platform - cross compilation - need to proven and test out more. By doing so we can constantly testing out the application and develop application using more power laptop and PC.
  • Please note that we still perform firmware upgrade in two approaches - this is the approach I learn when working in the data centre as we dont often upgrade the OS but we constantly upgrade the application:
    • Total upgrade both OS (Yocto/OpenEmbedded) and application (docker)
    • Application upgrade Constantly upgrade with application patches even though we are in testing, preproduction and production (if it is safe to do so).

Training

Udemy

Linkedin

NA

Youtube

NA

Projects

Develop the Embedded Linux OS to run the Yocto/Openembeded/Raspberry Pi Docker

Deploy ADLINK/VORTEX DDS Docker to RasberryPi4

Develop the Development Environment to allow the Developers to develop the Embedded application using Docker

Study

  • Toolchain: Compiler and other tools used to create code for the target device
  • Bootloader: Program that initialises the IC board and loads the Linux kernel
  • Kernel: manage resources and interfaces with the hardware
  • Root filesystem: contains libraries and programs that are run once the kernel has completed its initialisation. It is recommended that
    • the kernel or Operating System is kept on the Read-Only filesystem thus minimising the device is being bricked and
    • the Application is kept on the Read-Write filesystem thus optimising the application is being loaded and maintained continuously during the development and deployment. It is similar concept and it is important “when we operate and maintain the Data Centre where we operate and maintain the Operating System releases less frequently than we operate and maintain the Application more frequently with continuous deployment thus leading to the docker delivery in the embedded linux or firmware”.
  • What is Yocto: Yocto is a project provides open source founded in 2010 to allow the developers to create their own custom Linux distributions for any hardware architecture. It is formed by collaborate:
    • Hardware manufacturers and Electronics companies

    • Open Source for Linux Operating Systems thus forming the working group of Linux foundation

We specify the Input and Output for the Yocto project as follows:

  • Input: Set of data that describes what we want, that is our specification (Kernel Configuration, Hardware Name, Packages/Binaries to be installed)
  • Output: Linux Based Embedded Product (Linux Kernel, Root File System, Bootloader, Device Tree, Toolchain)

Platform prerequisites to build the Yocto project(s).

  • Software Ubuntu 20.04.6
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.6 LTS
Release: 20.04
Codename: focal
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 python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \
    pylint3 xterm
  • Others software

    • git
    • tar
    • python3
  • Hardware – I use my Mac Pro with 2 CPUs/6 Cores per CPUs/2 Threads per Core and 64 GB of Memory and Multiple 50 GB (storage per build) as the build can take more than 4 hours

Embedded Linux Releases

  • Releases 4: 4.0

    • Kirkstone/4.1
    • Langdale/4.2
    • Mickledore/4.3 Nanbield
  • Release 3: 3.0

    • Zeus/ 3.1
    • Dunfell / 3.2
    • atesgarth / 3.3.
    • Hardknott / 3.4
    • Honister

Other releases refer to https://wiki.yoctoproject.org/wiki/Releases

QEMU project

Notes on how to configure, build, and run qemu

$ mkdir -p ~/projects/qemu/source
$ cd ~/projects/qemu/source
$ git clone git://git.yoctoproject.org/poky
$ git branch --all
$ git checkout langdale
or 
$ git clone -b langdale --depth=1 git://git.yoctoroject.org/poky

$ cd poky
$ git status
$ cd ~/projects/qemu/source 
$ source poky/oe-init-build-env ../build
$ bitbake-layers show-layers
NOTE: Starting bitbake server...
layer                 path                                      priority
==========================================================================
meta                  /home/hlkn/Desktop/projects/qemu/source/poky/meta          5
meta-poky             /home/hlkn/Desktop/projects/qemu/source/poky/meta-poky     5
meta-yocto-bsp        /home/hlkn/Desktop/projects/qemu/source/poky/meta-yocto-bsp  5

Raspberry PI project

Notes to configure, build and run raspberry-pi Download and configure correct branch for raspberrypi, meta-openembedded

$ mkdir -p ~/projects/rpi/source
$ cd ~/projects/rpi/source
$ git clone git://git.yoctoproject.org/poky
$ git branch --all
$ git checkout langdale
$ git clone git://git.yoctoproject.org/meta-openembeded
$ git branch --all
$ git checkout langdale
$ git clone git://git.yoctoproject.org/meta-rapberrypi
$ git branch --all
$ git checkout langdale

or 

$ git clone -b langdale --depth=1 git://git.yoctoroject.org/poky
$ git clone -b langdale --depth=1 git://git.yoctoroject.org/openembedded
$ git clone -b langdale --depth=1 git://git.yoctoroject.org/raspberrypi

$ cd poky
$ git status
$ cd ~/projects/rpi/source 
$ source poky/oe-init-build-env ../build
$ bitbake-layers show-layers
NOTE: Starting bitbake server...
layer                 path                                      priority
==========================================================================
meta                  /home/hlkn/Desktop/projects/rpi/source/poky/meta          5
meta-poky             /home/hlkn/Desktop/projects/rpi/source/poky/meta-poky     5
meta-yocto-bsp        /home/hlkn/Desktop/projects/rpi/source/poky/meta-yocto-bsp  5
$ bitbake-layers add-layers
NOTE: Starting bitbake server...
layer                 path                                      priority
==========================================================================
meta                  /home/hlkn/Desktop/projects/rpi/source/poky/meta          5
meta-poky             /home/hlkn/Desktop/projects/rpi/source/poky/meta-poky     5
meta-yocto-bsp        /home/hlkn/Desktop/projects/rpi/source/poky/meta-yocto-bsp  5

$ bitbake-layers show-layers
NOTE: Starting bitbake server...
layer                 path                                      priority
==========================================================================
meta                  /home/hlkn/rpi/source/poky/meta           5
meta-poky             /home/hlkn/rpi/source/poky/meta-poky      5
meta-yocto-bsp        /home/hlkn/rpi/source/poky/meta-yocto-bsp  5
meta-oe               /home/hlkn/rpi/source/meta-openembedded/meta-oe  5
meta-python           /home/hlkn/rpi/source/meta-openembedded/meta-python  5
meta-networking       /home/hlkn/rpi/source/meta-openembedded/meta-networking  5
meta-multimedia       /home/hlkn/rpi/source/meta-openembedded/meta-multimedia  5
meta-filesystems      /home/hlkn/rpi/source/meta-openembedded/meta-filesystems  5
meta-raspberrypi      /home/hlkn/rpi/source/meta-raspberrypi    9
Configure local.conf to support build
Build the raspberrypi image will take about 3 hours or more depending on the server.
$ bitbake rpi-test-image
Loading cache: 100% |############################################| Time: 0:00:01
Loaded 4087 entries from dependency cache.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION           = "2.2.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "aarch64-poky-linux"
MACHINE              = "raspberrypi4-64"
DISTRO               = "poky"
DISTRO_VERSION       = "4.1.3"
TUNE_FEATURES        = "aarch64 armv8a crc cortexa72"
TARGET_FPU           = ""
meta                 
meta-poky            
meta-yocto-bsp       = "langdale:a7d90a69d90ac980f28dd1783c2c5a849f6dbdc2"
meta-oe              
meta-python          
meta-networking      
meta-multimedia      
meta-filesystems     = "langdale:3f9340a9241d497753b330d90d6a3d8332c1ba7f"
meta-raspberrypi     = "langdale:6f5771d2bcfbfb8f8ce17b455c29a5703f2027c9"

Initialising tasks: 100% |#######################################| Time: 0:00:03
Sstate summary: Wanted 0 Local 0 Mirrors 0 Missed 0 Current 2106 (0% match, 100% complete)
NOTE: Executing Tasks

Prepare the built image to the SDCard. I use the GParted to format the SD Card to support the ext3 file system.

$ sudo bmaptool copy --bmap core-image-minimal-raspberrypi4-64-20210706094018.rootfs.wic.bmap core-image-minimal-raspberrypi4-64-20210706094018.rootfs.wic.bz2 /dev/mmcblk0
[sudo] password for hlkn:
bmaptool: info: block map format version 2.0
bmaptool: info: 148583 blocks of size 4096 (580.4 MiB), mapped 85941 blocks (335.7 MiB or 57.8%)
bmaptool: info: copying image 'core-image-minimal-raspberrypi4-64-20210706094018.rootfs.wic.bz2' to block device '/dev/mmcblk0' using bmap file 'core-image-minimal-raspberrypi4-64-20210706094018.rootfs.wic.bmap'
bmaptool: info: 100% copied
bmaptool: info: synchronizing '/dev/mmcblk0'
bmaptool: info: copying time: 19.0s, copying speed 17.6 MiB/sec

Rasberry PI with Docker project

Notes to configure, build and run Docker in the raspberry-pi

$ mkdir -p ~/projects/rpid/source
$ cd ~/projects/rpid/source
$ git clone git://git.yoctoproject.org/poky
$ git branch --all
$ git checkout langdale
$ git clone git://git.yoctoproject.org/meta-openembeded
$ git branch --all
$ git checkout langdale
$ git clone git://git.yoctoproject.org/meta-rapberrypi
$ git branch --all
$ git checkout langdale
$ git clone git://git.yoctoproject.org/meta-virtualization
$ git branch --all
$ git checkout langdale
$ git clone git://git.yoctoproject.org/meta-security
$ git branch --all
$ git checkout langdale
$ git clone git://git.yoctoproject.org/meta-selinux
$ git branch --all
$ git checkout langdale


or 

cd /workdir
# sudo chown -R build:build *
git clone -b langdale --depth=1 git://git.yoctoproject.org/poky.git
git clone -b langdale --depth=1 git://git.yoctoproject.org/meta-raspberrypi.git
git clone -b langdale --depth=1 git://git.yoctoproject.org/meta-virtualization.git
git clone -b langdale --depth=1 git://git.yoctoproject.org/meta-security.git
git clone -b langdale --depth=1 git://git.yoctoproject.org/meta-selinux.git
git clone -b langdale --depth=1 git://git.openembedded.org/meta-openembedded.git

source poky/oe-init-build-env

bitbake-layers add-layer ../meta-openembedded/meta-oe
bitbake-layers add-layer ../meta-openembedded/meta-python
bitbake-layers add-layer ../meta-openembedded/meta-multimedia
bitbake-layers add-layer ../meta-openembedded/meta-networking
bitbake-layers add-layer ../meta-openembedded/meta-perl
bitbake-layers add-layer ../meta-openembedded/meta-filesystems
bitbake-layers add-layer ../meta-virtualization
bitbake-layers add-layer ../meta-selinux
bitbake-layers add-layer ../meta-security
bitbake-layers add-layer ../meta-raspberrypi
bitbake-layers show-layers

Option 1: Configure the local.conf and bblayers.conf the raspberrypi with docker support

$ vi conf/local.conf
# This sets the default machine to be qemux86-64 if no other machine is selected:
MACHINE ??= "raspberrypi4-64"
#MACHINE ??= "qemux86-64"


# CONF_VERSION is increased each time build/conf/ changes incompatibly and is used to
# track the version of this file when it was generated. This can safely be ignored if
# this doesn't mean anything to you.
CONF_VERSION = "1"



DISTRO_FEATURES_append = " virtualization"


DISTRO_FEATURES_append = " systemd"
VIRTUAL-RUNTIME_init_manager = "systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"
VIRTUAL-RUNTIME_initscripts = "systemd-compat-units"


IMAGE_INSTALL_append = " sysstat"
IMAGE_INSTALL_append = " cronie"

IMAGE_INSTALL_append = " openssh"
IMAGE_INSTALL_append = " openssh-sftp"
IMAGE_INSTALL_append = " openssh-sftp-server"
IMAGE_INSTALL_append = " curl-dev"
IMAGE_INSTALL_append = " docker-ce"

IMAGE_INSTALL_append = " libstdc++"


$ vi conf/bblayers.conf
# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
  /home/hlkn/rpi-gategarth/layers/poky/meta \
  /home/hlkn/rpi-gategarth/layers/poky/meta-poky \
  /home/hlkn/rpi-gategarth/layers/poky/meta-yocto-bsp \
  /home/hlkn/rpi-gategarth/layers/meta-raspberrypi \
  /home/hlkn/rpi-gategarth/layers/meta-openembedded/meta-oe \
  /home/hlkn/rpi-gategarth/layers/meta-openembedded/meta-python \
  /home/hlkn/rpi-gategarth/layers/meta-openembedded/meta-networking \
  /home/hlkn/rpi-gategarth/layers/meta-openembedded/meta-filesystems \
  /home/hlkn/rpi-gategarth/layers/meta-virtualization \
  "
Options 2: Follow the IBM tutorial 30
$ vi local.conf
MACHINE ?= "raspberrypi4-64"
ENABLE_UART = "1"
ENABLE_I2C = "1"
KERNEL_MODULE_AUTOLOAD:rpi += "i2c-dev i2c-bcm2708"
# add a feature
EXTRA_IMAGE_FEATURES:append = " debug-tweaks ssh-server-dropbear package-management tools-sdk"
DISTRO_FEATURES:append = " bluez5 bluetooth wifi polkit acl xattr pam virtualization security systemd"
DISTRO_FEATURES:remove = " sysvinit"
VIRTUAL-RUNTIME_init_manager = "systemd"
LICENSE_FLAGS_ACCEPTED = "synaptics-killswitch"
# add a recipe
CORE_IMAGE_EXTRA_INSTALL:append = " vim"
DISTRO_FEATURES_BACKFILL_CONSIDERED = ""
IMAGE_INSTALL:append = " ntpdate i2c-tools podman crun buildah skopeo cgroup-lite procps ca-certificates kernel-modules python3-pip python3-dbus ebtables cri-o cri-tools e2fsprogs-resize2fs linux-firmware-bcm43430 bluez5 python3-smbus wpa-supplicant bridge-utils git hostapd"
IMAGE_ROOTFS_EXTRA_SPACE = "8097152"
# BB_NUMBER_THREADS = "9"
# PARALLEL_MAKE = "-j 9"
INHERIT += "rm_work"

Run the bitbake command to generate the image. The above features add a lot more components than we actually need for runing MicroShift. These were added to permit some development and experimentation for learning yocto with a generous 8GB disk size. The python3, pip3, vim, i2cdetect, podman and crun runtime are installed. The debug-tweaks allows us to login as root without password.

bitbake rpi-test-image -n
bitbake rpi-test-image --runonly=fetch
bitbake rpi-test-image # This will take a couple of hours

This produces the rpi-test-image-raspberrypi4-64.wic.bz2.The balenaEtcher that we use to write to MicroSDXC card does not understand the bz2 format built by bitbake, so we extract the image

cd tmp/deploy/images/raspberrypi4-64
bzip2 -d -f rpi-test-image-raspberrypi4-64.wic.bz2

Run docker in raspberrypi using the Option-1 configuration

root@raspberrypi4-64:~# dokerd &

root@raspberrypi4-64:~# ps -ef|grep dockerd
207 root 0:01 dockerd
334 root 0:00 grep dockerd

$ ssh root@192.168.0.229
The authenticity of host '192.168.0.229 (192.168.0.229)' can't be established.
ECDSA key fingerprint is SHA256:R+OYjsNv6MhVBb+G5/fwQUcExcB9gSZ3IgOzTLlKT48.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.0.229' (ECDSA) to the list of known hosts.
root@raspberrypi4-64:~#
root@raspberrypi4-64:~#
root@raspberrypi4-64:~# dockerd
INFO[2023-03-29T10:08:02.537766772Z] Starting up
INFO[2023-03-29T10:08:02.560111257Z] libcontainerd: started new containerd process pid=214
INFO[2023-03-29T10:08:02.560950036Z] parsed scheme: "unix" module=grpc-java
INFO[2023-03-29T10:08:02.561491685Z] scheme "unix" not registered, fallback to default scheme module=grpc-java
INFO[2023-03-29T10:08:02.562066204Z] ccResolverWrapper: sending update to cc: {[{unix:///var/run/docker/containerd/containerd.sock 0 }] } module=grpc-java
INFO[2023-03-29T10:08:02.562607260Z] ClientConn switching balancer to "pick_first" module=grpc-java
INFO[2023-03-29T10:08:03.637249883Z] starting containerd revision=409c87ba59dd96965239573aa9458a3585c05468.m version=v1.4.4-36-g409c87ba5.m
INFO[2023-03-29T10:08:04.043501494Z] loading plugin "io.containerd.content.v1.content"… type=io.containerd.content.v1
INFO[2023-03-29T10:08:04.044683051Z] loading plugin "io.containerd.snapshotter.v1.aufs"… type=io.containerd.snapshotter.v1
INFO[2023-03-29T10:08:04.050882372Z] skip loading plugin "io.containerd.snapshotter.v1.aufs"… error="aufs is not supported (modprobe aufs failed: exit status 1 \"modprobe: FATAL: Module aufs not found in directory /lib/modules/5.10.17-v8\n\"): skip plugin" type=io.containerd.snapshotter.v1
INFO[2023-03-29T10:08:04.051224428Z] loading plugin "io.containerd.snapshotter.v1.devmapper"… type=io.containerd.snapshotter.v1
WARN[2023-03-29T10:08:04.051481576Z] failed to load plugin io.containerd.snapshotter.v1.devmapper error="devmapper not configured"
INFO[2023-03-29T10:08:04.051665225Z] loading plugin "io.containerd.snapshotter.v1.native"… type=io.containerd.snapshotter.v1
INFO[2023-03-29T10:08:04.052578485Z] loading plugin "io.containerd.snapshotter.v1.overlayfs"… type=io.containerd.snapshotter.v1
INFO[2023-03-29T10:08:04.054358746Z] loading plugin "io.containerd.snapshotter.v1.zfs"… type=io.containerd.snapshotter.v1
INFO[2023-03-29T10:08:04.055782303Z] skip loading plugin "io.containerd.snapshotter.v1.zfs"… error="path /var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.zfs must be a zfs filesystem to be used with the zfs snapshotter: skip plugin" type=io.containerd.snapshotter.v1
INFO[2023-03-29T10:08:04.056042507Z] loading plugin "io.containerd.metadata.v1.bolt"… type=io.containerd.metadata.v1
WARN[2023-03-29T10:08:04.056633211Z] could not use snapshotter devmapper in metadata plugin error="devmapper not configured"
INFO[2023-03-29T10:08:04.056818008Z] metadata content store policy set policy=shared
INFO[2023-03-29T10:08:04.078754400Z] loading plugin "io.containerd.differ.v1.walking"… type=io.containerd.differ.v1
INFO[2023-03-29T10:08:04.079083456Z] loading plugin "io.containerd.gc.v1.scheduler"… type=io.containerd.gc.v1
INFO[2023-03-29T10:08:04.079435549Z] loading plugin "io.containerd.service.v1.introspection-service"… type=io.containerd.service.v1
INFO[2023-03-29T10:08:04.079831623Z] loading plugin "io.containerd.service.v1.containers-service"… type=io.containerd.service.v1
INFO[2023-03-29T10:08:04.080098512Z] loading plugin "io.containerd.service.v1.content-service"… type=io.containerd.service.v1
INFO[2023-03-29T10:08:04.080321012Z] loading plugin "io.containerd.service.v1.diff-service"… type=io.containerd.service.v1
INFO[2023-03-29T10:08:04.080667809Z] loading plugin "io.containerd.service.v1.images-service"… type=io.containerd.service.v1
INFO[2023-03-29T10:08:04.080903606Z] loading plugin "io.containerd.service.v1.leases-service"… type=io.containerd.service.v1
INFO[2023-03-29T10:08:04.081136569Z] loading plugin "io.containerd.service.v1.namespaces-service"… type=io.containerd.service.v1
INFO[2023-03-29T10:08:04.081352513Z] loading plugin "io.containerd.service.v1.snapshots-service"… type=io.containerd.service.v1
INFO[2023-03-29T10:08:04.081569884Z] loading plugin "io.containerd.runtime.v1.linux"… type=io.containerd.runtime.v1
INFO[2023-03-29T10:08:04.082805311Z] loading plugin "io.containerd.runtime.v2.task"… type=io.containerd.runtime.v2
INFO[2023-03-29T10:08:04.083777590Z] loading plugin "io.containerd.monitor.v1.cgroups"… type=io.containerd.monitor.v1
INFO[2023-03-29T10:08:04.090603300Z] loading plugin "io.containerd.service.v1.tasks-service"… type=io.containerd.service.v1
INFO[2023-03-29T10:08:04.091025856Z] loading plugin "io.containerd.internal.v1.restart"… type=io.containerd.internal.v1
INFO[2023-03-29T10:08:04.093178396Z] loading plugin "io.containerd.grpc-java.v1.containers"… type=io.containerd.grpc-java.v1
INFO[2023-03-29T10:08:04.093511174Z] loading plugin "io.containerd.grpc-java.v1.content"… type=io.containerd.grpc-java.v1
INFO[2023-03-29T10:08:04.093740433Z] loading plugin "io.containerd.grpc-java.v1.diff"… type=io.containerd.grpc-java.v1
INFO[2023-03-29T10:08:04.093958878Z] loading plugin "io.containerd.grpc-java.v1.events"… type=io.containerd.grpc-java.v1
INFO[2023-03-29T10:08:04.094174582Z] loading plugin "io.containerd.grpc-java.v1.healthcheck"… type=io.containerd.grpc-java.v1
INFO[2023-03-29T10:08:04.094391082Z] loading plugin "io.containerd.grpc-java.v1.images"… type=io.containerd.grpc-java.v1
INFO[2023-03-29T10:08:04.094599675Z] loading plugin "io.containerd.grpc-java.v1.leases"… type=io.containerd.grpc-java.v1
INFO[2023-03-29T10:08:04.094809749Z] loading plugin "io.containerd.grpc-java.v1.namespaces"… type=io.containerd.grpc-java.v1
INFO[2023-03-29T10:08:04.095029990Z] loading plugin "io.containerd.internal.v1.opt"… type=io.containerd.internal.v1
INFO[2023-03-29T10:08:04.097362326Z] loading plugin "io.containerd.grpc-java.v1.snapshots"… type=io.containerd.grpc-java.v1
INFO[2023-03-29T10:08:04.097741289Z] loading plugin "io.containerd.grpc-java.v1.tasks"… type=io.containerd.grpc-java.v1
INFO[2023-03-29T10:08:04.097978419Z] loading plugin "io.containerd.grpc-java.v1.version"… type=io.containerd.grpc-java.v1
INFO[2023-03-29T10:08:04.098192604Z] loading plugin "io.containerd.grpc-java.v1.introspection"… type=io.containerd.grpc-java.v1
INFO[2023-03-29T10:08:04.100055884Z] serving… address=/var/run/docker/containerd/containerd-debug.sock
INFO[2023-03-29T10:08:04.100629755Z] serving… address=/var/run/docker/containerd/containerd.sock.ttrpc
INFO[2023-03-29T10:08:04.101130218Z] serving… address=/var/run/docker/containerd/containerd.sock
INFO[2023-03-29T10:08:04.101361459Z] containerd successfully booted in 0.479344s
INFO[2023-03-29T10:08:04.174947773Z] parsed scheme: "unix" module=grpc-java
INFO[2023-03-29T10:08:04.175125958Z] scheme "unix" not registered, fallback to default scheme module=grpc-java
INFO[2023-03-29T10:08:04.175262977Z] ccResolverWrapper: sending update to cc: {[{unix:///var/run/docker/containerd/containerd.sock 0 }] } module=grpc-java
INFO[2023-03-29T10:08:04.175364273Z] ClientConn switching balancer to "pick_first" module=grpc-java
INFO[2023-03-29T10:08:04.180830205Z] parsed scheme: "unix" module=grpc-java
INFO[2023-03-29T10:08:04.180963853Z] scheme "unix" not registered, fallback to default scheme module=grpc-java
INFO[2023-03-29T10:08:04.181161427Z] ccResolverWrapper: sending update to cc: {[{unix:///var/run/docker/containerd/containerd.sock 0 }] } module=grpc-java
INFO[2023-03-29T10:08:04.181242575Z] ClientConn switching balancer to "pick_first" module=grpc-java
ERRO[2023-03-29T10:08:04.187997490Z] Failed to built-in GetDriver graph btrfs /var/lib/docker
ERRO[2023-03-29T10:08:04.196119461Z] failed to mount overlay: no such device storage-driver=overlay2
ERRO[2023-03-29T10:08:04.201334206Z] AUFS was not found in /proc/filesystems storage-driver=aufs
ERRO[2023-03-29T10:08:04.208779381Z] failed to mount overlay: no such device storage-driver=overlay
ERRO[2023-03-29T10:08:04.208921825Z] Failed to built-in GetDriver graph devicemapper /var/lib/docker
WARN[2023-03-29T10:08:04.341482234Z] Your kernel does not support cgroup memory limit
WARN[2023-03-29T10:08:04.341604105Z] Your kernel does not support cgroup rt period
WARN[2023-03-29T10:08:04.341664994Z] Your kernel does not support cgroup rt runtime
WARN[2023-03-29T10:08:04.341748161Z] Your kernel does not support cgroup blkio weight
WARN[2023-03-29T10:08:04.341810383Z] Your kernel does not support cgroup blkio weight_device
INFO[2023-03-29T10:08:04.343829385Z] Loading containers: start.
WARN[2023-03-29T10:08:04.371513875Z] Running modprobe bridge br_netfilter failed with message: modprobe: WARNING: Module br_netfilter not found in directory /lib/modules/5.10.17-v8
insmod /lib/modules/5.10.17-v8/kernel/net/llc/llc.ko
insmod /lib/modules/5.10.17-v8/kernel/net/802/stp.ko
insmod /lib/modules/5.10.17-v8/kernel/net/bridge/bridge.ko
, error: exit status 1
INFO[2023-03-29T10:08:05.046749137Z] Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address
INFO[2023-03-29T10:08:05.541597770Z] Loading containers: done.
INFO[2023-03-29T10:08:05.823780138Z] Docker daemon commit=ff3fbc9d55de9fce497cd058411f21f4a4dcdb7c graphdriver(s)=vfs version=v19.03.13-ce
INFO[2023-03-29T10:08:05.824912251Z] Daemon has completed initialization
INFO[2023-03-29T10:08:05.935543915Z] API listen on /var/run/docker.sock

$ docker login --username henrynguyen --password

$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
7050e35b49f5: Pull complete
Digest: sha256:ffb13da98453e0f04d33a6eee5bb8e46ee50d08ebe17735fc0779d0349e889e9
Status: Downloaded newer image for hello-world:latest
ERRO[2023-03-29T10:09:22.228694279Z] 57c0bda5e06d9e1c30d9ab6c6b4f76f38606723e5b76b64885cc98b8260f7ba9 cleanup: failed to delete container from containerd: no such container
ERRO[2023-03-29T10:09:22.229116046Z] Handler for POST /v1.40/containers/57c0bda5e06d9e1c30d9ab6c6b4f76f38606723e5b76b64885cc98b8260f7ba9/start returned error: failed to create endpoint sad_cohen on network bridge: failed to add the host (veth03ee259) <=> sandbox (vethabd8cd3) pair interfaces: operation not supported
docker: Error response from daemon: failed to create endpoint sad_cohen on network bridge: failed to add the host (veth03ee259) <=> sandbox (vethabd8cd3) pair interfaces: operation not supported.
ERRO[0005] error waiting for container: context canceled
root@raspberrypi4-64:~# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57c0bda5e06d hello-world "/hello" 10 seconds ago Created sad_cohen
root@raspberrypi4-64:~# docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 46331d942d63 12 months ago 9.14kB