Last Updated on December 27, 2023

Reliable Embedded Systems – Robert Berger e.U. build framework & qemux86-64-virt-master

Objectives

Can the Reliable Embedded Systems – Robert Berger e.U. Yocto Project®/OpenEmbedded build environment and QEMU work together? Or do we need real hardware? Let’s have a look! We’ll build an image – a “core-image-minimal” – for the qemux86-64 emulator. We’ll try to execute the image with the emulator.

Prerequisites

Assuming you already have the Reliable Embedded Systems – Robert Berger e.U. Yocto Project®/OpenEmbedded build framework installed you are in a good position and can skip the chapter “Install a minimal Build framework”.

Install a minimal Build framework

Install docker

sudo apt install docker.io
sudo usermod -aG docker ${USER}
sudo reboot

Create a directory where you have plenty of space

mkdir -p ~/projects/resy-playground
cd ~/projects/resy-playground
sudo ln -sf ~/projects/resy-playground /workdir
cd /workdir

You might need to fix some permissions.

Download manifests

mkdir -p /workdir/sources
pushd /workdir/sources
git clone https://github.com/RobertBerger/manifests.git
popd

Download meta data

cd /workdir
./qemux86-64-virt-master.sh
WORKDIR: /workdir
This script will kill everything
and grab everything from scratch
Are you sure? [y/N] N
not killing!
use experimental for now
1) stable
2) experimental
#? 2
MANIFEST: experimental
+ Do you want to replace manifests first?
Are you sure? [y/N] N
+ manifests might be replaced later
+ you might need to run resy.sh again
--> meta-virtualization-master
git clone -b master git://git.yoctoproject.org/meta-virtualization /workdir/sources/meta-virtualization-master --single-branch
Cloning into '/workdir/sources/meta-virtualization-master'...
remote: Enumerating objects: 13647, done.
remote: Counting objects: 100% (3661/3661), done.
remote: Compressing objects: 100% (724/724), done.
remote: Total 13647 (delta 3255), reused 2937 (delta 2937), pack-reused 9986
Receiving objects: 100% (13647/13647), 3.83 MiB | 4.09 MiB/s, done.
Resolving deltas: 100% (7966/7966), done.
trying to apply this patch: /workdir/sources/manifests/meta-virtualization-master/patch.sh
Press <ENTER> to go on

+ pushd /workdir/sources/meta-virtualization-master
/workdir/sources/meta-virtualization-master /workdir
+ /workdir/sources/manifests/meta-virtualization-master/patch.sh
+ git add .
+ git commit -m 'patch typically only against upstream master'
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
+ popd
/workdir
+ set +x
pushd /workdir/sources/meta-virtualization-master
/workdir/sources/meta-virtualization-master /workdir
git branch
* master
popd
/workdir
<-- meta-virtualization-master
--> poky-master
git clone -b master git://git.yoctoproject.org/poky /workdir/sources/poky-master --single-branch
Cloning into '/workdir/sources/poky-master'...
remote: Enumerating objects: 523280, done.
remote: Counting objects: 100% (58798/58798), done.
remote: Compressing objects: 100% (10252/10252), done.
remote: Total 523280 (delta 54773), reused 48903 (delta 48531), pack-reused 464482
Receiving objects: 100% (523280/523280), 181.73 MiB | 11.22 MiB/s, done.
Resolving deltas: 100% (375830/375830), done.
trying to apply this patch: /workdir/sources/manifests/poky-master/patch.sh
Press <ENTER> to go on
...
--> resy-master
git clone -b master https://gitlab.com/meta-layers/meta-resy.git /workdir/sources/meta-resy-master --single-branch
Cloning into '/workdir/sources/meta-resy-master'...
remote: Enumerating objects: 2030, done.
remote: Counting objects: 100% (269/269), done.
remote: Compressing objects: 100% (90/90), done.
remote: Total 2030 (delta 191), reused 205 (delta 164), pack-reused 1761
Receiving objects: 100% (2030/2030), 397.34 KiB | 3.08 MiB/s, done.
Resolving deltas: 100% (1025/1025), done.
pushd /workdir/sources/meta-resy-master
/workdir/sources/meta-resy-master /workdir
git branch
* master
popd
/workdir
<-- resy-master
+ '[' '!' -L resy-poky-container.sh ']'
+ '[' '!' -L resy-sdk-container.sh ']'
+ '[' '!' -L resy-cooker.sh ']'
+ '[' '!' -L killall_bitbake.sh ']'
+ '[' '!' -L oci-copy-to-docker.sh ']'
+ '[' '!' -L oci-copy-to-docker.sh ']'
+ '[' '!' -L build-and-shutdown.sh ']'
+ '[' '!' -L resy.sh ']'
+ set +x
symlinks ready

On host machine

Adjust resy-poky-container.sh

rber@t460s-1:/workdir$⟫

cd /workdir
vim ./resy-poky-container.sh

Replace USE_QEMU="no" with USE_QEMU="yes".

diff --git a/resy-poky-container.sh b/resy-poky-container.sh
index 5153afa..f5f7408 100755
--- a/resy-poky-container.sh
+++ b/resy-poky-container.sh
@@ -8,7 +8,7 @@ USE_GUI="no"
 USE_MIRROR="yes"
 DOCKER_PULL="yes"
 USE_ICECC="yes"
-USE_QEMU="no"
+USE_QEMU="yes"
 #PRIVILEGED="--privileged"
 PRIVILEGED=""
 #EXTRA_MOUNTS="yes"

Start docker build container and initialize the build environment

rber@t460s-1:/workdir$⟫

cd /workdir
./resy-poky-container.sh qemux86-64-virt-master

In container

You might want to adjust /workdir/build/qemux86-64-virt-master/conf/site.conf since you will probably not have MIRRORS, PREMIRRORS and the like set up.

Build a core-image-minimal

pokyuser@t460s-1:/workdir$

bitbake core-image-minimal
pokyuser@t460s-1:~$ bitbake core-image-minimal
NOTE: Started PRServer with DBfile: /workdir/persistent_master/prserv.sqlite3, Address: 127.0.0.1:34729, PID: 88
Loading cache: 100% |                                                                                                                                                         | ETA:  --:--:--
Loaded 0 entries from dependency cache.
Parsing recipes: 100% |########################################################################################################################################################| Time: 0:02:31
Parsing of 2864 .bb files complete (0 cached, 2864 parsed). 4702 targets, 314 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION           = "2.4.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "ubuntu-22.04"
TARGET_SYS           = "x86_64-poky-linux"
MACHINE              = "qemux86-64"
DISTRO               = "poky"
DISTRO_VERSION       = "4.2+snapshot-47bf87f3a3f0af9d773c29601273e7feb16a6683"
TUNE_FEATURES        = "m64 core2"
TARGET_FPU           = ""
meta                 
meta-poky            
meta-yocto-bsp       = "master:47bf87f3a3f0af9d773c29601273e7feb16a6683"
meta-oe              
meta-networking      
meta-filesystems     
meta-python          
meta-perl            = "master:b74b10e31620f90b92979e2f1516bfbc8d051ec2"
meta-virtualization-master = "master:683bfbfc19db8de034da2b652af14c8df72c912c"

Initialising tasks: 100% |#####################################################################################################################################################| Time: 0:01:32
Checking sstate mirror object availability: 100% |#############################################################################################################################| Time: 0:00:47
Sstate summary: Wanted 1925 Local 1107 Mirrors 0 Missed 818 Current 0 (57% match, 0% complete)
NOTE: Executing Tasks
Checking sstate mirror object availability: 100% |#############################################################################################################################| Time: 0:00:40
Checking sstate mirror object availability: 100% |#############################################################################################################################| Time: 0:00:09
NOTE: Tasks Summary: Attempted 4038 tasks of which 3345 didn't need to be rerun and all succeeded.
NOTE: Writing buildhistory
NOTE: Writing buildhistory took: 4 seconds
pokyuser@t460s-1:~$ 

Now we should have some “core-image-minimal”. We will try to run it from within the emulator.

Open a privileged session suitable to run QEMU

Open a new shell on the host.

cd /workdir/sources/manifests
./root-in-poky-container.sh
root@t460s-1:/home/yoctouser#

Start QEMU in non graphical mode

In the docker container (as root)

root@t460s-1:/home/yoctouser#
cd /workdir
source ./resy-cooker.sh qemux86-64-virt-master
runqemu nographic
root@t460s-1:/workdir# runqemu nographic
runqemu - INFO - Running bitbake -e  ...
runqemu - INFO - Continuing with the following parameters:
KERNEL: [/workdir/build/qemux86-64-virt-master/tmp/deploy/images/qemux86-64/bzImage]
MACHINE: [qemux86-64]
FSTYPE: [ext4]
ROOTFS: [/workdir/build/qemux86-64-virt-master/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.rootfs-20230905122028.ext4]
CONFFILE: [/workdir/build/qemux86-64-virt-master/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.rootfs-20230905122028.qemuboot.conf]

runqemu - INFO - Setting up tap interface under sudo
runqemu - INFO - Network configuration: ip=192.168.7.2::192.168.7.1:255.255.255.0::eth0:off:8.8.8.8 net.ifnames=0
runqemu - INFO - Running /workdir/build/qemux86-64-virt-master/tmp/work/x86_64-linux/qemu-helper-native/1.0/recipe-sysroot-native/usr/bin/qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng-pci,rng=rng0 -drive file=/workdir/build/qemux86-64-virt-master/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.rootfs-20230905122028.ext4,if=virtio,format=raw -usb -device usb-tablet -usb -device usb-kbd   -cpu IvyBridge -machine q35,i8042=off -smp 4 -m 256 -serial mon:stdio -serial null -nographic  -kernel /workdir/build/qemux86-64-virt-master/tmp/deploy/images/qemux86-64/bzImage -append 'root=/dev/vda rw  ip=192.168.7.2::192.168.7.1:255.255.255.0::eth0:off:8.8.8.8 net.ifnames=0 console=ttyS0 console=ttyS1 oprofile.timer=1 tsc=reliable no_timer_check rcupdate.rcu_expedited=1 '

runqemu - INFO - Host uptime: 103086.94
SeaBIOS (version rel-1.16.2-0-gea1b7a073390-prebuilt.qemu.org)


iPXE (http://ipxe.org) 00:02.0 CA00 PCI2.10 PnP PMM+0EFC9450+0EF29450 CA00



Booting from ROM...
[    0.000000] Linux version 6.4.11-yocto-standard (oe-user@oe-host) (x86_64-poky-linux-gcc (GCC) 13.2.0, GNU ld (GNU Binutils) 2.41.0.20230731) #1 SMP PREEMPT_DYNAMIC Mon Aug 21 15:35:20 U3
[    0.000000] Command line: root=/dev/vda rw  ip=192.168.7.2::192.168.7.1:255.255.255.0::eth0:off:8.8.8.8 net.ifnames=0 console=ttyS0 console=ttyS1 oprofile.timer=1 tsc=reliable no_timer_c
[    0.000000] BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000000ffd7fff] usable
[    0.000000] BIOS-e820: [mem 0x000000000ffd8000-0x000000000fffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000b0000000-0x00000000bfffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fed1c000-0x00000000fed1ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved
[    0.000000] NX (Execute Disable) protection: active
[    0.000000] SMBIOS 2.8 present.
[    0.000000] DMI: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.2-0-gea1b7a073390-prebuilt.qemu.org 04/01/2014
[    0.000000] tsc: Fast TSC calibration using PIT
[    0.000000] tsc: Detected 2808.053 MHz processor
[    0.014440] last_pfn = 0xffd8 max_arch_pfn = 0x400000000
[    0.015280] x86/PAT: Configuration [0-7]: WB  WC  UC- UC  WB  WP  UC- WT
[    0.043278] found SMP MP-table at [mem 0x000f5b70-0x000f5b7f]
[    0.052687] ACPI: Early table checksum verification disabled
[    0.053474] ACPI: RSDP 0x00000000000F59A0 000014 (v00 BOCHS )
[    0.054062] ACPI: RSDT 0x000000000FFE2458 000038 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.055201] ACPI: FACP 0x000000000FFE2238 0000F4 (v03 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.056350] ACPI: DSDT 0x000000000FFE0040 0021F8 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.056553] ACPI: FACS 0x000000000FFE0000 000040
[    0.056676] ACPI: APIC 0x000000000FFE232C 000090 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.056746] ACPI: HPET 0x000000000FFE23BC 000038 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.056813] ACPI: MCFG 0x000000000FFE23F4 00003C (v01 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.056880] ACPI: WAET 0x000000000FFE2430 000028 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.057068] ACPI: Reserving FACP table memory at [mem 0xffe2238-0xffe232b]
[    0.057146] ACPI: Reserving DSDT table memory at [mem 0xffe0040-0xffe2237]
[    0.057164] ACPI: Reserving FACS table memory at [mem 0xffe0000-0xffe003f]
[    0.057180] ACPI: Reserving APIC table memory at [mem 0xffe232c-0xffe23bb]
[    0.057196] ACPI: Reserving HPET table memory at [mem 0xffe23bc-0xffe23f3]
[    0.057212] ACPI: Reserving MCFG table memory at [mem 0xffe23f4-0xffe242f]
[    0.057228] ACPI: Reserving WAET table memory at [mem 0xffe2430-0xffe2457]
[    0.063941] Zone ranges:
[    0.063990]   DMA      [mem 0x0000000000001000-0x0000000000ffffff]
[    0.064120]   DMA32    [mem 0x0000000001000000-0x000000000ffd7fff]
[    0.064149]   Normal   empty
[    0.064202] Movable zone start for each node
[    0.064253] Early memory node ranges
[    0.064314]   node   0: [mem 0x0000000000001000-0x000000000009efff]
[    0.064583]   node   0: [mem 0x0000000000100000-0x000000000ffd7fff]
[    0.064849] Initmem setup node 0 [mem 0x0000000000001000-0x000000000ffd7fff]
[    0.066909] On node 0, zone DMA: 1 pages in unavailable ranges
[    0.067453] On node 0, zone DMA: 97 pages in unavailable ranges
[    0.082566] On node 0, zone DMA32: 40 pages in unavailable ranges
[    0.083183] ACPI: PM-Timer IO Port: 0x608
[    0.083846] ACPI: LAPIC_NMI (acpi_id[0xff] dfl dfl lint[0x1])
[    0.084328] IOAPIC[0]: apic_id 0, version 32, address 0xfec00000, GSI 0-23
[    0.084491] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
[    0.084831] ACPI: INT_SRC_OVR (bus 0 bus_irq 5 global_irq 5 high level)
[    0.084892] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
[    0.085017] ACPI: INT_SRC_OVR (bus 0 bus_irq 10 global_irq 10 high level)
[    0.085034] ACPI: INT_SRC_OVR (bus 0 bus_irq 11 global_irq 11 high level)
[    0.085273] ACPI: Using ACPI (MADT) for SMP configuration information
[    0.085334] ACPI: HPET id: 0x8086a201 base: 0xfed00000
[    0.085786] smpboot: Allowing 4 CPUs, 0 hotplug CPUs
[    0.086706] [mem 0x10000000-0xafffffff] available for PCI devices
[    0.086756] Booting paravirtualized kernel on bare hardware
[    0.087145] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 1910969940391419 ns
[    0.087715] setup_percpu: NR_CPUS:64 nr_cpumask_bits:4 nr_cpu_ids:4 nr_node_ids:1
[    0.091719] percpu: Embedded 56 pages/cpu s189864 r8192 d31320 u524288
[    0.094451] Kernel command line: root=/dev/vda rw  ip=192.168.7.2::192.168.7.1:255.255.255.0::eth0:off:8.8.8.8 net.ifnames=0 console=ttyS0 console=ttyS1 oprofile.timer=1 tsc=reliable no_
[    0.097479] random: crng init done
[    0.098027] Dentry cache hash table entries: 32768 (order: 6, 262144 bytes, linear)
[    0.098288] Inode-cache hash table entries: 16384 (order: 5, 131072 bytes, linear)
[    0.103039] Built 1 zonelists, mobility grouping on.  Total pages: 64216
[    0.105963] mem auto-init: stack:all(zero), heap alloc:off, heap free:off
[    0.112511] Memory: 220364K/261592K available (18432K kernel code, 2255K rwdata, 5104K rodata, 3332K init, 2428K bss, 40968K reserved, 0K cma-reserved)
[    0.117174] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[    0.118809] Kernel/User page tables isolation: enabled
[    0.123503] ftrace: allocating 49248 entries in 193 pages
[    0.183862] ftrace: allocated 193 pages with 3 groups
[    0.191521] Dynamic Preempt: full
[    0.196183] rcu: Preemptible hierarchical RCU implementation.
[    0.196203] rcu:     RCU event tracing is enabled.
[    0.196234] rcu:     RCU restricting CPUs from NR_CPUS=64 to nr_cpu_ids=4.
[    0.196333]  All grace periods are expedited (rcu_expedited).
[    0.196379]  Trampoline variant of Tasks RCU enabled.
[    0.196389]  Rude variant of Tasks RCU enabled.
[    0.196398]  Tracing variant of Tasks RCU enabled.
[    0.196571] rcu: RCU calculated value of scheduler-enlistment delay is 100 jiffies.
[    0.196605] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[    0.228983] NR_IRQS: 4352, nr_irqs: 456, preallocated irqs: 16
[    0.235886] rcu: srcu_init: Setting srcu_struct sizes based on contention.
[    0.241555] kfence: initialized - using 2097152 bytes for 255 objects at 0x(____ptrval____)-0x(____ptrval____)
[    0.247256] Console: colour VGA+ 80x25
[    0.249486] printk: console [ttyS0] enabledClean up your unlinked content to make sure people can find it
[    0.298541] ACPI: Core revision 20230331
[    0.308303] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604467 ns
[    0.321549] APIC: Switch to symmetric I/O mode setup
[    0.331411] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=-1 pin2=-1
[    0.334066] clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x2879f856233, max_idle_ns: 440795305185 ns
[    0.335938] Calibrating delay loop (skipped), value calculated using timer frequency.. 5616.10 BogoMIPS (lpj=2808053)
[    0.345889] Last level iTLB entries: 4KB 0, 2MB 0, 4MB 0
[    0.346495] Last level dTLB entries: 4KB 0, 2MB 0, 4MB 0, 1GB 0
[    0.347857] Spectre V1 : Mitigation: usercopy/swapgs barriers and __user pointer sanitization
[    0.348927] Spectre V2 : Mitigation: Retpolines
[    0.349382] Spectre V2 : Spectre v2 / SpectreRSB mitigation: Filling RSB on context switch
[    0.349767] Spectre V2 : Spectre v2 / SpectreRSB : Filling RSB on VMEXIT
[    0.350517] Speculative Store Bypass: Vulnerable
[    0.350834] MDS: Vulnerable: Clear CPU buffers attempted, no microcode
[    0.351368] MMIO Stale Data: Unknown: No mitigations
[    0.351751] SRBDS: Unknown: Dependent on hypervisor status
[    0.357509] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[    0.363268] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
[    0.364280] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
[    0.365090] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.366300] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[    0.626918] Freeing SMP alternatives memory: 52K
[    0.628871] pid_max: default: 32768 minimum: 301
[    0.638158] LSM: initializing lsm=capability,landlock,integrity
[    0.640374] landlock: Up and running.
...
[    4.206499] printk: console [netcon0] enabled
[    4.207239] netconsole: network logging started
[    4.259777] IP-Config: Complete:
[    4.260144]      device=eth0, hwaddr=52:54:00:12:34:02, ipaddr=192.168.7.2, mask=255.255.255.0, gw=192.168.7.1
[    4.260950]      host=192.168.7.2, domain=, nis-domain=(none)
[    4.262268]      bootserver=255.255.255.255, rootserver=255.255.255.255, rootpath=
[    4.262424]      nameserver0=8.8.8.8
[    4.269614] clk: Disabling unused clocks
[    4.297452] input: QEMU QEMU USB Tablet as /devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/0003:0627:0001.0001/input/input1
[    4.301840] hid-generic 0003:0627:0001.0001: input: USB HID v0.01 Mouse [QEMU QEMU USB Tablet] on usb-0000:00:1d.7-1/input0
[    4.304454] md: Waiting for all devices to be available before autodetect
[    4.305700] md: If you don't use raid, use raid=noautodetect
[    4.308264] md: Autodetecting RAID arrays.
[    4.309052] md: autorun ...
[    4.309367] md: ... autorun DONE.
[    4.420219] usb 2-2: new high-speed USB device number 3 using ehci-pci
[    4.484535] EXT4-fs (vda): mounted filesystem 2b99f94d-69af-4f33-822f-a81267c77494 r/w with ordered data mode. Quota mode: disabled.
[    4.486342] VFS: Mounted root (ext4 filesystem) on device 253:0.
[    4.491424] devtmpfs: mounted
[    4.571701] input: QEMU QEMU USB Keyboard as /devices/pci0000:00/0000:00:1d.7/usb2/2-2/2-2:1.0/0003:0627:0001.0002/input/input2
[    4.633216] hid-generic 0003:0627:0001.0002: input: USB HID v1.11 Keyboard [QEMU QEMU USB Keyboard] on usb-0000:00:1d.7-2/input0
[    4.743785] Freeing unused kernel image (initmem) memory: 3332K
[    4.745582] Write protecting the kernel read-only data: 24576k
[    4.749851] Freeing unused kernel image (rodata/data gap) memory: 1040K
[    4.751768] Run /sbin/init as init process
[    4.831680] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[    5.549297] systemd[1]: systemd 254^ running in system mode (-PAM -AUDIT -SELINUX -APPARMOR +IMA -SMACK +SECCOMP -GCRYPT -GNUTLS -OPENSSL +ACL +BLKID -CURL -ELFUTILS -FIDO2 -IDN2 -IDN -I)
[    5.552537] systemd[1]: Detected virtualization qemu.
[    5.554357] systemd[1]: Detected architecture x86-64.

Welcome to Poky (Yocto Project Reference Distro) 4.2+snapshot-47bf87f3a3f0af9d773c29601273e7feb16a6683 (nanbield)!

[    5.646967] systemd[1]: Hostname set to <qemux86-64>.
[    5.656953] systemd[1]: Initializing machine ID from random generator.
[    8.079781] systemd[1]: Queued start job for default target Multi-User System.
[    8.472637] systemd[1]: Created slice Slice /system/getty.
[  OK  ] Created slice Slice /system/getty.
[    8.503490] systemd[1]: Created slice Slice /system/modprobe.
[  OK  ] Created slice Slice /system/modprobe.
[    8.528688] systemd[1]: Created slice Slice /system/serial-getty.
[  OK  ] Created slice Slice /system/serial-getty.
[    8.554901] systemd[1]: Created slice User and Session Slice.
[  OK  ] Created slice User and Session Slice.
[    8.565514] systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
[  OK  ] Started Dispatch Password Requests to Console Directory Watch.
[    8.573771] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
[  OK  ] Started Forward Password Requests to Wall Directory Watch.
[    8.578616] systemd[1]: Reached target Path Units.
[  OK  ] Reached target Path Units.
[    8.582380] systemd[1]: Reached target Remote File Systems.
[  OK  ] Reached target Remote File Systems.
[    8.586290] systemd[1]: Reached target Slice Units.
[  OK  ] Reached target Slice Units.
[    8.589880] systemd[1]: Reached target Swaps.
[  OK  ] Reached target Swaps.
[    8.604863] systemd[1]: Listening on Syslog Socket.
[  OK  ] Listening on Syslog Socket.
[    8.612680] systemd[1]: Listening on initctl Compatibility Named Pipe.
[  OK  ] Listening on initctl Compatibility Named Pipe.
[    8.661374] systemd[1]: Journal Audit Socket was skipped because of an unmet condition check (ConditionSecurity=audit).
[    8.669435] systemd[1]: Listening on Journal Socket (/dev/log).
[  OK  ] Listening on Journal Socket (/dev/log).
[    8.679352] systemd[1]: Listening on Journal Socket.
[  OK  ] Listening on Journal Socket.
[    8.689413] systemd[1]: Listening on Network Service Netlink Socket.
[  OK  ] Listening on Network Service Netlink Socket.
[    8.703401] systemd[1]: Listening on udev Control Socket.
[  OK  ] Listening on udev Control Socket.
[    8.710837] systemd[1]: Listening on udev Kernel Socket.
[  OK  ] Listening on udev Kernel Socket.
[    8.718371] systemd[1]: Listening on User Database Manager Socket.
[  OK  ] Listening on User Database Manager Socket.
[    8.729892] systemd[1]: Huge Pages File System was skipped because of an unmet condition check (ConditionPathExists=/sys/kernel/mm/hugepages).
[    8.785832] systemd[1]: Mounting POSIX Message Queue File System...
         Mounting POSIX Message Queue File System...
[    8.857702] systemd[1]: Mounting Kernel Debug File System...
         Mounting Kernel Debug File System...
[    8.955262] systemd[1]: Mounting Kernel Trace File System...
         Mounting Kernel Trace File System...
[    9.014626] systemd[1]: Mounting Temporary Directory /tmp...
...
[  OK  ] Started Kernel Logging Service.
[  OK  ] Started System Logging Service.
         Starting D-Bus System Message Bus...
[  OK  ] Started Getty on tty1.
         Starting IPv6 Packet Filtering Framework...
         Starting IPv4 Packet Filtering Framework...
[  OK  ] Started Serial Getty on ttyS0.
[  OK  ] Started Serial Getty on ttyS1.
[  OK  ] Reached target Login Prompts.
         Starting User Login Management...
[  OK  ] Started D-Bus System Message Bus.
[  OK  ] Finished IPv6 Packet Filtering Framework.
[  OK  ] Finished IPv4 Packet Filtering Framework.
[  OK  ] Reached target Preparation for Network.
         Starting Network Configuration...
[  OK  ] Started User Login Management.
[  OK  ] Started Network Configuration.
[  OK  ] Reached target Network.
         Starting containerd container runtime...
[  OK  ] Listening on Load/Save RF Kill Switch Status /dev/rfkill Watch.

Poky (Yocto Project Reference Distro) 4.2+snapshot-47bf87f3a3f0af9d773c29601273e7feb16a6683 qemux86-64 ttyS0

qemux86-64 login:root
root@qemux86-64:~#

You can log in as root with no password.

root@qemux86-64:~# cat /proc/version 
Linux version 6.4.11-yocto-standard (oe-user@oe-host) (x86_64-poky-linux-gcc (GCC) 13.2.0, GNU ld (GNU Binutils) 2.41.0.20230731) #1 SMP PREEMPT_DYNAMIC Mon Aug 21 15:35:20 UTC 2023
root@qemux86-64:~# lsmod
Module                  Size  Used by
sch_fq_codel           16384  1

You can shut down the system as usual

root@qemux86-64:~# shutdown -h now

Conclusion

That’s just a small demo of how a “Build Container” can be used to build an “image” suitable for the emulator. On top of that there is a little trick how to run the emulator inside a container.

Poky is the reference implementation of the Yocto Project®.

Appendix

For a blog post that describes how to build the upstream kernel without the Yocto Project® have a look here. If you want to learn how Embedded Linux works have a look here. To learn more about the Yocto Project® have a look here.

Upcoming Events

Our 3 points

of differentiation

We provide host and target hardware during all our teaching.

Three or more people from the same company? We provide private customized training – consulting included.

Subject matter experts develop high-quality, job-related, up-to-date, authentic courseware.