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
Convenient symlink on the host
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.