My latest experiments led me to write https://github.com/lucky-sideburn/generic-distro-toolkit, a project that bundles tons of Ansible, Bash, and Jenkins jobs dedicated to building a GNU/Linux operating system from scratch. Specifically, it’s based on the LFS project, that is https://www.linuxfromscratch.org/lfs/view/stable/.

Of course, LFS is for manually setting up Linux and learning in depth how things work, but my focus is on the DevOps side, using tools like Jenkins and Ansible.

This is an example of a distribution for the x86_64 architecture that I started through virt-install by running the job “0004 – Prepare System Image (System Configuration).”
This post shows the journal of another experiment, where I created an aarch64 system. For this, I started directly on my MacBook Pro M3 using QEMU. The *.img file was passed through the synced folder of the LFS aarch64 build node, which was provisioned with Vagrant.

Project Structure

This is the start of VMs on AARCH64, the first one is an Alpine that I use for debugging, the second one is my (A)LFS

Prequisites

Before starting the operating system build, ensure you have a Jenkins server to coordinate the agent.

For building AMD64 or AARCH64, enable KVM and install libvirt, QEMU, and Cockpit.

For AMD64, I used a physical server with both the Jenkins Master and Agent running on the same node.

For AARCH64 (related to this article), I used my laptop with a VM acting as the Jenkins Agent, connected to a Jenkins Master (you can provision the master wherever you prefer)

Build AARCH64 – GNU/Linux Operating System

Clone https://github.com/lucky-sideburn/generic-distro-toolkit repo

Run start.sh and select “16) Provision an AARCH64 build node using Vagrant”

Run start.sh and create Jenkins folders:

0) Create Jenkins Folders

8) Build AARCH64 all Jenkins Jobs

9) Build AARCH64 cross_toolchain Jenkins Jobs

10) Build AARCH64 cross_compiling_temporary_tools Jenkins Jobs

11) Build AARCH64 chroot_and_building_additional_temporary_tools Jenkins Jobs

12) Build AARCH64 basic_system_software Jenkins Jobs

13) Build AARCH64 system_configuration Jenkins Jobs

14) Build AARCH64 containers Jenkins Jobs

Run Jenkins jobs in the order of the numbered folders and jobs.

Run start.sh and select 15) Start AARCH64 VM on QEMU to work on your GNU/Linux system.

Build AMD64 – GNU/Linux Operating System

Clone https://github.com/lucky-sideburn/generic-distro-toolkit repo

Run start.sh and select “17) Provision an AMD64 build node directly with Ansible”

Run start.sh and create Jenkins folders

0) Create Jenkins Folders

1) Build AMD64 all Jenkins Jobs

2) Build AMD64 cross_toolchain Jenkins Jobs

3) Build AMD64 cross_compiling_temporary_tools Jenkins Jobs

4) Build AMD64 chroot_and_building_additional_temporary_tools Jenkins Jobs

5) Build AMD64 basic_system_software Jenkins Jobs

6) Build AMD64 system_configuration Jenkins Jobs

7) Build AMD64 containers Jenkins Jobs

Run Jenkins jobs in the order of the numbered folders and jobs.

The job 0004 – Prepare System Image (System Configuration) will start the VMs, which can be monitored using Cockpit.

Wishing to build an ARM system, specifically AARCH64, I labeled a Jenkins slave as aarch64

In the definition of the jobs I will create automatically, I will therefore have an assignedNode set with the name of the chosen executor.

- name: "Create Jenkins Jobs - Cross Compiling Temporary Tools (aarch64)"
  ansible.builtin.uri:
    url: "{{ jenkins_url }}/job/aarch64_cross_compiling_temporary_tools/createItem?name={{ item.name | urlencode }}"
    method: POST
    user: "{{ jenkins_user }}"
    password: "{{ jenkins_token }}"
    force_basic_auth: yes
    status_code: 200
    headers:
      Content-Type: "application/xml"
    body: |
      <project>
        <actions/>
        <description>Jenkins job to execute a shell command</description>
        <keepDependencies>false</keepDependencies>
        <properties/>
        <scm class="hudson.scm.NullSCM"/>
        <canRoam>false</canRoam>
        <assignedNode>aarch64</assignedNode>
        <disabled>false</disabled>
        <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
        <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
        <triggers/>
        <concurrentBuild>false</concurrentBuild>
        <builders>
          <hudson.tasks.Shell>
        <command>{{ aarch64_common_build_start_command }}

      if [ -d "{{ item.source_dir | basename }}" ]; then
        rm -rf "{{ item.source_dir | basename }}"
      fi

      tar -xf "{{ item.archive_file | basename }}"

      cd "{{ item.source_dir | basename }}"
      
      pwd

      {{ item.build_command }}
        </command>
          </hudson.tasks.Shell>
        </builders>
        <publishers/>
        <buildWrappers/>
      </project>
    body_format: raw
    timeout: 60
  loop: "{{ jenkins_jobs.cross_compiling_temporary_tools }}"
  ignore_errors: yes
  tags:
    - aarch64_jobs
    - aarch64_cross_compiling_temporary_tools

Jobs are configured for AMD64 and AARCH64 system and are defined in terms for build command in a Ansible Vars file. For example:

    - name: 0009 - Grep (Cross Compiling Temporary Tools)
      version: 3.11
      archive_file: /mnt/lfs/sources/grep-3.11.tar.xz
      source_dir: /mnt/lfs/sources/grep-3.11
      description: |
        Grep is a command-line utility for searching plain-text data for lines that match a regular expression. This job builds Grep, which is essential for text searching in the LFS environment.
      category:
        This job is part of the cross compiling temporary tools setup, specifically for building Grep.
      jenkins_job_url: http://localhost:8080/job/cross_compiling_temporary_tools/job/Grep-3.11%20(Cross%20Compiling%20Temporary%20Tools)/
      build_command: |
        ./configure --prefix=/usr   \
                    --host=$LFS_TGT \
                    --build=$(./build-aux/config.guess)
        make
        make DESTDIR=$LFS install

Prepare to the chroot…

I would say that the most fundamental tool, and the one I use the most during these activities, is the following.

sudo chroot "$LFS" /usr/bin/env -i   \
    HOME=/root                  \
    TERM="$TERM"                \
    PS1='(lfs chroot) \u:\w\$ ' \
    PATH=/usr/bin:/usr/sbin     \
    MAKEFLAGS="-j$(nproc)"      \
    TESTSUITEFLAGS="-j$(nproc)" \
    /bin/bash


I place it with Ansible under Jenkins’ home directory...
- name: Copy chroot_lfs.sh to /home/jenkins
  ansible.builtin.copy:
    src: chroot_lfs.sh
    dest: /home/jenkins/chroot_lfs.sh
    owner: jenkins
    group: jenkins
    mode: '0755'

It will be very common to have to enter the chroot environment to see what is not working inside the distro we are building.

Execution version-check.sh

Here https://www.linuxfromscratch.org/lfs/view/stable/chapter02/hostreqs.html a bash script is provided to check the versions of the tools present on the initial system. Running it, I see that everything is fine except for an issue related to Bash itself.

root@ubuntu-arm-lfs:~# /tmp/version-check.sh
OK:    Coreutils 8.32   >= 8.1
OK:    Bash      5.1.16 >= 3.2
OK:    Binutils  2.38   >= 2.13.1
OK:    Bison     3.8.2  >= 2.7
OK:    Diffutils 3.8    >= 2.8.1
OK:    Findutils 4.8.0  >= 4.2.31
OK:    Gawk      5.1.0  >= 4.0.1
OK:    GCC       11.4.0 >= 5.2
OK:    GCC (C++) 11.4.0 >= 5.2
OK:    Grep      3.7    >= 2.5.1a
OK:    Gzip      1.10   >= 1.3.12
OK:    M4        1.4.18 >= 1.4.10
OK:    Make      4.3    >= 4.0
OK:    Patch     2.7.6  >= 2.5.4
OK:    Perl      5.34.0 >= 5.8.8
OK:    Python    3.10.12 >= 3.4
OK:    Sed       4.8    >= 4.1.5
OK:    Tar       1.34   >= 1.22
OK:    Texinfo   6.8    >= 5.0
OK:    Xz        5.2.5  >= 5.0.0
OK:    Linux Kernel 6.8.0 >= 5.4
OK:    Linux Kernel supports UNIX 98 PTY
Aliases:
OK:    awk  is GNU
OK:    yacc is Bison
ERROR: sh   is NOT Bash
Compiler check:
OK:    g++ works
OK: nproc reports 4 logical cores are available

To fix the error ERROR: sh is NOT Bash, I just need to force sh to point to bash. Do this only in your LFS machines.

ls -l /usr/bin/sh
ln /usr/bin/bash /usr/bin/sh

This should solve problems like the absence of pushd as a built-in in my bash interpreter.

The Server Environment

On the server side, I installed Ansible, Jenkins, Cockpit, and Libvirt.

In Jenkins, I created all the jobs needed to build the projects that are part of the GNU/Linux ecosystem using Ansible. They are defined in the vars of a role that you can find here: https://github.com/lucky-sideburn/Generic-Distro-ToolK1t/blob/main/jenkins-lfs/playbooks/roles/ansible-gdt/vars/main.yml

I am very satisfied with a simple bash script that wraps the playbooks to be called with the relevant tags. I use it for any modifications in the Jenkins folder and jobs or test OS image via QEMU.

ubuntu@ns3137793:~/gdt$ bash start.sh 

=========================================
 Welcome to the Generic Distro Toolkit! 
=========================================

Select an option:
0)  Create Jenkins Folders
1)  Build AMD64 all Jenkins Jobs
2)  Build AMD64 cross_toolchain Jenkins Jobs
3)  Build AMD64 cross_compiling_temporary_tools Jenkins Jobs
4)  Build AMD64 chroot_and_building_additional_temporary_tools Jenkins Jobs
5)  Build AMD64 basic_system_software Jenkins Jobs
6)  Build AMD64 system_configuration Jenkins Jobs
7)  Build AMD64 containers Jenkins Jobs
8)  Build AARCH64 all Jenkins Jobs
9)  Build AARCH64 cross_toolchain Jenkins Jobs
10) Build AARCH64 cross_compiling_temporary_tools Jenkins Jobs
11) Build AARCH64 chroot_and_building_additional_temporary_tools Jenkins Jobs
12) Build AARCH64 basic_system_software Jenkins Jobs
13) Build AARCH64 system_configuration Jenkins Jobs
14) Build AARCH64 containers Jenkins Jobs
15) Start AARCH64 VM on QEMU
16) Exit

Enter your choice:

Enter your choice: 9
Building AARCH64 cross_toolchain Jenkins Jobs...

On Cockpit, I test the newly created VMs from the images built through Jenkins.

On ARM (my MacBook M3), I don’t have Cockpit and KVM, so I will use QEMU.

The AARCH64 (ARM) build node

I’m using my work Apple MacBook Pro M3, on which I provisioned a VM via Vagrant. As you can see, the node is also a slave of my Jenkins, which I manually labeled as aarch64.

# Vagrantfile for Ubuntu ARM
Vagrant.configure("2") do |config|
  config.vm.box = "arm64-boxes/ubuntu-22.04"
  config.vm.box_version = "0.2"
  config.vm.hostname = "ubuntu-arm-lfs"
  config.vm.define "ubuntu-arm-lfs"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "12288"
    vb.cpus = 4
  end
  
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "./jenkins-lfs/playbooks/aarch64_lfs.yml"
    ansible.become = true

    ansible.extra_vars = {
      "jenkins_agent_jar" => "/opt/jenkins/agent/agent.jar",
      "jenkins_master_url" => "https://jenkins.garantideltalento.it",
      "jenkins_user" => "jenkins",  
      "jenkins_group" => "jenkins",
      "jenkins_agent_workdir" => "/opt/jenkins/workdir",
      "jenkins_agent_home" => "/opt/jenkins/home",
      "jenkins_agent_name" => "ubuntu-arm-lfs",
      "jenkins_agent_secret" => ENV['JENKINS_AGENT_SECRET'],
      "lfs_repo_url" => "http://repo.garantideltalento.it",
    }
  end

  config.vm.network "private_network", type: "dhcp"
end

I created a dedicated Ansible playbook to provision the node. It does very simple tasks and you can find it here: https://github.com/lucky-sideburn/Generic-Distro-ToolK1t/blob/main/jenkins-lfs/playbooks/roles/ansible-gdt/tasks/aarch64_lfs.yml

Basically, the tasks are very simple:

[foobar@MacBook-Pro-di-foobar-2.fritz.box]:~/WORK/Generic-Distro-ToolK1t $ vagrant provision
==> ubuntu-arm-lfs: Running provisioner: ansible...
    ubuntu-arm-lfs: Running ansible-playbook...

PLAY [Print node name] *********************************************************

TASK [Gathering Facts] *********************************************************
ok: [ubuntu-arm-lfs]

TASK [Display the node name] ***************************************************
ok: [ubuntu-arm-lfs]

TASK [Start arm_node.yml task of ansible-gdt role] *****************************

TASK [ansible-gdt : Show machine architecture] *********************************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Ensure user 'jenkins' exists] ******************************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Create Jenkins Workdir] ************************************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Create Jenkins Agent Home] *********************************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Create Jenkins Agent Workdir] ******************************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Update apt cache] ******************************************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Install Java] **********************************************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Copy agent.jar to Jenkins home] ****************************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Create SystemD unit for start Jenkins agent] ***************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Start and enable Jenkins agent service] ********************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Create /mnt/lfs directory] *********************************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Set LFS environment variable] ******************************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Set LFS environment variable for jenkins] ******************
changed: [ubuntu-arm-lfs]

TASK [ansible-gdt : Set LFS environment variable for root] *********************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Create /mnt/lfs/sources directory] *************************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Create directories under $LFS] *****************************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Create symbolic links for bin, lib, and sbin] **************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Create lib directory for ARM architecture] *****************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Create $LFS/tools directory] *******************************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Create 'lfs' group] ****************************************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Create 'lfs' user] *****************************************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Change ownership of lib for aarch64 architecture] **********
changed: [ubuntu-arm-lfs]

TASK [ansible-gdt : Configure environment variables for LFS] *******************
ok: [ubuntu-arm-lfs]

TASK [ansible-gdt : Configure environment variables for Jenkins] ***************
changed: [ubuntu-arm-lfs]

TASK [ansible-gdt : Install additional packages] *******************************

After I prepared the build node and joined it to my Jenkins server as an executor, it is time to create all Jenkins jobs via Ansible, and then run them in the specific order, following the numbered names.

Cross Tool Chain

aarch64_cross_toolchain - amd64_cross_toolchain
 └─0001 - Binutils Pass 1     (Cross Toolchain)
 └─0002 - GCC Pass 1          (Cross Toolchain)
 └─0003 - Linux API Headers   (Cross Toolchain)
 └─0004 - Glibc               (Cross Toolchain)
 └─0005 - Libstdc++ from GCC  (Cross Toolchain)

Cross Compiling Temporary Tools

aarch64_cross_compiling_temporary_tools - amd64_cross_compiling_temporary_tools
 └─0001 - M4              (Cross Compiling Temporary Tools)
 └─0002 - Ncurses         (Cross Compiling Temporary Tools)
 └─0003 - Bash            (Cross Compiling Temporary Tools)
 └─0004 - Coreutils       (Cross Compiling Temporary Tools)
 └─0005 - Diffutils       (Cross Compiling Temporary Tools)
 └─0006 - File            (Cross Compiling Temporary Tools)
 └─0007 - Findutils       (Cross Compiling Temporary Tools)
 └─0008 - Gawk            (Cross Compiling Temporary Tools)
 └─0009 - Grep            (Cross Compiling Temporary Tools)
 └─0010 - Gzip            (Cross Compiling Temporary Tools)
 └─0011 - Make            (Cross Compiling Temporary Tools)
 └─0012 - Patch           (Cross Compiling Temporary Tools)
 └─0013 - Sed             (Cross Compiling Temporary Tools)
 └─0014 - Tar             (Cross Compiling Temporary Tools)
 └─0015 - Xz              (Cross Compiling Temporary Tools)
 └─0016 - Binutils        (Cross Compiling Temporary Tools)
 └─0017 - GCC Pass 2      (Cross Compiling Temporary Tools)

Entering Chroot and Building Additional Temporary Tools


aarch64_chroot_and_building_additional_temporary_tools - amd64_chroot_and_building_additional_temporary_tools
 └─0001 - Changing Ownership and Preparing Virtual Kernel File Systems (Chroot and Building Additional Temporary Tools)
 └─0002 - Gettext                                                      (Chroot and Building Additional Temporary Tools)
 └─0003 - Bison                                                        (Chroot and Building Additional Temporary Tools)
 └─0004 - Perl                                                         (Chroot and Building Additional Temporary Tools)
 └─0005 - Python                                                       (Chroot and Building Additional Temporary Tools)
 └─0006 - Texinfo                                                      (Chroot and Building Additional Temporary Tools)
 └─0007 - Util-linux                                                   (Chroot and Building Additional Temporary Tools)
 └─0008 - Cleaning up and Saving the Temporary System                  (Chroot and Building Additional Temporary Tools)

Installing Basic System Software

aarch64_basic_system_software - amd64_basic_system_software
 └─0001 - Man-pages         (Basic System Software)
 └─0002 - Iana-Etc          (Basic System Software)
 └─0003 - Glibc             (Basic System Software)
 └─0004 - Zlib              (Basic System Software)
 └─0005 - Bzip2             (Basic System Software)
 └─0006 - Xz                (Basic System Software)
 └─0007 - Lz4               (Basic System Software)
 └─0008 - Zstd              (Basic System Software)
 └─0009 - File              (Basic System Software)
 └─0010 - Readline          (Basic System Software)
 └─0011 - M4                (Basic System Software)
 └─0012 - Bc                (Basic System Software)
 └─0013 - Flex              (Basic System Software)
 └─0014 - Tcl               (Basic System Software)
 └─0015 - Expect            (Basic System Software)
 └─0016 - DejaGNU           (Basic System Software)
 └─0017 - Pkgconf           (Basic System Software)
 └─0017A - pkg-config       (Basic System Software)
 └─0018 - Binutils          (Basic System Software)
 └─0019 - GMP               (Basic System Software)
 └─0020 - MPFR              (Basic System Software)
 └─0021 - MPC               (Basic System Software)
 └─0022 - Attr              (Basic System Software)
 └─0023 - Acl               (Basic System Software)
 └─0024 - Libcap            (Basic System Software)
 └─0025 - Libxcrypt-4.4.38  (Basic System Software)
 └─0026 - Shadow            (Basic System Software)
 └─0027 - GCC               (Basic System Software)
 └─0028 - Ncurses           (Basic System Software)
 └─0029 - Sed               (Basic System Software)
 └─0030 - Psmisc            (Basic System Software)
 └─0031 - Gettext           (Basic System Software)
 └─0032 - Bison             (Basic System Software)
 └─0033 - Grep              (Basic System Software)
 └─0034 - Bash-5.2.37       (Basic System Software)
 └─0035 - Libtool           (Basic System Software)
 └─0036 - GDBM              (Basic System Software)
 └─0037 - Gperf             (Basic System Software)
 └─0038 - Expat             (Basic System Software)
 └─0039 - Inetutils         (Basic System Software)
 └─0040 - Less              (Basic System Software)
 └─0041 - Perl              (Basic System Software)
 └─0042 - XML Parser        (Basic System Software)
 └─0043 - Intltool          (Basic System Software)
 └─0044 - Autoconf          (Basic System Software)
 └─0045 - Automake          (Basic System Software)
 └─0046 - OpenSSL           (Basic System Software)
 └─0047 - Libelf            (Basic System Software)
 └─0048 - Libffi            (Basic System Software)
 └─0049 - Python            (Basic System Software)
 └─0050 - Flit-Core         (Basic System Software)
 └─0051 - Wheel             (Basic System Software)
 └─0052 - Setuptools        (Basic System Software)
 └─0053 - Ninja             (Basic System Software)
 └─0054 - Meson             (Basic System Software)
 └─0055 - Kmod              (Basic System Software)
 └─0056 - Coreutils         (Basic System Software)
 └─0057 - Check             (Basic System Software)
 └─0058 - Diffutils         (Basic System Software)
 └─0059 - Gawk              (Basic System Software)
 └─0060 - Findutils         (Basic System Software)
 └─0061 - Groff             (Basic System Software)
 └─0062 - GRUB              (Basic System Software)
 └─0063 - Gzip              (Basic System Software)
 └─0064 - IPRoute2          (Basic System Software)
 └─0065 - Kbd               (Basic System Software)
 └─0066 - Libpipeline       (Basic System Software)
 └─0067 - Make              (Basic System Software)
 └─0068 - Patch             (Basic System Software)
 └─0069 - Tar               (Basic System Software)
 └─0070 - Texinfo           (Basic System Software)
 └─0071 - Vim               (Basic System Software)
 └─0072 - MarkupSafe        (Basic System Software)
 └─0073 - Jinja2            (Basic System Software)
 └─0074 - Udev from Systemd (Basic System Software)
 └─0075 - Man-DB            (Basic System Software)
 └─0076 - Procps-ng         (Basic System Software)
 └─0077 - Util-linux        (Basic System Software)
 └─0078 - E2fsprogs         (Basic System Software)
 └─0079 - Sysklogd          (Basic System Software)
 └─0080 - SysVinit          (Basic System Software)
 └─0081 - openssh           (Basic System Software)
 └─0082 - Stripping         (Basic System Software)
 └─0083 - Cleaning Up       (Basic System Software)

System Configuration

This set of Jenkins jobs automates the complete system configuration and image preparation process. It includes setting up LFS and optional BLFS boot scripts, configuring the core Linux system components, and creating a ready-to-use system image. Together, these jobs ensure a fully configured, functional, and deployable operating system.

Run OS via qemu-system-aarch64

For troubleshooting my operating system (in case of a broken boot, filesystem, or configuration problem), I used the following strategy:

During the image preparation, I create lfs.img as well as lfs-clone.img, which is a clone, as suggested by the name. I run an Alpine Linux live instance to mount the image of the OS that I built.

  qemu-system-aarch64 \
      -M virt \
      -cpu host \
      -accel hvf \
      -smp 2 \
      -m 2048 \
      -drive file=$OS_IMAGE_BASE_DIR/alpine.iso,if=virtio,media=cdrom \
      -drive file=$OS_IMAGE_BASE_DIR/lfs-clone.qcow2,if=virtio,format=qcow2 \
      -netdev user,id=net0,hostfwd=tcp::2222-:22 \
      -device virtio-net-device,netdev=net0 \
      -device virtio-gpu-pci \
      -device usb-ehci \
      -device usb-kbd \
      -display cocoa \
      -bios /opt/homebrew/Cellar/qemu/10.0.3/share/qemu/edk2-aarch64-code.fd \
      -serial mon:stdio \
      -boot d

This permits me to mount the disk and check if everything is fine

Welcome to Alpine Linux 3.22
Kernel 6.12.38-0-lts on aarch64 (/dev/ttyAMA0)

localhost login: root
Welcome to Alpine!

The Alpine Wiki contains a large amount of how-to guides and general
information about administrating Alpine systems.
See <https://wiki.alpinelinux.org/>.

You can setup the system with the command: setup-alpine

You may change this message by editing /etc/motd.

localhost:~# mount /dev/vdb
vdb   vdb1  vdb2
localhost:~# mount /dev/vdb2  /mnt/
localhost:~# ls /mnt/
bin         home        mnt         right       srv         var
boot        lib         opt         root        sys
dev         lost+found  posix       run         tmp
etc         media       proc        sbin        usr
localhost:~# 

After checking everything, I can start my image

  # echo "Starting the AARCH64 VM with the LFS image..."
  qemu-system-aarch64 \
      -M virt \
      -cpu host \
      -accel hvf \
      -smp 2 \
      -m 2048 \
      -drive file=$OS_IMAGE_BASE_DIR/lfs.qcow2,if=virtio,format=qcow2 \
      -netdev user,id=net0,hostfwd=tcp::2222-:22 \
      -device virtio-net-device,netdev=net0 \
      -device virtio-gpu-pci \
      -device usb-ehci \
      -device usb-kbd \
      -display cocoa \
      -bios /opt/homebrew/Cellar/qemu/10.0.3/share/qemu/edk2-aarch64-code.fd \
      -serial mon:stdio \
      -boot c
EFI stub: Booting Linux Kernel...
EFI stub: EFI_RNG_PROTOCOL unavailable
EFI stub: Generating empty DTB
EFI stub: Exiting boot services...
[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x610f0000]
[    0.000000] Linux version 6.13.4 (root@ubuntu-arm-lfs) (gcc (GCC) 14.2.0, GNU ld (GNU Binutils) 2.44) #1 SMP PREEMPT Fri Aug 15 21:55:14 UTC 2025
[    0.000000] KASLR disabled due to lack of seed
[    0.000000] efi: EFI v2.7 by EDK II
[    0.000000] efi: SMBIOS 3.0=0xbfed0000 MEMATTR=0xbef84018 ACPI 2.0=0xbcb43018 MEMRESERVE=0xbc696e98 
[    0.000000] ACPI: Early table checksum verification disabled
[    0.000000] ACPI: RSDP 0x00000000BCB43018 000024 (v02 BOCHS )
[    0.000000] ACPI: XSDT 0x00000000BCB43F18 00006C (v01 BOCHS  BXPC     00000001      01000013)
[    0.000000] ACPI: FACP 0x00000000BCB43B18 000114 (v06 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.000000] ACPI: DSDT 0x00000000BCB41018 001468 (v02 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.000000] ACPI: APIC 0x00000000BCB43C98 0000FC (v04 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.000000] ACPI: PPTT 0x00000000BCB43E18 000060 (v02 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.000000] ACPI: GTDT 0x00000000BCB43098 000068 (v03 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.000000] ACPI: MCFG 0x00000000BCB43A98 00003C (v01 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.000000] ACPI: SPCR 0x00000000BCB43818 000050 (v02 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.000000] ACPI: DBG2 0x00000000BCB43A18 000057 (v00 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.000000] ACPI: IORT 0x00000000BCB43898 000080 (v03 BOCHS  BXPC     00000001 BXPC 00000001)
[    0.000000] ACPI: BGRT 0x00000000BCB43998 000038 (v01 INTEL  EDK2     00000002      01000013)
[    0.000000] ACPI: SPCR: console: pl011,mmio32,0x9000000,9600
[    0.000000] ACPI: Use ACPI SPCR as default console: Yes
[    0.000000] NUMA: Faking a node at [mem 0x0000000040000000-0x00000000bfffffff]
[    0.000000] NODE_DATA(0) allocated [mem 0xbfa589c0-0xbfa5afff]
[    0.000000] Zone ranges:
[    0.000000]   DMA      [mem 0x0000000040000000-0x00000000bfffffff]
[    0.000000]   DMA32    empty
[    0.000000]   Normal   empty
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000040000000-0x00000000bc55ffff]
[    0.000000]   node   0: [mem 0x00000000bc560000-0x00000000bc56ffff]
[    0.000000]   node   0: [mem 0x00000000bc570000-0x00000000bc67ffff]
[    0.000000]   node   0: [mem 0x00000000bc680000-0x00000000bc68ffff]
[    0.000000]   node   0: [mem 0x00000000bc690000-0x00000000bc76ffff]
[    0.000000]   node   0: [mem 0x00000000bc770000-0x00000000bcb3ffff]
[    0.000000]   node   0: [mem 0x00000000bcb40000-0x00000000bfe1ffff]
[    0.000000]   node   0: [mem 0x00000000bfe20000-0x00000000bfeaffff]
[    0.000000]   node   0: [mem 0x00000000bfeb0000-0x00000000bfebffff]
[    0.000000]   node   0: [mem 0x00000000bfec0000-0x00000000bffdffff]
[    0.000000]   node   0: [mem 0x00000000bffe0000-0x00000000bfffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000040000000-0x00000000bfffffff]
[    0.000000] cma: Reserved 32 MiB at 0x00000000ba400000 on node -1
[    0.000000] psci: probing for conduit method from ACPI.
[    0.000000] psci: PSCIv1.1 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: Trusted OS migration not required
[    0.000000] psci: SMC Calling Convention v1.0
[    0.000000] percpu: Embedded 23 pages/cpu s54552 r8192 d31464 u94208
[    0.000000] pcpu-alloc: s54552 r8192 d31464 u94208 alloc=23*4096
[    0.000000] pcpu-alloc: [0] 0 [0] 1 
[    0.000000] Detected PIPT I-cache on CPU0
[    0.000000] CPU features: detected: Spectre-v4
[    0.000000] alternatives: applying boot alternatives
[    0.000000] Kernel command line: BOOT_IMAGE=/vmlinuz-6.13.4-lfs-12.3 root=/dev/vda2 ro console=ttyAMA0 nomodeset debug earlyprintk=efi,keep
[    0.000000] Booted with the nomodeset parameter. Only the system framebuffer will be available
[    0.000000] Unknown kernel command line parameters "BOOT_IMAGE=/vmlinuz-6.13.4-lfs-12.3 earlyprintk=efi,keep", will be passed to user space.
[    0.000000] printk: log buffer data + meta data: 131072 + 458752 = 589824 bytes
[    0.000000] Dentry cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[    0.000000] Inode-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
[    0.000000] Fallback order for Node 0: 0 
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 524288
[    0.000000] Policy zone: DMA
[    0.000000] mem auto-init: stack:all(zero), heap alloc:off, heap free:off
[    0.000000] software IO TLB: SWIOTLB bounce buffer size adjusted to 2MB
[    0.000000] software IO TLB: area num 2.
[    0.000000] software IO TLB: mapped [mem 0x00000000bf514000-0x00000000bf714000] (2MB)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=2, Nodes=1
[    0.000000] rcu: Preemptible hierarchical RCU implementation.
[    0.000000] rcu: 	RCU event tracing is enabled.
[    0.000000] rcu: 	RCU restricting CPUs from NR_CPUS=512 to nr_cpu_ids=2.
[    0.000000] 	Trampoline variant of Tasks RCU enabled.
[    0.000000] 	Tracing variant of Tasks RCU enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=2
[    0.000000] RCU Tasks: Setting shift to 1 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=2.
[    0.000000] RCU Tasks Trace: Setting shift to 1 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=2.
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] Root IRQ handler: gic_handle_irq
[    0.000000] GICv2m: ACPI overriding V2M MSI_TYPER (base:80, num:64)
[    0.000000] GICv2m: range[mem 0x08020000-0x08020fff], SPI[80:143]
[    0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
[    0.000000] arch_timer: cp15 timer(s) running at 24.00MHz (virt).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
[    0.000000] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
[    0.000029] Console: colour dummy device 80x25
[    0.000038] ACPI: Core revision 20240827
[    0.000057] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=96000)
[    0.000058] pid_max: default: 32768 minimum: 301
[    0.000065] LSM: initializing lsm=capability
[    0.000093] Mount-cache hash table entries: 4096 (order: 3, 32768 bytes, linear)
[    0.000099] Mountpoint-cache hash table entries: 4096 (order: 3, 32768 bytes, linear)
[    0.029540] rcu: Hierarchical SRCU implementation.
[    0.029541] rcu: 	Max phase no-delay instances is 1000.
[    0.029584] Timer migration: 1 hierarchy levels; 8 children per group; 1 crossnode level
[    0.029620] Remapping and enabling EFI services.
[    0.029700] smp: Bringing up secondary CPUs ...
[    0.029913] Detected PIPT I-cache on CPU1
[    0.029968] CPU1: Booted secondary processor 0x0000000001 [0x610f0000]
[    0.030048] smp: Brought up 1 node, 2 CPUs
[    0.030049] SMP: Total of 2 processors activated.
[    0.030050] CPU: All CPU(s) started at EL1
[    0.030050] CPU features: detected: ARMv8.4 Translation Table Level
[    0.030051] CPU features: detected: Data cache clean to the PoU not required for I/D coherence
[    0.030052] CPU features: detected: Common not Private translations
[    0.030052] CPU features: detected: CRC32 instructions
[    0.030052] CPU features: detected: Data independent timing control (DIT)
[    0.030052] CPU features: detected: E0PD
[    0.030053] CPU features: detected: Enhanced Privileged Access Never
[    0.030053] CPU features: detected: RCpc load-acquire (LDAPR)
[    0.030053] CPU features: detected: LSE atomic instructions
[    0.030054] CPU features: detected: Privileged Access Never
[    0.030054] CPU features: detected: RAS Extension Support
[    0.030054] CPU features: detected: Speculation barrier (SB)
[    0.030054] CPU features: detected: TLB range maintenance instructions
[    0.030088] alternatives: applying system-wide alternatives
[    0.030265] Memory: 1975484K/2097152K available (16832K kernel code, 4874K rwdata, 11828K rodata, 2816K init, 738K bss, 85280K reserved, 32768K cma-reserved)
[    0.030435] devtmpfs: initialized
[    0.030636] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[    0.030637] futex hash table entries: 512 (order: 3, 32768 bytes, linear)
[    0.030689] 23440 pages in range for non-PLT usage
[    0.030690] 514960 pages in range for PLT usage
[    0.030702] pinctrl core: initialized pinctrl subsystem
[    0.030868] SMBIOS 3.0.0 present.
[    0.030870] DMI: QEMU QEMU Virtual Machine, BIOS edk2-stable202408-prebuilt.qemu.org 08/13/2024
[    0.030872] DMI: Memory slots populated: 1/1
[    0.031591] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[    0.031717] DMA: preallocated 256 KiB GFP_KERNEL pool for atomic allocations
[    0.031768] DMA: preallocated 256 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
[    0.031841] DMA: preallocated 256 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[    0.031846] audit: initializing netlink subsys (disabled)
[    0.031914] audit: type=2000 audit(0.000:1): state=initialized audit_enabled=0 res=1
[    0.031980] thermal_sys: Registered thermal governor 'step_wise'
[    0.031980] thermal_sys: Registered thermal governor 'power_allocator'
[    0.031986] cpuidle: using governor menu
[    0.032002] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
[    0.032042] ASID allocator initialised with 256 entries
[    0.032185] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
[    0.032226] Serial: AMBA PL011 UART driver
[    0.032401] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
[    0.032402] HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
[    0.032402] HugeTLB: registered 32.0 MiB page size, pre-allocated 0 pages
[    0.032402] HugeTLB: 0 KiB vmemmap can be freed for a 32.0 MiB page
[    0.032403] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
[    0.032403] HugeTLB: 0 KiB vmemmap can be freed for a 2.00 MiB page
[    0.032403] HugeTLB: registered 64.0 KiB page size, pre-allocated 0 pages
[    0.032403] HugeTLB: 0 KiB vmemmap can be freed for a 64.0 KiB page
[    0.032691] ACPI: Added _OSI(Module Device)
[    0.032691] ACPI: Added _OSI(Processor Device)
[    0.032692] ACPI: Added _OSI(3.0 _SCP Extensions)
[    0.032692] ACPI: Added _OSI(Processor Aggregator Device)
[    0.032883] ACPI: 1 ACPI AML tables successfully acquired and loaded
[    0.032925] ACPI: Interpreter enabled
[    0.032925] ACPI: Using GIC for interrupt routing
[    0.032928] ACPI: MCFG table detected, 1 entries
[    0.033347] ACPI: CPU0 has been hot-added
[    0.033356] ACPI: CPU1 has been hot-added
[    0.033401] ARMH0011:00: ttyAMA0 at MMIO 0x9000000 (irq = 12, base_baud = 0) is a SBSA
[    0.033403] printk: legacy console [ttyAMA0] enabled
[    0.058298] ACPI: PCI: Interrupt link L000 configured for IRQ 35
[    0.058461] ACPI: PCI: Interrupt link L001 configured for IRQ 36
[    0.058610] ACPI: PCI: Interrupt link L002 configured for IRQ 37
[    0.058757] ACPI: PCI: Interrupt link L003 configured for IRQ 38
[    0.058907] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
[    0.059063] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI HPX-Type3]
[    0.059298] acpi PNP0A08:00: _OSC: platform does not support [LTR]
[    0.059467] acpi PNP0A08:00: _OSC: OS now controls [PME AER PCIeCapability]
[    0.059688] acpi PNP0A08:00: ECAM area [mem 0x4010000000-0x401fffffff] reserved by PNP0C02:00
[    0.059903] acpi PNP0A08:00: ECAM at [mem 0x4010000000-0x401fffffff] for [bus 00-ff]
[    0.060094] ACPI: Remapped I/O 0x000000003eff0000 to [io  0x0000-0xffff window]
[    0.060291] PCI host bridge to bus 0000:00
[    0.060396] pci_bus 0000:00: root bus resource [mem 0x10000000-0x3efeffff window]
[    0.060576] pci_bus 0000:00: root bus resource [io  0x0000-0xffff window]
[    0.060746] pci_bus 0000:00: root bus resource [mem 0x8000000000-0xffffffffff window]
[    0.060938] pci_bus 0000:00: root bus resource [bus 00-ff]
[    0.061091] pci 0000:00:00.0: [1b36:0008] type 00 class 0x060000 conventional PCI endpoint
[    0.061367] pci 0000:00:01.0: [1af4:1050] type 00 class 0x038000 conventional PCI endpoint
[    0.062027] pci 0000:00:01.0: BAR 1 [mem 0x10002000-0x10002fff]
[    0.062760] pci 0000:00:01.0: BAR 4 [mem 0x8000000000-0x8000003fff 64bit pref]
[    0.063227] pci 0000:00:02.0: [8086:24cd] type 00 class 0x0c0320 conventional PCI endpoint
[    0.063542] pci 0000:00:02.0: BAR 0 [mem 0x10001000-0x10001fff]
[    0.064318] pci 0000:00:03.0: [1af4:1001] type 00 class 0x010000 conventional PCI endpoint
[    0.064632] pci 0000:00:03.0: BAR 0 [io  0x0000-0x007f]
[    0.064868] pci 0000:00:03.0: BAR 1 [mem 0x10000000-0x10000fff]
[    0.065310] pci 0000:00:03.0: BAR 4 [mem 0x8000004000-0x8000007fff 64bit pref]
[    0.065689] pci 0000:00:01.0: BAR 4 [mem 0x8000000000-0x8000003fff 64bit pref]: assigned
[    0.066077] pci 0000:00:03.0: BAR 4 [mem 0x8000004000-0x8000007fff 64bit pref]: assigned
[    0.066283] pci 0000:00:01.0: BAR 1 [mem 0x10000000-0x10000fff]: assigned
[    0.066599] pci 0000:00:02.0: BAR 0 [mem 0x10001000-0x10001fff]: assigned
[    0.066769] pci 0000:00:03.0: BAR 1 [mem 0x10002000-0x10002fff]: assigned
[    0.066943] pci 0000:00:03.0: BAR 0 [io  0x1000-0x107f]: assigned
[    0.067201] pci_bus 0000:00: resource 4 [mem 0x10000000-0x3efeffff window]
[    0.067367] pci_bus 0000:00: resource 5 [io  0x0000-0xffff window]
[    0.067519] pci_bus 0000:00: resource 6 [mem 0x8000000000-0xffffffffff window]
[    0.068087] iommu: Default domain type: Translated
[    0.068242] iommu: DMA domain TLB invalidation policy: strict mode
[    0.068487] SCSI subsystem initialized
[    0.068679] libata version 3.00 loaded.
[    0.068895] ACPI: bus type USB registered
[    0.069000] usbcore: registered new interface driver usbfs
[    0.069138] usbcore: registered new interface driver hub
[    0.069276] usbcore: registered new device driver usb
[    0.069434] pps_core: LinuxPPS API ver. 1 registered
[    0.069571] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    0.069810] PTP clock support registered
[    0.069924] EDAC MC: Ver: 3.0.0
[    0.070617] scmi_core: SCMI protocol bus registered
[    0.070833] efivars: Registered efivars operations
[    0.071109] FPGA manager framework
[    0.071261] Advanced Linux Sound Architecture Driver Initialized.
[    0.071644] vgaarb: loaded
[    0.071863] clocksource: Switched to clocksource arch_sys_counter
[    0.072074] VFS: Disk quotas dquot_6.6.0
[    0.072178] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    0.072405] pnp: PnP ACPI init
[    0.072509] system 00:00: [mem 0x4010000000-0x401fffffff window] could not be reserved
[    0.072716] pnp: PnP ACPI: found 1 devices
[    0.078669] NET: Registered PF_INET protocol family
[    0.078956] IP idents hash table entries: 32768 (order: 6, 262144 bytes, linear)
[    0.079485] tcp_listen_portaddr_hash hash table entries: 1024 (order: 2, 16384 bytes, linear)
[    0.080003] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[    0.080216] TCP established hash table entries: 16384 (order: 5, 131072 bytes, linear)
[    0.080435] TCP bind hash table entries: 16384 (order: 7, 524288 bytes, linear)
[    0.080723] TCP: Hash tables configured (established 16384 bind 16384)
[    0.080932] UDP hash table entries: 1024 (order: 4, 65536 bytes, linear)
[    0.081118] UDP-Lite hash table entries: 1024 (order: 4, 65536 bytes, linear)
[    0.081342] NET: Registered PF_UNIX/PF_LOCAL protocol family
[    0.081679] RPC: Registered named UNIX socket transport module.
[    0.081831] RPC: Registered udp transport module.
[    0.081948] RPC: Registered tcp transport module.
[    0.082067] RPC: Registered tcp-with-tls transport module.
[    0.082205] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.082446] PCI: CLS 0 bytes, default 64
[    0.082813] Initialise system trusted keyrings
[    0.083041] workingset: timestamp_bits=42 max_order=19 bucket_order=0
[    0.083255] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.083506] NFS: Registering the id_resolver key type
[    0.083708] Key type id_resolver registered
[    0.083954] Key type id_legacy registered
[    0.084085] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[    0.084254] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
[    0.084490] 9p: Installing v9fs 9p2000 file system support
[    0.090011] Key type asymmetric registered
[    0.090115] Asymmetric key parser 'x509' registered
[    0.090250] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 245)
[    0.090441] io scheduler mq-deadline registered
[    0.090555] io scheduler kyber registered
[    0.090659] io scheduler bfq registered
[    0.091238] ledtrig-cpu: registered to indicate activity on CPUs
[    0.091712] input: Power Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input0
[    0.092066] ACPI: button: Power Button [PWRB]
[    0.096215] ACPI: \_SB_.L001: Enabled at IRQ 36
[    0.096889] ACPI: \_SB_.L003: Enabled at IRQ 38
[    0.097004] virtio-pci 0000:00:03.0: enabling device (0005 -> 0007)
[    0.099091] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[    0.099820] msm_serial: driver initialized
[    0.100120] SuperH (H)SCI(F) driver initialized
[    0.100244] STM32 USART driver initialized
[    0.101242] loop: module loaded
[    0.101376] virtio_blk virtio2: 2/0/0 default/read/poll queues
[    0.101732] virtio_blk virtio2: [vda] 52428800 512-byte logical blocks (26.8 GB/25.0 GiB)
[    0.102671]  vda: vda1 vda2
[    0.102960] megasas: 07.727.03.00-rc1
[    0.103498] tun: Universal TUN/TAP device driver, 1.6
[    0.104054] thunder_xcv, ver 1.0
[    0.104138] thunder_bgx, ver 1.0
[    0.104218] nicpf, ver 1.0
[    0.104367] hns3: Hisilicon Ethernet Network Driver for Hip08 Family - version
[    0.104545] hns3: Copyright (c) 2017 Huawei Corporation.
[    0.104676] hclge is initializing
[    0.104758] e1000: Intel(R) PRO/1000 Network Driver
[    0.104876] e1000: Copyright (c) 1999-2006 Intel Corporation.
[    0.105025] e1000e: Intel(R) PRO/1000 Network Driver
[    0.105151] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[    0.105309] igb: Intel(R) Gigabit Ethernet Network Driver
[    0.105452] igb: Copyright (c) 2007-2014 Intel Corporation.
[    0.105600] igbvf: Intel(R) Gigabit Virtual Function Network Driver
[    0.105764] igbvf: Copyright (c) 2009 - 2012 Intel Corporation.
[    0.105939] sky2: driver version 1.30
[    0.106389] VFIO - User Level meta-driver version: 0.3
[    0.106971] usbcore: registered new interface driver usb-storage
[    0.107055] ehci-pci 0000:00:02.0: EHCI Host Controller
[    0.107368] ehci-pci 0000:00:02.0: new USB bus registered, assigned bus number 1
[    0.108057] ehci-pci 0000:00:02.0: irq 46, io mem 0x10001000
[    0.111606] rtc-efi rtc-efi.0: registered as rtc0
[    0.111995] rtc-efi rtc-efi.0: setting system clock to 2025-08-18T12:58:55 UTC (1755521935)
[    0.112273] i2c_dev: i2c /dev entries driver
[    0.112834] sdhci: Secure Digital Host Controller Interface driver
[    0.112987] sdhci: Copyright(c) Pierre Ossman
[    0.113142] Synopsys Designware Multimedia Card Interface Driver
[    0.113353] sdhci-pltfm: SDHCI platform and OF driver helper
[    0.113642] pstore: Using crash dump compression: deflate
[    0.113776] pstore: Registered efi_pstore as persistent store backend
[    0.114064] usbcore: registered new interface driver usbhid
[    0.114262] usbhid: USB HID core driver
[    0.115006] NET: Registered PF_PACKET protocol family
[    0.115205] 9pnet: Installing 9P2000 support
[    0.115376] Key type dns_resolver registered
[    0.116210] registered taskstats version 1
[    0.116334] Loading compiled-in X.509 certificates
[    0.117012] Demotion targets for Node 0: null
[    0.117233] clk: Disabling unused clocks
[    0.117332] PM: genpd: Disabling unused power domains
[    0.117458] ALSA device list:
[    0.117537]   No soundcards found.
[    0.120423] ehci-pci 0000:00:02.0: USB 2.0 started, EHCI 1.00
[    0.120654] hub 1-0:1.0: USB hub found
[    0.120749] hub 1-0:1.0: 6 ports detected
[    0.121876] EXT4-fs (vda2): mounted filesystem df86d824-3058-48bd-9515-24ac42491dc6 ro with ordered data mode. Quota mode: none.
[    0.122316] VFS: Mounted root (ext4 filesystem) readonly on device 254:2.
[    0.123100] devtmpfs: mounted
[    0.123527] Freeing unused kernel memory: 2816K
[    0.123736] Run /sbin/init as init process
[    0.123910]   with arguments:
[    0.123983]     /sbin/init
[    0.124050]   with environment:
[    0.124128]     HOME=/
[    0.124186]     TERM=linux
[    0.124253]     BOOT_IMAGE=/vmlinuz-6.13.4-lfs-12.3
[    0.124372]     earlyprintk=efi,keep
INIT: version 3.14 booting
  *   Mounting virtual file systems: /run /proc /sys /dev/shm /sys/fs/c[  OK  ]   
  *   Create symlinks in /dev targeting /proc: /dev/stdin /dev/stdout /[  OK  ]rr /dev/fd      
  *   Bringing up the loopback interface...                            [  OK  ]
      Setting hostname to # Hostname configuration
# This file is written and managed by Ansible of Generic Distro Toolkit
  *   ...                                                              [  OK  ]
      Populating /dev with device nodes... [    0.197662] udevd[177]: Starting systemd-udevd version 257.3
[    0.198802] udevd[178]: Using default interface naming scheme 'v257'.
[    0.371879] usb 1-1: new high-speed USB device number 2 using ehci-pci
[    0.530167] input: QEMU QEMU USB Keyboard as /devices/pci0000:00/0000:00:02.0/usb1/1-1/1-1:1.0/0003:0627:0001.0001/input/input1
[    0.655926] hid-generic 0003:0627:0001.0001: input: USB HID v1.11 Keyboard [QEMU QEMU USB Keyboard] on usb-0000:00:02.0-1/input0
  *                                                                    [  OK  ]
  *   Activating all swap files/partitions...                          [  OK  ]
      Mounting root file system in read-only mode... [    1.232877] EXT4-fs (vda2): re-mounted df86d824-3058-48bd-9515-24ac42491dc6 ro. Quota mode: none.
  *                                                                    [  OK  ]
  *   Checking file systems...                                         [  OK  ]
      Remounting root file system in read-write mode...[    1.247071] EXT4-fs (vda2): re-mounted df86d824-3058-48bd-9515-24ac42491dc6 r/w. Quota mode: none.
  *                                                                    [  OK  ]
  *   Mounting remaining file systems...                               [  OK  ]
  *   Cleaning file systems: /tmp                                      [  OK  ]
  *   Retrying failed uevents, if any...                               [  OK  ]
  *   Setting kernel runtime parameters...                             [  OK  ]
INIT: Entering runlevel: 3
  *   Starting system log daemon...                                    [  OK  ]

devbox-aarch4 login: root
Password: 
No mail.
-bash-5.2# 
-bash-5.2# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
    altname enx525400123456
-bash-5.2# 
-bash-5.2# echo "test"
test
-bash-5.2# uname -a
Linux 0xHrtz 6.13.4 #1 SMP PREEMPT Fri Aug 15 21:55:14 UTC 2025 aarch64 GNU/Linux
-bash-5.2# uname -n
devbox-aarch4
-bash-5.2# uname -m
aarch64
-bash-5.2# uname -a
Linux devbox-aarch4 6.13.4 #1 SMP PREEMPT Fri Aug 15 21:55:14 UTC 2025 aarch64 GNU/Linux