网页安装器

在本页面通过 USB,用 Chrome 或 Edge 安装、更新和移除 Linux。电脑上无需安装任何东西。

已在一台 F50 上用 macOS 的 Chrome 测试

2026-10-13,本页面在一台 ZTE F50(64 GB,Android 13,Magisk 30.6)上用 macOS 的 Chrome 155 和版本 v2026.10.25 从头到尾运行过:安装一个系统和两个系统(由设备自行下载版本,以及手动选择文件两种方式)、安装中途关闭标签页、启动 Linux、管理它、回到 Android,以及卸载。

尚未测试:Windows(那里 adb 接口需要 WinUSB 驱动)和以 Linux 作为电脑系统(需要下文的 udev 规则);U30 Air;以 SD 卡为安装目标;Magisk 以外的 root 管理器;以及设备通过真实移动数据自行下载(测试设备的 Android 没有网络,它的下载是经由测试电脑到达 GitHub 的)。这些情况下,经过测试的方式是电脑安装器和 Magisk zip。如果这里出了问题,请保留日志(页面可以保存),并告诉我们。

开始之前

页面做什么,设备上运行什么

页面是一个小型 adb 客户端。它通过 USB 与设备通信,在设备上做三件事:把项目的几个脚本和该版本的 Magisk zip 放到设备上,用您的选择启动 zip 自带的安装器(也就是 Magisk 应用运行的那个),并显示该安装器的输出。安装、检查和写入顺序都由设备完成,与在 Magisk 中刷入 zip 完全相同。

它不会在 32 GB 型号上缩小 Android 的数据分区(只显示数字并指向电脑安装器),也不会把它扩回去。

您选择系统、内核和版本;页面会说明这一选择对应的文件及其大小,并在您不必下载任何东西的情况下把它送到设备上:它让设备自行下载该文件(从本项目在 GitHub 上的版本,通过设备自己的网络连接),并显示进度。中断的下载会从断点继续。这会消耗设备与文件大小相当的移动数据(每个系统 39 到 124 MB),运营商可能按流量计费。如果设备没有网络,页面会如实说明,并改由这台电脑下载文件:从本项目在 GitHub 上的版本镜像获取,再通过数据线发送(GitHub 不允许网页读取版本自身的文件,所以项目在网页可以读取的地方保留了一份副本)。最后的办法是您自己下载文件并选择它。

无论文件通过哪种方式到来,设备只在它与 GitHub 为该版本公布的校验和一致时才使用它;这个校验和由浏览器直接从 GitHub 读取。文件的完整性来自这个固定的校验和,而不是它所经过的连接:设备上的下载工具(Magisk 的 busybox)无法验证 GitHub 的证书,因此不会因为文件“看起来来自哪里”而信任它。页面还会把下载限制在版本所标明的大小之内,并中止被转到 GitHub 以外地址的下载。

如果浏览器无法打开设备

所有系统

正在运行的 adb 服务(Android Studio、终端里的 adb、scrcpy、某些手机工具)占用了设备,或者另一个浏览器窗口打开了本页面并连接着设备。同一时间只能有一个程序与设备通信。

adb kill-server,关闭这些程序以及那个窗口或标签页,然后重新连接。如果原因在此,页面会提示“有别的程序正在使用设备”。

Windows

浏览器只能使用装有 WinUSB 驱动的接口。在多数设备上,Android 的 adb 接口会自行向 Windows 请求它;F50 和 U30 Air 是否如此尚未实测。如果那里装的是厂商自己的 adb 驱动,浏览器就会被挡住。

在设备管理器中查看设备的“ADB Interface”。如果它用的是其他驱动或没有驱动,请安装 Google 的 USB 驱动(它就是 WinUSB),或用 Zadig 给该接口绑定 WinUSB。只改 adb 接口,不要改网络或调制解调器接口。

Linux

设备节点属于 root,浏览器无权写入。

为 adb 接口添加一条 udev 规则,然后重新插入设备:
echo 'SUBSYSTEM=="usb", ATTR{bInterfaceClass}=="ff", ATTR{bInterfaceSubClass}=="42", MODE="0660", TAG+="uaccess"' | sudo tee /etc/udev/rules.d/51-adb-webusb.rules
sudo udevadm control --reload && sudo udevadm trigger
以 snap 或 flatpak 方式安装的浏览器可能还需要单独的 USB 权限。

macOS

无需安装任何东西。只有其他程序占用设备时浏览器才会受阻。

退出该程序。

在浏览器能告知的范围内,页面会说明遇到的是哪一种情况。

管理 MU300 Linux:先打开 adb

从 v2026.10.23 之后的版本起,Linux 通过同一根线向所有电脑提供 adb,页面无需任何准备即可管理它。更早的 Linux 默认关闭 adb(sudo mu300-usb adb on);被设置为只接受已授权密钥的系统,则只让它认识其 adb 密钥的电脑接入;没有可供询问的屏幕。此浏览器有自己的密钥(页面在“此浏览器的 adb 密钥”下显示)。要为它授权,请在设备上通过 SSH 运行:

echo '<页面显示的密钥行>' | sudo mu300-usb adb key -
sudo mu300-usb adb on

持有已授权密钥的人可以获得设备的 root shell,所以只给您自己的浏览器和电脑授权。

如果标签页被关闭或数据线脱落

安装是设备上的一项任务。它不需要本页面:关闭标签页、浏览器崩溃或电脑休眠,结束的只是页面对它的观察,而不是任务本身。重新连接后,页面会显示进行到哪一步。从 F50 上拔掉数据线就是断电(它没有电池);U30 Air 会继续运行。

在这一步中断设备的状态
发送文件、制定计划、构建启动镜像存储中没有写入任何内容。它启动 Android。
安装系统留下一个未完成、没有任何东西会启动它的 Linux 文件系统。启动分区和 misc 没有改动:它启动 Android。请再次运行安装。
写入启动镜像只写入 Linux 槽位的启动分区,绝不写 Android 的。写到一半的镜像不是启动目标:让设备尝试它的那 32 个字节最后才写,而且是在镜像读回校验之后。它启动 Android。
准备启动(misc 的 32 个字节)一次很小的写入,写后读回,校验不通过就撤销。那里要么是 Android 的块,要么是 Linux 的试启动块。
此后设备尝试启动 Linux;没能完成启动的 Linux 会自行回退到 Android。

卸载的顺序正好相反:先把 Android 设为启动的系统,再把 Android 的启动镜像放回 Linux 槽位,最后擦除 Linux 文件系统。无论在哪一步中断,设备启动的都是 Android。

页面能看到和保存什么

用手机行吗?

Android 上的 Chrome 也有 WebUSB,所以带 OTG 线的手机原则上可以运行本页面。但它不是为此设计的,也没有这样测试过:手机必须在整个安装过程中通过转接线给 F50 供电,而且版本文件得在手机上。请使用电脑。