How to install umbrel headless on OrangePi5 with linux

Here is my installation guide to set up an OrangePi5 with Linux and umbrel.
If you install umbrel without this guide, you will see that umbrel does not grab the external hard drive, which makes loading the blockchain pointless without a 1TB SD card.

Installation type: headless via ssh
Used OS: Orangepi5_1.0.8_ubuntu_jammy_server_linux5.10.110
Connection: via ethernet at router
SD card required

Preliminary information:
I did this the same way on my OrangePi5 and it runs flawlessly. Orangepi-config is still in beta, so expect unexpected errors.
For me, despite everything, it won’t boot without an SD card, so it just gets stuck in the eMMC block. It doesn’t bother me.
I tried the SPI installer directly under the orangepi-config, which didn’t succeed.
Therefore I did everything via terminal via ssh.

Notice:
I can’t reach Umbrel itself via ssh after the installation so far, Despite entering a password the connection is denied.

Here now my procedure:
Flash the SD card with the image provided by orangepi (www.orangepi.org) and start the OrangePi5.
Open terminal or command line (under Windows) and connect to the Orangepi5 via ssh.
(ssh orangepi@orangepi-local or orangepi@IPaddress, password: orangepi).

Start under
sudo orangepi-config
the configuration, set timezone and do all updates. I have assigned another hostname for my own reasons.

Connect your external hard drive to the USB3.0 port (upper one of the two) and check integration under
sudo lsusb
This then looks like this, for example:
Bus 006 Device 002: ID 174c:55aa ASMedia Technology Inc. ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge,

With the command
sudo lsblk
you see the hard disk ‘sda’ (example with a new Crucial MX500 1TB):
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 931,5G 0 disk
mtdblock0 31:0 0 16M 0 disk
mmcblk1 179:0 0 59,5G 0 disk
├─mmcblk1p1 179:1 0 256M 0 part /boot
└─mmcblk1p2 179:2 0 58,6G 0 part /var/hdd.log
/
zram0 254:0 0 7,7G 0 disk [SWAP]
zram1 254:1 0 200M 0 disk /var/log

Is your external hard drive described such as:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 931,5G 0 disk
├─sda1 8:1 0 256M 0 part
└─sda2 8:2 0 921,9G 0 part

format it and delete all partitions on the external hard disk with
sudo mkfs.ext4 /dev/sda.
So that the pure disk is displayed (see above under sda).

Important intermediate step:
Prepare another storage medium like an USB-Stick and save on it exactly the image you flashed before. Make sure that you choose a format that linux can read and that you do not have to install other things separately. This can interfere with the rest of the installation.
So in this case we copied ‘Orangepi5_1.0.8_ubuntu_jammy_server_linux5.10.110.img’ to a USB stick with format ‘NTFS’. It is important to extract the image from the 7z format beforehand, otherwise we won’t be able to do anything with it later.
Connect the stick to the OrangePi5 (I took the USB-C with adapter, with the adapter I had to pay attention to the orientation ‘up/down’. The OrangePi5 recognized the stick only in correct orientation top ‘up’).

Let you with
sudo blkid
show the nominal data of the hardware. You need the UUID for ‘fstab’ to mount the stick later.
It is best to save the data in a text document.
Now start
sudo nano /etc/fstab
There you add the necessary entries for the USB stick accordingly.

So in my case:
UUID=<deineUUIDvomStick /media/usb1 ntfs auto,nofail,sync,users,rw 0 0
Then save the file and close it with ^ + O, Return, ^ + X

Now create a folder with
sudo mkdir -p /media/usb1
(exactly as written in the fstab file. I use sep. listing of the USB slots to avoid confusion, therefore ‘usb1’)
Now mount the stick with
sudo mount /dev/sdb2.

With
sudo lslbk
and
sudo df -h
check if the stick has been mounted correctly.

Now continue with the installation process and start the ‘emmc, usb, sata Installer’ with
sudo nand-sata-install
and select ‘Install/Update the bootloader on SPI Flash’. The process will take some time. Drink a glass of water and relax for a while.
When the process is finished, you will see ‘Done’ (bottom left).

Now we create a folder under ‘/home/orangepi’ with
sudo mkdir -p /home/orangepi/downloads
(I have chosen the folder by name to be able to store data there later if necessary).

Navigate to the folder on the USB stick with the image:
cd /media/usb1/linux
(in my case ‘linux’)
Now copy the previously saved image ‘Orangepi5_1.0.8_ubuntu_jammy_server_linux5.10.110.img’ from the USB stick into the just created folder ‘downloads’ with
cp Orangepi5_1.0.8_ubuntu_jammy_server_linux5.10.110.img /home/orangepi/downloads
Now navigate to the folder where the image is now stored with
cd /home/orangepi/downloads.

Check with
ls
whether the image is stored there.
Now continue with
sudo fdisk -l | grep "sda"
The external hard disk should now be displayed with the following information:
Disk /dev/sda: 1.86 TiB, 2048408248320 bytes, 4000797360 sectors
Now ‘burn’ the image from the ‘downloads’ folder to the external hard disk with the following command:
sudo dd bs=1M if=Orangepi5_1.0.8_ubuntu_jammy_server_linux5.10.110.img of=/dev/sda status=progress
After finishing the process, enter the following command:
sudo fix_mmc_ssd.sh
This will fix the problem of having the same data (so now we have linux booting twice), because u-boot always has priority to the SD card. You will see this later.

After finishing you look with
sudo lsblk
what your structure looks like now:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 931,5G 0 disk
├─sda1 8:1 0 256M 0 part
└─sda2 8:2 0 2,8G 0 part
mtdblock0 31:0 0 16M 0 disk
mmcblk1 179:0 0 59,5G 0 disk
├─mmcblk1p1 179:1 0 256M 0 part /boot
└─mmcblk1p2 179:2 0 58,6G 0 part /var/hdd.log
/
zram0 254:0 0 7,7G 0 disk [SWAP]
zram1 254:1 0 200M 0 disk /var/log

You now have two partitions from flashing on the SD card under mmcblk1 and exactly the same two partitions on the external hard disk under sda.
Now you look with
sudo blkid
to see how the entries are there.
Check with
cat /etc/fstab
whether the two partitions sda1 & sda2 and mmcblk1p1 & mmcblk1p2 have the same UUID.

With
tune2fs -U random /dev/mmcblk1p2
you assign a random UUID to the second partition of the SD card ‘mmcblk1p2’. This prevents the partition of the SD card from being selected again during the boot process.
Now mount both partitions of the external hard disk with
sudo mount /dev/sda1
sudo mount /dev/sda2

It will look like this:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 931,5G 0 disk
├─sda1 8:1 0 256M 0 part /boot
└─sda2 8:2 0 2,8G 0 part /var/log.hdd
/
mtdblock0 31:0 0 16M 0 disk
mmcblk1 179:0 0 59,5G 0 disk
├─mmcblk1p1 179:1 0 256M 0 part /boot
└─mmcblk1p2 179:2 0 58,6G 0 part /var/log.hdd
/
zram0 254:0 0 7,7G 0 disk [SWAP]
zram1 254:1 0 200M 0 disk /var/log.

Unmount the two partitions of the SD card ‘mmcblk1’ with
sudo umount /dev/mmcblk1p1
sudo umount /dev/mmcblk1p2
Shutdown the Orangepi5
sudo shutdown
Remove the SD card and restart the OrangePi at the button.

Notice:
After removing the SD card, the OrangePi5 did not boot correctly from the external hard drive. In the end the bootloader got the boot partition of the SD card again, for whatever reason. As written in the beginning, I don’t care, the important thing for me is that umbrel takes the external hard drive for the further purposes.

So you have to insert the SD-Card and boot the OrangePi5 with this SD-Card.
With
cd /boot
navigate to the Bootfolder of the boot partition of the external harddisk and with
ls
you will find the file ‘orangepiEnv.txt’.
You open this with
sudo nano orangepiEnv.txt
and find the entries.

Under ‘rootdev’ change the entry to ‘/dev/sda2’, which then looks like this:
verbosity=1
bootlogo=false
overlay_prefix=rk3588
fdtfile=rockchip/rk3588s-orangepi-5.dtb
rootdev=/dev/sda2
rootfstype=ext4
usbstoragequirks=0x2XX7:0xXX66:u,0xXX37:0x1XXX:u
(in the last line I have ‘X’ some out.)

After that I checked again under the ‘orangepi-config’ for updates and then install umbrel with the command
curl -L https://umbrel.sh | bash
Under the IP address previously assigned by me then umbrel started in the web interface and set up.
The external hard drive is used as storage and the synchronization of Blockchain over the Internet took 62 h.

Please note that the OrangePi5 is new and the operating system and orangepi-config are not yet perfectly tuned. Beta phase
Problems may occur.

Found so far:

  • no access to umbrel directly via ssh yet.
  • Connection via Tor from BitBox app to Electrs on the Node buggy, means I can’t connect the BitBox app from my laptop to the Node via Tor.
  • Unable to install external hard drive as boot and work media, no boot.

I am in the process of testing multiple systems.
This includes ubuntu_jammy_desktop, debian_bullseye_server as well as debian_bullseye_desktop.
As soon as the OrangeOS is released, I will have a look at that as well.

I’m basically trying headless first, but will do some tests with monitor, mouse and keyboard as well.

Hi @Rikser!

First of all, thanks a lot for your guide - I was precisely trying to do this but had no clue about where to start (after trying with the RPi image with no success).

I’ve been able to replicate what you did up until the “Important intermediate step” (even though I wasn’t able to connect via ssh, but just connected a screen to the OrangePi instead).

However, right on that step, I’m unable to copy the img file in NTFS using Rufus (it’s directly setup as FAT32 with no possibility to change), hence I’m also unable to find ‘fstab’ in the very next step to then change the /etc/fstab file.

Would it be any other way to perform those steps, please?

Thanks a million!

Hello and good morning

Have you tried Balena Etcher yet?
I can’t tell you anything else, except that it worked for me.

Keep in mind that a connection to umbrel via ssh is not possible, so far.
I also have not been able to get a .onion connection to the node, access is denied.
I have postponed the project for now, we are completely renovating our house, so I am maxed out.

On the website of orangepi you can go to the download area.
There you will find a manual describing the whole procedure, finally. :slight_smile: