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/OrangePi5ProInstalls 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-setupauto-prompt baked in. The "just works" option.*_minimal.img.xz(~440 MB) — CLI only, headless / server use. Runorangepi-setuppost-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:
- Stock OPi 22.04 kernel doesn't have
CONFIG_BINFMT_MISCat all — not built-in, no module on disk:
So you can't even register$ grep BINFMT_MISC /boot/config-$(uname -r) # CONFIG_BINFMT_MISC is not setqemu-aarch64for binfmt-misc routing. Armbian's build can't shim around the uutils panic. - 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), soqemu-aarch64-staticis never deployed into the chroot, and uutils panics anyway.
The recipe therefore needs two components:
- A 24.04 (noble) stepping-stone image so we can boot a kernel with
CONFIG_BINFMT_MISCavailable. Noble itself uses GNU coreutils, so Step 1 of the build doesn't hit the uutils panic. - A small patch (
apply-uutils-shim.sh) for the resolute build that swaps the/usr/bin/*uutils symlinks for a tiny shell shim routing throughqemu-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:
- Build Armbian Ubuntu 24.04 (noble) on the stock Orange Pi vendor system. (~3-5 h cold; ~3 min with caches)
- Flash 24.04 to microSD, boot from it.
- Build Armbian Ubuntu 26.04 (resolute) from the booted 24.04 system.
02-build-resolute.shapplies the patch automatically and defaults toBRANCH=current(~8-15 min total — Armbian's CI publishes a prebuilt mainline kernel deb). - 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 device — dd 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
qqbot-channel
385.5kQQ channel management skill. Use qqbot_channel_api for explicit QQ channel-management requests; confirm write, delete, and bulk actions before calling authenticated QQ Open Platform endpoints.
docs-writer
106.4kAlways use this skill when the task involves writing, reviewing, or editing files in the `/docs` directory or any `.md` files in the repository.
cpp
40.5kGuide Cursor to write modern C++ and CMake code with clear structure, RAII, const-correctness, and safe error handling.
gamemaker-gml
40.5kGameMaker Language (GML) rules for scripts, objects, events, rooms, data structures, and performance-minded game code
