uBoot PXE VIM3 Install

Hello, I have a VIM3-Pro I am evaluating as a pixel streaming thin client for a few hundred crew-stations. My goal is to demonstrate an automated and scalable eMMC Manjaro install solution. Khadas’s documentation on PXE booting a uImage or zImage Kernel from the uBoot environment appears to be a viable option for this use-case.

I have read the Manjaro VIM3 install script and a Manjaro forum post on installing Manjaro to an SD card but ruled these install methods out, as they do not seem scale well. This ArchLinux ARM blog post by yschandra explaining how to build and prepare a uImage, uInitramfs, dtb file for uBoot is the most promising method I have found for scalable install. I have cloned the Linux Kernel Source, downloaded the Manjaro ARM rootfs and I believe I have everything required to build the kernel files, initram, dtb and rootfs.

Before I mess up my board’s eMMC I was wondering if there is a recommended approach for testing a uBoot install. I have experience with booting x86_64 kernel images in QEMU using the PVH entry point, but I have never attempted to to boot kernel images with uBoot in qemu like so:

qemu-system-aarch64 -machine virt -cpu cortex-a73 -bios u-boot.bin

My two questions are is running uBoot in QEMU the recommended approach for testing a uBoot install, and are there any other eMMC Manjaro install methods I may have missed or that I should reconsider?

This is an interesting thread, I hope more comes of it.

When you say “scalable install”, can you clarify that some? Do you mean scale the installation process for hundreds of clients or an installation that can scale to serve hundreds of clients?

I realize that the PXE uBoot install has its limitations and there may not be a method for kicking off a script to configure the uBoot environmental variables without a serial connection . The automated install process is less of a concern in this post. When I say scalable install I would like the install to serve hundreds of clients. This may mean manually provisioning each client’s uBoot into a PXE boot state, but from then on I would like to be able to:

  1. Send a Wake on LAN (client begins in powered off state)
  2. Set IP address via DHCP
  3. Client installs a fresh image from PXE server
  4. System configuration with Ansible
  5. When pixel streaming concludes, client powers off
  6. Repeat (weeks or months later)

I have a little different situation, where the plan is have hundreds of RPi4. The route I am taking is to use a read-only nfsroot with a systemd overlayfs to make a psudo writeable root. Just one image to maintain (or however many copies are needed to handle the load) and I have one RPi4 that can mount the image read-write for updating and configuration modifications. This can even be done on the fly, depending on the changes required.

Overlayfs with nfsroot is an interesting concept for managing a single source of truth. Where I work we try to deploy rootless containers with podman and systemd as much as possible. Our DevOps foo is not at the maturity level where we are comfortable deploying rootless containers with fuse-overlayfs quite yet. I wish you luck on your project. That would be a spectacular feat to scale the configuration of hundreds of RPi4s with a single RPi4 VFS.