9.1 KiB
Armbian Install — Orange Pi 3B (Cyberdeck Multi-Boot)
Goal: Armbian (Debian 13 Trixie) on eMMC partition p3 (root_armbian), booting via shared extlinux.conf. Headless default, with XFCE available via startx (or startxfce4).
Context
The cyberdeck's eMMC has a four-partition layout with a shared /boot on p1:
mmcblk0 (233GB eMMC user data area)
├── mmcblk0p1 FAT32 1GB /boot (starts at sector 32768)
├── mmcblk0p2 ext4 85GB root_opios (Orange Pi OS Arch — live)
├── mmcblk0p3 ext4 85GB root_armbian (Armbian — target)
└── mmcblk0p4 ext4 ~84GB root_nixos (NixOS — future)
Boot is Rockchip-standard user-data-area: PARTITION_CONFIG=0x78, idbloader at sector 64, u-boot.itb at sector 16384, SPI flash erased. u-boot reads extlinux.conf from p1 for the boot menu.
Full walkthrough of the boot architecture and partition setup: docs/emmc-multiboot.md.
Current SD Card Boot Issue
Symptom: Armbian 26.2.0 minimal (Debian Trixie, kernel 6.18.30) flashed to SD card — black screen with single underscore cursor, no keyboard response.
Likely causes (investigation in progress):
-
Kernel/framebuffer init failure on the current kernel edge — Kernel 6.18 is very fresh (Rockchip-current was bumped from 6.12 to 6.18 recently). The framebuffer console initializes (underscore cursor visible) but the display pipeline or USB host may not complete initialization, leaving a dead console.
-
No serial console to see boot messages — The underscore cursor tells us the kernel's fbcon is alive, but we can't see where it failed. A UART adapter (TTL-to-USB at 1.5M baud on the OPi3B's debug UART pins) would show the actual boot log.
-
HDMI EDID handshake failure — Known issue on this board (documented in the bring-up reference). If the kernel's DRM/KMS driver can't negotiate EDID, it may still fail to the fbcon cursor state instead of blanking.
Alternative approaches being considered:
- Skip the SD boot entirely — extract Armbian rootfs and kernel from the downloaded image and install them directly to p3/p1 from within the running Orange Pi OS.
- Try the vendor-kernel variant (kernel 6.1.115) which is more stable on RK3566.
- Try a desktop image (Ubuntu Resolute Gnome/KDE) instead of minimal — different kernel config, may handle display differently.
Approach 1: Install Without Boot (From Running OS)
This approach doesn't require the SD card to boot. You extract Armbian's rootfs and kernel from the downloaded image while running Orange Pi OS, then add an extlinux.conf entry.
1. Mount the target partitions
# Mount the shared /boot (p1) and root_armbian (p3)
sudo mkdir -p /mnt/armbian_root
sudo mount /dev/mmcblk0p3 /mnt/armbian_root
sudo mkdir -p /mnt/armbian_root/boot
sudo mount /dev/mmcblk0p1 /mnt/armbian_root/boot
2. Extract rootfs from the Armbian image
# Find the SD card image
ls -la ~/Downloads/Armbian_*.img*
# Mount the SD image (loopback) to expose its partitions
sudo kpartx -av ~/Downloads/Armbian_orangepi3b_trixie_current_6.18.30_minimal.img
# This creates /dev/mapper/loopXp1 (/boot) and /dev/mapper/loopXp2 (rootfs)
# Mount the rootfs partition from the image
sudo mkdir -p /mnt/armbian_img
sudo mount /dev/mapper/loopXp2 /mnt/armbian_img
3. Rsync rootfs to p3
sudo rsync -aHAWX --info=progress2 /mnt/armbian_img/ /mnt/armbian_root/
4. Copy kernel, DTB, initrd to shared /boot
# Mount the SD image's /boot partition too
sudo mkdir -p /mnt/armbian_img_boot
sudo mount /dev/mapper/loopXp1 /mnt/armbian_img_boot
# Copy kernel files
sudo cp -v /mnt/armbian_img_boot/vmlinuz-* /mnt/armbian_root/boot/
sudo cp -v /mnt/armbian_img_boot/initrd.img-* /mnt/armbian_root/boot/
sudo cp -rv /mnt/armbian_img_boot/dtb*/ /mnt/armbian_root/boot/
5. Update fstab
Get UUIDs and set up the Armbian root:
sudo blkid /dev/mmcblk0p1 /dev/mmcblk0p3
Edit /mnt/armbian_root/etc/fstab:
UUID=<boot-UUID> /boot vfat defaults,noatime 0 2
UUID=<root_armbian-UUID> / ext4 defaults,noatime 0 1
6. Add extlinux.conf entry
Edit /mnt/armbian_root/boot/extlinux/extlinux.conf (or create the shared one if it's not auto-generated from Orange Pi OS's):
Add a LABEL block:
LABEL Armbian
LINUX /vmlinuz-6.18.30-current-rockchip
INITRD /initrd.img-6.18.30-current-rockchip
FDT /dtb/rockchip/rk3566-orangepi-3b.dtb
APPEND root=UUID=<root_armbian-UUID> ro console=tty1 console=ttyS2,1500000n8 video=HDMI-A-1:1920x1080@60e
The video=HDMI-A-1:1920x1080@60e forces the mode even if EDID is missing — needed for the OPi3B HDMI issue.
7. Clean up and test
sudo umount /mnt/armbian_img /mnt/armbian_img_boot /mnt/armbian_root/boot /mnt/armbian_root
sudo kpartx -d ~/Downloads/Armbian_orangepi3b_trixie_current_6.18.30_minimal.img
sudo sync
Reboot. Pick "Armbian" from the u-boot menu.
Approach 2: Boot Armbian SD Card (Alternative Images)
If you want to get the SD card booting instead:
- Try the vendor kernel image: The rolling-release page offers a Debian Trixie Minimal with kernel
6.1.115(vendor). This is the older, more tested Rockchip BSP kernel — likely more stable. - Try a desktop image: The Ubuntu Resolute Gnome/KDE images use a different kernel config and might initialize the HDMI display path differently.
- Use UART: The OPi3B has debug UART pins (accessible via UART-to-USB adapter at 1,500,000 baud). This shows the actual boot log — u-boot output, kernel messages, and the panic/hang point — which makes debugging instant instead of guessing from a blank screen.
Post-Install: XFCE via startx
Once Armbian is booting from eMMC:
Install XFCE (no display manager)
sudo apt update
sudo apt install xfce4 xfce4-terminal xinit
No display manager (lightdm/gdm/sddm) — the goal is headless boot with XFCE available on demand.
Configure startx
# Create .xinitrc to launch XFCE
echo "exec startxfce4" > ~/.xinitrc
Then startx launches the desktop.
For the rootless-first Armbian setup (default user created on first boot), ~/.xinitrc goes in the user's home directory. No sudo needed.
Verification Checklist
- Armbian boots from u-boot menu
- Network works (ethernet or WiFi)
- SSH access (check
ip afor IP,systemctl status ssh) startxlaunches XFCE from the terminal- Keyboard/mouse work in XFCE
- eMMC partitions accessible (no stray SD card mounts)
References
- Armbian OPi3B page: https://www.armbian.com/boards/orangepi3b
- eMMC multi-boot setup:
docs/emmc-multiboot.md - Initial bring-up:
docs/initial-bringup.md - Storage architecture:
docs/storage-architecture.md - OPi 3B bring-up reference:
references/orangepi-3b-bringup.md(in cyberdeck skill)
Session Log — 2026-06-07 Boot Recovery
Background
Orange Pi OS Arch was booting from eMMC (3-OS multi-boot layout, PARTITION_CONFIG=0x78). An Armbian 26.2.0 minimal (Debian Trixie, kernel 6.18.30) SD card was inserted to test booting. The Armbian image produced a black screen with underscore cursor on HDMI and hung. Upon removing the SD card, the eMMC no longer booted — same black screen / cursor symptom.
What Happened
The Armbian SD card's u-boot wrote bootloader data to two places:
- SPI NOR flash — overwrote the previously-erased SPI chip, changing the boot priority back to SPI-first
- eMMC bootloader sectors (0-32767) — overwrote the existing idbloader at sector 64 and u-boot.itb at sector 16384 with Armbian's versions
Recovery Attempts
| Step | Result |
|---|---|
SPI erase via maskrom (rkdeveloptool ef) |
Success (resolved by switching to a better USB-A-to-A cable) |
eMMC bootloader rewrite — wrote Orange Pi OS's idbloader.img to sector 64 and u-boot.itb to sector 16384 from within SD-booted OPi OS |
RKNS magic verified at sector 64 |
| PARTITION_CONFIG check | 0x78 — verified with mmc extcsd read via mmc-utils installed on OPi OS Arch. The register was not changed. |
| Full boot cycle (no SD) | Still hangs: black screen + underscore cursor |
Diagnostic Signals
- Green LED: flashes a quick heartbeat pattern before the hang — the kernel starts booting (extlinux.conf is found, the kernel loads and begins executing) but doesn't complete init
- The underscore cursor is the kernel's framebuffer console — it initialized fbcon but never reached userspace
Still Pending (next session)
- Check extlinux.conf on eMMC p1 — mount
/dev/mmcblk0p1from the SD-booted system and verify theLINUX,INITRD,FDTpaths exist androot=PARTUUID=matches p2's PARTUUID - Check rootfs health on p2 — mount
/dev/mmcblk0p2and verify filesystem integrity (look for corruption from all the power cycles / failed boots) - Check kernel + initrd file existence on p1 — the files that extlinux.conf references might have been deleted or corrupted during the Armbian u-boot write
- Try a kernel panic capture — add
panic=10to the APPEND line in extlinux.conf to see if the kernel panics on a missing rootfs before the display driver initializes