SkillAgentSearch skills...

OrangePi5Pro

Ubuntu 26.04 (Resolute) for the Orange Pi 5 Pro / RK3588S — mainline kernel with it all working: Mali-G610 GPU + Vulkan (PanVK), RK3588 NPU on all 3 cores (multi-core, 800 MHz DVFS, ~558 inf/s), HW video decode (VA-API), and KDE Plasma. Prebuilt images + Armbian build recipe.

Install / Use

npx skills add mack42/OrangePi5Pro

Installs into whichever agent you are using.

README

Ubuntu 26.04 on Orange Pi 5 Pro

A working recipe to build and run Ubuntu 26.04 LTS (Resolute Raccoon) on the Orange Pi 5 Pro (Rockchip RK3588S), using Armbian's build framework with the mainline (current) Linux kernel for working GPU acceleration.

Currently there is no off-the-shelf 26.04 image for this board. Joshua Riek's ubuntu-rockchip was archived on 29 April 2026, Armbian's downloads page for the 5 Pro only ships Debian Trixie, and Orange Pi's official downloads top out at 24.04. So we build it ourselves.

Just want the image?

Skip everything below and grab a prebuilt 26.04 image from the latest release page:

  • *_desktop.img.xz (~940 MB) — KDE Plasma + SDDM + HW video decode + orangepi-setup auto-prompt baked in. The "just works" option.
  • *_minimal.img.xz (~440 MB) — CLI only, headless / server use. Run orangepi-setup post-boot for Plasma + setup.

Flash with balenaEtcher on any OS, or xz -dc *.img.xz | sudo dd of=/dev/sdX bs=4M status=progress on Linux/macOS — see Step 2 below for full per-OS commands and the SHA-256 verify step. Continue reading only if you want to rebuild it yourself or understand why it's needed.

Files in this repo

| File | Purpose | |---|---| | 01-build-noble.sh | Builds the 24.04 stepping-stone image. Run on the stock OPi vendor 22.04 system. | | 02-build-resolute.sh | Builds the 26.04 image. Run on the booted noble system. --desktop flag bakes Plasma + HW video decode + Orange Pi 5 Pro branding. Set VERSION=v1.7.0 to name the output opi5pro-v1.7.0-{desktop,minimal}.img.xz. Applies small idempotent workarounds for current Armbian-framework bugs (a debug ls -R that aborts the build, and the armbian-config auto-install). | | apply-uutils-shim.sh | Patches Armbian's framework with: (1) deploy uutils→qemu-shim, (2) restore before image creation, (3) rk3588 boot-delay (rootwait rootdelay=10), (4) rewrite hardcoded qemu-user-static package name to qemu-user-binfmt for Ubuntu 26.04 hosts. Idempotent. Called automatically by 02-build-resolute.sh. | | customize-image.sh | Runs inside the chroot during a --desktop build. Installs kubuntu-desktop, builds librockchip-mpp + woodyst/rockchip-vaapi + libva-utils from source, replaces the Armbian motd header with Orange Pi 5 Pro branding, drops a setup-reminder motd, installs the kdialog wizard autostart entry, and sources customize-image-npu.sh for the NPU stack. Copied into framework/userpatches/ by 02-build-resolute.sh --desktop. | | customize-image-minimal.sh | Minimal-flavor counterpart. Clones the repo, symlinks orangepi-setup, replaces the Armbian motd header with Orange Pi 5 Pro branding, drops the setup-reminder motd, and sources customize-image-npu.sh. Copied into framework/userpatches/ by 02-build-resolute.sh (no flag). | | customize-image-npu.sh | Sourced by both customize scripts inside the chroot. Builds the w568w/rknpu-module DKMS package (with the fixes in npu-patches/ for dma-buf import, the ioctl result-clobber, RKNPU_GET_VOLT NULL-deref, core bus-clock wiring, and DVFS — a reworked rknpu_devfreq.c + vendored devfreq-governor.h so the NPU scales off its 200 MHz default), downloads librknnrt.so 2.3.2 + rknn_server, compiles and installs an OPi-5-Pro DT overlay (4-bank single-IOMMU node so all three NPU cores translate through one page table — no bypass — NPU OPP table + pclk hold so a clock change doesn't wedge the SoC), ships udev rules that expose /dev/rknpu + /dev/dma_heap to the render group, installs the orangepi-npu-performance service (pins 800 MHz @ 0.9 V), orangepi-npu-benchmark, and a MobileNet sample model. Result: real model inference works out of the box, non-root, on all three NPU cores — ~330 inferences/s single-core, ~558/s across cores (core_mask 0x7), at 800 MHz (3× the stock clock). The rknpu-multicore.patch pre-powers the core1/core2 power domains + bus clocks at module load so the shared mainline rk_iommu can program their MMU banks, and a runtime coverage gate keeps the driver safe on any devicetree. | | 03-setup.sh | TTY post-boot helper. Six prompts: install Plasma / auto-start UI / migrate to NVMe / SPI bootloader / install HW video / fix HDMI overscan. Run as orangepi-setup from either image, or ./03-setup.sh from a clone. Re-runnable. | | 03-setup-gui.sh | KDE/kdialog wrapper around the same flow for the desktop image. Auto-launches once on first Plasma login (Plasma + HW video are baked in, so it's a 3-question wizard: autostart toggle, NVMe migration, HDMI overscan). Run as orangepi-setup-gui from the application launcher or terminal. | | orangepi-setup-gui.desktop | Plasma autostart entry. Shipped to /etc/xdg/autostart/ on the desktop image; runs orangepi-setup-gui once on first KDE login if ~/.opi5pro-setup-done is missing. | | orangepi-setup-gui-launcher.desktop | Application launcher entry. Shipped to /usr/share/applications/ on the desktop image so the wizard is re-launchable from the menu without the flag check. | | 04-release.sh | Publishes a GitHub release for the built images: tags it, (re)generates checksums, uploads the opi5pro-<version>-{desktop,minimal}.img.xz assets, and attaches notes. Idempotent — re-run to add the minimal image to a release that already has the desktop one. Needs gh authenticated. Usage: ./04-release.sh v1.7.0 --notes notes.md. | | README.md | This file. |

Why this is two builds plus a patch

Ubuntu 26.04 ships rust-coreutils (uutils) as the default coreutils. The uutils binaries use rustix, which crashes during startup with:

thread 'main' panicked at rustix/.../auxv.rs:269:
called `Result::unwrap()` on an `Err` value: ()

…whenever launched through chroot on certain Rockchip vendor kernels. Tested on both 6.1.43-rockchip-rk3588 (stock OPi vendor) and 6.1.115-vendor-rk35xx (Armbian vendor); both panic. The very first chroot operation in Armbian's build (linking armbian-archive-keyring.gpg into /usr/share/keyrings/) hits this and the build dies.

Two layers of problem stack on top of that:

  1. Stock OPi 22.04 kernel doesn't have CONFIG_BINFMT_MISC at all — not built-in, no module on disk:
    $ grep BINFMT_MISC /boot/config-$(uname -r)
    # CONFIG_BINFMT_MISC is not set
    
    So you can't even register qemu-aarch64 for binfmt-misc routing. Armbian's build can't shim around the uutils panic.
  2. Even on Armbian's 6.1.115 vendor kernel (which has CONFIG_BINFMT_MISC=m), Armbian's build framework explicitly skips qemu setup on native-arch builds (if dpkg-architecture -e "${ARCH}"; then return 0), so qemu-aarch64-static is never deployed into the chroot, and uutils panics anyway.

The recipe therefore needs two components:

  1. A 24.04 (noble) stepping-stone image so we can boot a kernel with CONFIG_BINFMT_MISC available. Noble itself uses GNU coreutils, so Step 1 of the build doesn't hit the uutils panic.
  2. A small patch (apply-uutils-shim.sh) for the resolute build that swaps the /usr/bin/* uutils symlinks for a tiny shell shim routing through qemu-aarch64-static, then restores the original symlinks after all chroot operations are done. The final 26.04 image ships clean uutils — no qemu emulation at runtime.

So the recipe is:

  1. Build Armbian Ubuntu 24.04 (noble) on the stock Orange Pi vendor system. (~3-5 h cold; ~3 min with caches)
  2. Flash 24.04 to microSD, boot from it.
  3. Build Armbian Ubuntu 26.04 (resolute) from the booted 24.04 system. 02-build-resolute.sh applies the patch automatically and defaults to BRANCH=current (~8-15 min total — Armbian's CI publishes a prebuilt mainline kernel deb).
  4. Flash 26.04 wherever you want it (microSD, USB SSD, eMMC).

Prerequisites

  • Orange Pi 5 Pro (16 GB RAM strongly recommended; 4/8 GB will work, slower)
  • A microSD card or USB SSD ≥ 4 GB (≥ 16 GB recommended)
  • ~50 GB free disk on the build host
  • Stock Orange Pi vendor Ubuntu 22.04 image as starting point (other hosts work but the recipe assumes this)

Step 1 — Build Armbian noble (24.04) on the stock OPi system

SSH to your Orange Pi 5 Pro running the stock OPi vendor Ubuntu 22.04, then:

sudo apt-get update
sudo apt-get install -y git docker.io
sudo usermod -aG docker "$USER"        # log out / back in OR run: newgrp docker
git clone https://github.com/mack42/OrangePi5Pro.git
cd OrangePi5Pro
./01-build-noble.sh

Output lands at:

~/armbian-build/framework/output/images/Armbian-*_Orangepi5pro_noble_vendor_*.img.xz

Plus a matching .txt build manifest and .sha checksum.

Step 2 — Flash and boot the 24.04 image

Copy the .img.xz to your workstation and flash to a microSD using the instructions for your OS below. balenaEtcher is the cross-platform safe choice; it accepts .img.xz directly and uses raw DD writes — the only tool I've gotten to produce a bootable card reliably across this whole project.

Linux

# Identify the SD card device first — DO NOT skip this step or you can wipe a real disk.
lsblk
# Look for the card (usually /dev/sda, /dev/sdb, or /dev/mmcblk0). Confirm by size.

# Decompress and write in one pipe (safe for .img.xz):
xz -dc Armbian-unofficial_*_resolute_current_*.img.xz | sudo dd of=/dev/sdX bs=4M status=progress conv=fsync
sync

Replace sdX with your card's device. Triple-check the devicedd will overwrite without warning.

macOS

Easiest: install balenaEtcher (drag in the .img.xz, pick the SD, write).

CLI alternative if you prefer Terminal:

# Identify the SD card device:
diskutil list
# Look for /dev/diskN where N is the SD card. Confirm by size.

# Unmount (d

Related Skills

View on GitHub
GitHub Stars16
CategoryContent
Updated5d ago
Forks1

Languages

Shell

Security Score

95/100

Audited on Aug 3, 2026

No findings