ZTE B860H: Getting Armbian into It
The user wants me to reformat a raw article about installing Armbian on ZTE B860H into clean Markdown. I need to follow the rules: break into paragraphs, add section headings, use lists and code blocks, preserve all facts, don't add intro/conclusion, don't repeat title as heading, output only Markdown.
Let me analyze the article structure:
- Title: "ZTE B860H: Getting Armbian into It" (but I shouldn't repeat as heading)
- Comments section (maybe ignore? The article starts with "Comments" then "ZTE B860H: Getting Armbian into it" again)
- Introduction/overview with caution about V1/V2 vs V5
- Requirements list
- Installation section with steps
- "To the box..." section about HDMI dongle and boot process
- "Making U-Boot permanent" section
- "Installing to eMMC" section with detailed steps and output
- Extra sections: zram, irqbalance, Trivia, Baffled?
I need to create appropriate headings. The article already has some headings in the text like "Requirements", "Installation", "To the box...", "Installing to eMMC", "Extra: Setting up zram", "Extra: Setting up irqbalance", "Trivia", "Baffled?". I should use those as ## headings.
I'll structure:
Requirements
Installation
1. Flashing the Armbian
2. Flashing the U-Boot
Flashing TL;DR
To the Box...
Making U-Boot Permanent
Installing to eMMC
Extra: Setting up zram
Extra: Setting up irqbalance
Trivia
Baffled?
But note: The article mentions "Extra: Setting up zram" and "Extra: Setting up irqbalance" but there's no content for them in the provided text. The text ends after the eMMC installation output. The user said "Preserve every fact, name, number, and quotation exactly as given." So I should include those headings but maybe note they're empty? Actually the article body provided doesn't include content for those extras. The raw text ends at the dd output. The initial list includes them but no content. I'll include the headings but with no content? The rule says "Preserve every fact... Never invent, add, remove, or reorder information." So I should keep the headings as they appear in the article's table of contents? The article starts with a list: "- Requirements - Installation - To the box... - Installing to eMMC - Extra: Setting up zram - Extra: Setting up irqbalance - Trivia - Baffled?" That's like a table of contents. I'll include those as headings, but for zram and irqbalance there's no content in the provided text. I'll still include the headings but maybe add a note? But I shouldn't add commentary. I'll just include the headings with no content, as the original article might have them but the provided text is truncated. However the user gave the entire article body? It ends at the dd output. The "Extra" sections are not present. I'll include them as headings but with no paragraphs. That's preserving the structure.
Also need to format code blocks, commands, etc. Use fenced code blocks for longer outputs, inline code for commands.
Let's start writing.
First, the article begins with "Comments" then "ZTE B860H: Getting Armbian into it". That might be a header from the blog. I'll ignore "Comments" and start with the intro paragraph.
I'll write:
Overview
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.
Then the table of contents list? Actually the article includes a list of sections. I'll not repeat that list; instead use headings.
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 specifically made HDMI Boot Dongle which you can make 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 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:
resoluteis a Ubuntu edition of Armbian OStrixieis 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 SD card USB adapter, these usually are named with sd[a...c] prefix (example: sdb). It must not be confused with an existing main SATA drive.
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 data 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 whether 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 hope 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 boot whatever is in the microSD card, supposedly for emergency / download mode.
To check whether 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 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 an HDMI cable from your TV/Monitor/Capture Card to your box. You must see something resembling TTY.
From there, once you get into a phase where Armbian asks you for setup, there are two methods you can do this:
- Keyboard way: Plug your keyboard to the STB, and do set up from here.
- Networking: You want to set this box up via SSH: plug a LAN cable from your router to the box, check for its 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 r***@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 SD card, 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-install and 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 SD card, 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 ] Copy
Comments
No comments yet. Start the discussion.