mu300-linux: Ubuntu and OpenWrt on the ZTE F50 and U30 Air 5G hotspots
Linux (Ubuntu 24.04/26.04 or OpenWrt) next to Android on the ZTE F50 / MU300 and U30 Air 5G hotspots (Unisoc T760 / UMS9620): installer, vendor 5.4 and mainline 6.18 / 7.2 kernels, 5G modem, Wi-Fi, battery, LEDs, NFC, findings
At a glance
- What is it?
- The mu300-linux project installs Ubuntu or OpenWrt on Unisoc based ZTE 5G routers while leaving Android on the device, and it does so with vendor and mainline kernels that behave differently for charging.
- Who is it for?
- Adopt mu300-linux if you own a ZTE F50 or U30 Air, want a small Linux box with a working 5G modem, and accept an experiment with no warranty and no support line. Do not adopt it if you need a supported product, if your unit is already rooted through other tooling, or if a dead battery would hurt, since mainline kernels at or below v2026.10.11 leave charging off.
- Can I use it commercially?
- Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly C, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
A pocket 5G router that keeps Android and gains a Linux side
The ZTE F50 is a pocket 5G router built on the Unisoc T760, which is the UMS9620, on a board the project names ums9620_2h10_feimao. mu300-linux exists to turn that router into a small Linux computer without throwing the router away. You end up with Ubuntu 24.04 or 26.04 LTS, or OpenWrt in a plain build or one that adds a control panel for the modem, with SSH, Wi-Fi, Bluetooth and the 5G modem working. Android stays installed, and the project says you can go back to it at any time. The ZTE U30 Air is the same board plus a 4050 mAh battery, and the installer recognises which unit it is talking to rather than asking you to declare the model. The comparison the documentation reaches for is a Raspberry Pi that already carries a 5G modem, a Wi-Fi access point and 32 GB of storage inside. That framing matters because it sets expectations: this is a second system on the same hardware, not a replacement for it.
Three kernel stacks decide whether the battery charges
Three kernel builds sit under the install, and the choice changes what hardware actually works. The vendor 5.4 kernel keeps the phone-class charging stack, so the U30 Air charges on that branch. The mainline 6.18 and 7.2 kernels use the bq256xx driver, which the project added in release v2026.10.12. Older mainline kernels, v2026.10.11 and before, leave charging off entirely, so a unit flashed onto one of those runs Linux and ignores the charger. For the U30 Air the project lists 5.4, 6.18 and 7.2 as tested across USB, the Wi-Fi hotspot, Bluetooth, mobile data, VPN and the LEDs. That list is the practical specification sheet. Anything outside it, the F50 side in particular, is territory nobody has signed off. Picking a kernel is therefore not a matter of taste: it decides whether the battery charges and which driver stack owns the USB, modem and power paths.
install.sh --check first, then install.sh, with uninstall.sh in reserve
Installation is a shell script, and the project tells you to look at the device before you change it. Run the check first, then the installer, and keep the removal script within reach:
./install.sh --check
./install.sh
./uninstall.shThe check step is where the installer identifies your model, so a wrong unit is caught before partitions are touched. The target can be internal memory or an SD card, and for a device with no computer attached the project ships Magisk zips that carry the same job. The repository root holds the Windows counterparts install.cmd and install.ps1 next to install.sh, with uninstall.cmd and uninstall.ps1 beside them, and it splits the work across android/, android-vendor/, boot/, kernel/, rootfs/, openwrt/, stock/, upstream/, tools/, gui/, i18n/, docs/, wiki/, site/ and tests/. After a successful run the unit comes back up in Linux with the modem and Wi-Fi in place. The project also keeps a website with step by step pictures and a wiki, and announces new releases on a Telegram channel.
What the installer refuses to do: rooting, unlocking, recovery
mu300-linux draws a hard line around what it will not do. Rooting, bootloader work, patching and recovery are outside the project, and flashing with Magisk, SPD/BROM or any other third-party tool happens under those tools' own instructions, unreviewed by these authors. The project takes that stance because this is a phone-class device: a wrong partition, a power cut at the wrong moment or a bad cable can leave a unit unusable. What the installer does provide is a fallback, since the device returns to Android when Linux fails to start. That is a different promise from a full rescue path. The guidance is to keep a backup and to stay off hardware you cannot afford to lose. The project calls itself an experimental hobby project with no support line and no warranty of any kind, and it says plainly that a release working on one board may not work on yours.
Battery telemetry and the charge limit on the U30 Air
On the U30 Air the battery is exposed in three places at once: the mu300-toolkit, the openwrt-luci dashboard and /sys/class/power_supply on every kernel, with the mainline builds using the sc27xx-fgu driver. Charging itself depends on the kernel as described above, and from v2026.10.20 the project adds a charge limit you can set from the command line:
sudo mu300-power charge-limit 80The same value appears as CHARGE_TO in the power settings and under System > Power in the control panel. Charging stops at the limit and resumes five points below it, and the battery is never held under five percent. The mainline kernels also read the current the Type-C port advertises, so a 1.5 A or 3 A port charges at up to 2 A instead of the 500 mA default. The F50 has no battery at all, powered over USB only, so none of the battery tooling applies to it.
The LEDs carry network state, SIM state and heat warnings
The LEDs are the cheapest way to read radio state, and mu300-linux keeps the vendor semantics rather than inventing new ones. On the F50 the network light shows blue for 4G, white for 5G and red for no service, and the Wi-Fi light stays on while the hotspot is up. The U30 Air adds a battery light that is white from 60 percent, blue from 10 percent and red below that, breathing while charging. Its network light tells you which SIM is in use, white for the nano-SIM and blue for the eSIM, blinking while the device switches between them. Heat has its own pattern. The thermal-guard helper flashes red, white and blue in turn once the SoC reaches 85 degrees Celsius, and on the U30 Air the same warning covers a battery at 50 degrees Celsius, continuing until things cool down.
USB networking addresses and host mode on the U30 Air
Plugging both units into one computer at the same time works because the USB network addresses differ: 192.168.77.1 on the F50 and 192.168.78.1 on the U30 Air. The U30 Air can also act as a USB host, which the F50 cannot do since its only USB port is its power supply:
sudo mu300-usb hostWith an OTG adapter, that mode lists flash drives in FAT and exFAT, keyboards, mice, USB modems and Ethernet adapters, drawing 5 V from the battery. The command that points the port back at the computer is sudo mu300-usb device, which is the default state. This is a small but real difference between the two units, and it decides whether the router can be a small server with attached storage or only a router that talks to the internet over the cell network.
Where mu300-linux stops and other tools take over
Two choices inside the project double as the alternatives worth weighing. The vendor 5.4 kernel is the conservative option: the charging stack that ships with the phone still drives the battery, and the modem path stays the one the vendor tuned. The mainline 6.18 and 7.2 kernels are the modern option with bq256xx handling charge, but they demand a recent release, since anything at or below v2026.10.11 disables charging. Outside the project the alternatives differ in kind. If you want a router running a Linux distribution and have no interest in a cellular modem, buying hardware that ships OpenWrt is less work than adapting a hotspot. If you want a 5G uplink for a server, one of these hotspots running this Linux build can act as the modem itself. And if you want a fully rooted phone, mu300-linux will not get you there; Magisk and SPD/BROM are the tools for that, and this project points you at them instead of shipping its own.
Editorial conclusion
Adopt mu300-linux if you own a ZTE F50 or U30 Air, want a small Linux box with a working 5G modem, and accept an experiment with no warranty and no support line. Do not adopt it if you need a supported product, if your unit is already rooted through other tooling, or if a dead battery would hurt, since mainline kernels at or below v2026.10.11 leave charging off. Before anything else, run ./install.sh --check on the unit, back up the data on it, and confirm which kernel build you plan to flash.
Frequently asked questions
What does mu300-linux install on the ZTE F50 and U30 Air?
Ubuntu 24.04 or 26.04 LTS, or OpenWrt in a plain build or one with a control panel for the modem, with SSH, Wi-Fi, Bluetooth and the 5G modem working. Android stays on the device and you can go back to it at any time.
Which kernels does mu300-linux provide and what is the difference between them?
The vendor 5.4 kernel plus mainline 6.18 and 7.2. On 5.4 the vendor charger stack charges the U30 Air, while on 6.18 and 7.2 the bq256xx driver does it from v2026.10.12, and mainline kernels of v2026.10.11 and older leave charging off.
Does mu300-linux root the device or flash Magisk for me?
No. Rooting, bootloader work, patching and recovery are outside the project, so Magisk or SPD/BROM work is done separately, following those tools' own instructions and at your own risk.
How do I install Linux on a ZTE F50 without a computer attached?
The project ships Magisk zips for a computerless install, and Linux can be written to internal memory or to an SD card. The usual route is still ./install.sh --check followed by ./install.sh.
Can I limit how much the U30 Air battery charges?
From v2026.10.20, yes. A charge limit from 0 to 100 percent is set with sudo mu300-power charge-limit 80, and the same value is exposed as CHARGE_TO in the power settings and under System > Power on the panel. Charging stops at the limit and resumes five points below it.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/dikeckaan-mu300-linux)Was this useful?