ZTE B860H: Getting Armbian into it
This blog will cover the Armbian installation guide for B860H V1 / V2.
Caution: This model MUST not be confused with V5, as both revision have an entirely different hardware inside.

The method that's used here will not be requiring the set top box to be already rooted, or at most, outside of the stock rom. Assuming that the STB is still in the stock.
At best, It's recommended to do all of the flashing in Linux desktop, Otherwise the Windows equivalent exists, which i will talk about later.
This guide also works on FiberHome HG680P box (however, check Trivia).
Requirements
- A Personal Computer with microSD slot (otherwise, use microSD<–>USB adapter. These will work)
- A microSD card (Use class 10 microSD card if you're going to use this as main)
- A specifcally made HDMI Boot Dongle which you can made yourself or by purchasing an already premade one via online store (id: Shopee Indonesia | global: Tindie)
- The actual box itself (B860H) that can still be powered on regardless the boot state (LED is orange, or green, or whatever. does not matter it's rooted, still in stock, or not).
- Not copy and pasting blindly the attached commands
Installation
The B860H must use the HG680P U-Boot bootloader to work, Which you can obtain it from here (save it as u-boot.bin).
The following steps must be done in order.
1. Flashing the Armbian
You can obtain the Armbian image from ophub/amlogic-s9xxx-armbian, With each consisting of different distros. For example, as of the time of this writing:
– resolute is a Ubuntu edition of Armbian OS
– trixie is a Debian edition of Armbian OS.
You will want to look for a release with the two keywords: s905x, and b860h. For example:
Armbian_26.11.0_amlogic_s905x-b860h_trixie_6.18.51_server_2026.09.14.img.gz
Once you have downloaded it, Uncompress it:
gzip -k -d -v Armbian_26.11.0_amlogic_s905x-b860h_trixie_6.18.51_server_2026.09.14.img.gz
Note: Adjust the filename with the release that you have downloaded.
Insert a microSD card to be flashed on, check where it was located:
yonle@yonle:/mnt$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
mmcblk0 179:0 0 58.6G 0 disk
├─mmcblk0p1 179:1 0 511M 0 part
└─mmcblk0p2 179:2 0 58.1G 0 part
In this case, it's /dev/mmcblk0
Special: If you're using an SDcard USB adapter, These usually are named with
sd[a...c]prefix (example:sdb). It must not be confused with an existing main SATA drive.
and then flash the Armbian image to the card:
sudo dd if=Armbian_26.11.0_amlogic_s905x-b860h_trixie_6.18.51_server_2026.09.14.img of=/dev/mmcblk0 bs=4M status=progress
sync
(yes, sync IS a command)
Adjust /dev/mmcblk0 to the path to your microSD slot, Which you can check via lsblk command.
Caution: Doing this will wipe ALL the datas that's in the microSD card. Please back up important stuff if there's one before proceeding.
There is no need to alter the BOOT partition after flashing as these will be done automatically during boot stage.
2. Flashing the U-Boot
On Windows, Doing this step is essentially done by using a program called Amlogic Bootcard Maker.
Similarly, we can do the same on Linux.
Head to the directory where the earlier u-boot.bin is downloaded, for example:
cd ~/Downloads
Then flash it:
sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=1 count=442
sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=512 skip=1 seek=1
sync
And finally, Yeet the microSD card out.
Flashing TL;DR
To put it simply, The above tasks is simply:
sudo dd if=Armbian_26.11.0_amlogic_s905x-b860h_trixie_6.18.51_server_2026.09.14.img of=/dev/mmcblk0 bs=4M status=progress
sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=1 count=442
sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=512 skip=1 seek=1
sync
To the box...

You can determine whenever the box is already hacked or not, And it's usually determined via the LED indicator: – If it's green, Chances are it's running Android. – If it's orange, It's not using a regular android bootloader or is in emergency download mode
On a box with the factory Android rom inside, You usually cannot just insert the microSD right into the box, and then hopes it will boot immediately to what's on the microSD card. The stock bootloader will immediately boot to the Android OS anyway and then indirectly alter the BOOT partition, which is probably not what you wanted.

A specialized HDMI dongle is made specifically to make the bootloader on this box to boot whatever that's in the microSD card, supposedly for emergency / download mode.
To check whenever this HDMI dongle is exactly what we wanted, We can use i2cdetect (installable via i2c-tools) to check the HDMI bus:
First, we will want to know which bus is the bus for the HDMI port in my laptop:
yonle@yonle:~$ sudo i2cdetect -l
i2c-0 i2c Synopsys DesignWare I2C adapter I2C adapter
i2c-1 i2c Synopsys DesignWare I2C adapter I2C adapter
i2c-2 i2c i915 gmbus dpa I2C adapter
i2c-3 i2c i915 gmbus dpb I2C adapter
i2c-4 i2c i915 gmbus dpc I2C adapter
On the above example, My bus is at i2c-2, Which is i915 gmbus dpa (notice the dpX prefix). From the 2 at the end of the i2c-2, Add it by +1, Which then: 3.
So now we plug our HDMI dongle to our HDMI port in our laptop:
yonle@yonle:~$ sudo i2cdetect -y -r 3
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- 52 -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
If this dongle is what we are looking for, In 0x50, There should have 52 in the third column just like shown above.
Then verify what's inside:
yonle@yonle:~$ sudo i2cdump -y -r 0xf8-0xff 3 0x52
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
f0: 62 6f 6f 74 40 53 44 43 boot@SDC
The string value must be boot@SDC.
Now that we know that the dongle is exactly what we're looking for, Let's begin the installation process:
Now unplug the box from any power source, – Insert the microSD card that we flashed earlier to the microSD card slot, – Plug the HDMI dongle to the box
Then plug it to the power source, and pay attention to the power LED indicator, The green indicator must have turned into orange on this phase.
Keep in mind that the indicator MUST STAY on orange LED light for as long as 15 seconds (it mustn't turn green on this phase, If it did, Then you're flashing it wrong!).
If after 15 seconds passed the LED is staying orange, You can now unplug the HDMI dongle and plug a HDMI cable from your TV/Monitor/CaptureCard to your box, You must see something resembling TTY:

From there, Once you get into a phase where Armbian asks you for setup, There's two method you can do this:
1. Keyboard way: Plug your keyboard to the STB, and do set up from here
2. Networking: You want to set this box up via ssh: Plug a LAN cable from your router to the box, Check for it's IP address on the router page, and ssh into it:
ssh root@10.42.x.x
The default password is 1234. You will be asked for setup and a new password setup.

Once you're done, Then that's it. You're done installing Armbian to your microSD via your box, However you will still need to use that HDMI dongle to force it using U-Boot.
Making U-Boot permanent
Just like earlier, Send the earlier u-boot.bin to the box via network:
scp u-boot.bin root@10.42.xx.xx:u-boot.bin
Get into the shell, and check which MMC is our eMMC:
root@armbian:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
mmcblk1 179:0 0 58.6G 0 disk
├─mmcblk1p1 179:1 0 511M 0 part /boot
└─mmcblk1p2 179:2 0 58.1G 0 part /
mmcblk2 179:32 0 7.3G 0 disk
├─mmcblk2p1 179:33 0 511M 0 part
└─mmcblk2p2 179:34 0 6.1G 0 part
mmcblk2boot0 179:64 0 4M 1 disk
mmcblk2boot1 179:96 0 4M 1 disk
In this case, Since we're booting from SDcard, mmcblk2 is our target, So:
sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=1 count=442
sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=512 skip=1 seek=1
Caution: This will permanently wipe the android bootloader in the eMMC. If you plan to install Armbian to eMMC, Do
armbian-installand reflash U-Boot to the eMMC via steps above again
Installing to eMMC
Caution: Doing the following will wipe what's in the eMMC, Which includes the Android base itself.
Assuming you have been in the shell, run armbian-install as root:
root@armbian:~# armbian-install
[ STEPS ] Installing Armbian to internal eMMC...
[ STEPS ] Checking dependencies...
[ INFO ] Dependency check completed. Proceeding installation...
[ STEPS ] Initializing the environment...
[ INFO ] Use mainline u-boot: [ no ]
[ INFO ] Use ampart tool: [ no ]
[ INFO ] Show all devices: [ no ]
[ INFO ] Detected eMMC device: [ /dev/mmcblk2 ]
[ STEPS ] Start selecting device...
-----------------------------------------------------------------------------------------------------
ID SOC MODEL DTB
-----------------------------------------------------------------------------------------------------
101 s905d Phicomm-N1 meson-gxl-s905d-phicomm-n1.dtb
102 s905d Phicomm-N1(DMA-thresh) meson-gxl-s905d-phicomm-n1-thresh.dtb
103 s905d MECOOL-KI-Pro meson-gxl-s905d-mecool-ki-pro.dtb
104 s905d SML-5442TW meson-gxl-s905d-sml5442tw.dtb
105 s905x HG680P meson-gxl-s905x-p212.dtb
106 s905x B860H meson-gxl-s905x-b860h.dtb
107 s905x Nexbox-a95x meson-gxl-s905x-nexbox-a95x.dtb
108 s905x TX9 meson-gxl-s905x-tx9.dtb
109 s905x T95,XiaoMI-3S,X96,BTV9 meson-gxl-s905x-p212.dtb
110 s905x TBee meson-gxl-s905x-tbee.dtb
-----------------------------------------------------------------------------------------------------
111 s905w TX3-Mini,MeCool-m8s-pro-W meson-gxl-s905w-tx3-mini.dtb
112 s905w W95 meson-gxl-s905w-p281.dtb
113 s905w X96-Mini meson-gxl-s905w-x96-mini.dtb
114 s905w X96W,FunTV,MXQ-Pro-4K meson-gxl-s905w-x96w.dtb
115 s905l UNT402A,M201-S,MiBox-4C,IP108H,B860AV2.1 meson-gxl-s905l3b-m302a.dtb
116 s905l MG101,Mibox-4,E900V21C,XiaoMI-4C meson-gxl-s905l-venz-v10.dtb
117 s905l Tencent-Aurora-1s meson-gxl-s905x-p212.dtb
118 s905l ZXV10-B860AV2.1U,HM201 meson-gxl-s905x-tx9.dtb
119 s905l2 MGV2000,MGV3000,M301A,CM201-1,IP108H meson-gxl-s905l2-x7-5g.dtb
120 s905l2 E900v21E,MGV2000-K,e900v21d meson-gxl-s905l2-x7-5g.dtb
-----------------------------------------------------------------------------------------------------
121 s905l2 Wojia-TV-IPBS9505 meson-gxl-s905l2-ipbs9505.dtb
122 s905l3 CM311-1,HG680-LC,M401A,UNT402A,CM201-1-6-YS meson-gxl-s905l2-x7-5g.dtb
123 s905l3 CM211-1,M411A,B860AV3.2M,B860AV2.1U,M301A meson-gxl-s905l3b-m302a.dtb
124 s905l3 UNT400G1,E900V22D-2,UNT400G,IP108H meson-gxl-s905l2-x7-5g.dtb
125 s905l3 UNT402A,UNT400G meson-gxl-s905l3b-m302a.dtb
126 s905l3b E900V21E,E900V22E,MGV2000/CW,M411A meson-gxl-s905l3b-e900v22e.dtb
127 s905l3b M302A,M304A,CM201-1,CM211-1,CM311-1 meson-gxl-s905l3b-m302a.dtb
128 s905l3b UNT403A meson-gxl-s905l3b-m302a.dtb
129 s905l3b RG020ET-CA meson-gxl-s905l3b-e900v22e.dtb
130 s905l3b IP103H,TY1608,BV310,B860AV-2.1M meson-gxl-s905l3b-m302a.dtb
-----------------------------------------------------------------------------------------------------
131 s905l3b E900V22D,TY1608 meson-gxl-s905l2-x7-5g.dtb
132 s905l3b E900V21D,B860AV2.1-A meson-gxl-s905l2-x7-5g.dtb
133 s905mb S65 meson-gxl-s905x-p212.dtb
134 s905lb BesTV-R3300L,SumaVision-Q7,MG101 meson-gxl-s905x-p212.dtb
135 s905lb Q96-mini meson-gxl-s905x-p212.dtb
136 s905lb IPBS9505 meson-gxl-s905l2-x7-5g.dtb
0 Other Customize Enter-custom-dtb-name
-----------------------------------------------------------------------------------------------------
[ OPTIONS ] Please Input ID: 106
Pick 106, or B860H.
Pressing enter will tell you to pick filesystem type:
[ INFO ] Input Box ID: [ 106 ]
[ INFO ] Model Name: [ B860H ]
[ INFO ] FDTFILE: [ meson-gxl-s905x-b860h.dtb ]
[ INFO ] MAINLINE_UBOOT: [ ]
[ INFO ] BOOTLOADER_IMG: [ ]
[ INFO ] UBOOT_OVERLOAD: [ u-boot-p212.bin ]
[ INFO ] NEED_OVERLOAD: [ no ]
[ STEPS ] Selecting root filesystem type...
-----------------------------------------------
ID TYPE
-----------------------------------------------
1 ext4
2 btrfs
-----------------------------------------------
[ OPTIONS ] Please Input ID (1/2):
Depending on your workload, you can use either ext4 or btrfs for your eMMC. But if you're unsure, I'd recommend ext4.
It has received plenty of improvements over the years, so it's not the same ext4 people might remember from years ago. It's still a very solid choice for eMMC.
From there, It will install the system to the eMMC from SDcard, which will take several minutes until it's finished.
After it's finished, Reflash U-Boot to the eMMC like how we flash it to microSD:
sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=1 count=442
sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=512 skip=1 seek=1
sync
So:
[ INFO ] Copying ROOTFS partition data...
[ INFO ] Copying [ etc ] ...
[ INFO ] Copying [ home ] ...
[ INFO ] Copying [ opt ] ...
[ INFO ] Copying [ root ] ...
[ INFO ] Copying [ selinux ] ...
[ INFO ] Copying [ srv ] ...
[ INFO ] Copying [ usr ] ...
[ INFO ] Copying [ var ] ...
[ INFO ] Generate the new fstab file.
[ INFO ] Update parameters related to the releases file.
[ SUCCESS ] Installation completed successfully. Run [ poweroff ], remove the installation media, then re-insert the power supply to boot the new system.
root@armbian:~# sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=1 count=442
442+0 records in
442+0 records out
442 bytes copied, 0.00554292 s, 79.7 kB/s
root@armbian:~# sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=512 skip=1 seek=1
4095+0 records in
4095+0 records out
2096640 bytes (2.1 MB, 2.0 MiB) copied, 0.1678 s, 12.5 MB/s
root@armbian:~#
After these are all done, Run poweroff. Once it's off (the LED light will turn to green, Don't worry), Unplug from power source, now you can also unplug the microSD card.
And now let it boot into it's own glory by plugging the power source back, And lo and behold, Look. It runs without the microSD card!:

Extra: Setting up zram
This can save us some room in our RAM.
sudo apt update && sudo apt install systemd-zram-generator
sudo nano /etc/systemd/zram-generator.conf
Put:
[zram0]
zram-size = ram
compression-algorithm = lzo-rle zstd(level=3) (type=idle)
Save it (CTRL+S), Exit (CTRL+X), and load it:
sudo systemctl daemon-reload
sudo systemctl start systemd-zram-setup@zram0.service
Trivia
Given how similar the hardware that's in B860H V1 and HG680P, Especially the SOC (you can flash the same u-boot.bin and it will still boots!), You can probably follow this guide alongside the same HDMI dongle trickery on HG680P too
especially when it's bootloader is broken (which i saw most HG680P had on), you can force Amlogic to boot the bootloader in microSDcard via the HDMI dongle like what i did here.
They will still boot and will work, But the device tree for the hardware will be partially different and might conflict to each other, So during armbian-install, You must instead chose this:
105 s905x HG680P meson-gxl-s905x-p212.dtb
Alternatively, if you don't have the HDMI dongle, you can bypass the eMMC boot on the HG680P and make the device boot from the SD card by shorting R162, 4C6, and GND on the motherboard simultaneously. The USB port can be used as the ground point. A pair of tweezers or a similar conductive tool can be used to make the connection (found by Jimed-rand).
A similar method can be used on the B860H V1/V2 by shorting R87 to enter boot/recovery mode.
Baffled?
There's a YouTube Video that i made specifically for this. The video won't reexplain what has been mentioned on this page, So feel free to watch how it was done in raw.