网页安装器
在本页面通过 USB,用 Chrome 或 Edge 安装、更新和移除 Linux。电脑上无需安装任何东西。
免费,由土耳其的一个人开发。 赞助本项目
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。如果这里出了问题,请保留日志(页面可以保存),并告诉我们。
正在加载安装器…
开始之前
- 一台已用 Magisk 26 或更新版本 root 的 ZTE F50 / MU300 或 U30 Air。页面会显示设备是否已 root,以及 bootloader 对其锁定状态的说明,但两者都不改动:它不给设备 root,也不解锁 bootloader。
- Windows、macOS 或 Linux 上的 Chrome、Edge 或其他 Chromium 浏览器。Firefox 和 Safari 没有 WebUSB。
- Android 中已打开 USB 调试,设备已接好,且没有其他程序占用它。正在运行的 adb 服务会占用它(用
adb kill-server停止),另一个打开了本页面并已连接设备的浏览器窗口也会。 - 设备最好能上网(装有带移动数据的 SIM 卡):这样设备会自行下载版本。否则由您下载文件再交给页面。
v2026.10.23之后的版本:更早版本的 Magisk zip 不认识本页面。
页面做什么,设备上运行什么
页面是一个小型 adb 客户端。它通过 USB 与设备通信,在设备上做三件事:把项目的几个脚本和该版本的 Magisk zip 放到设备上,用您的选择启动 zip 自带的安装器(也就是 Magisk 应用运行的那个),并显示该安装器的输出。安装、检查和写入顺序都由设备完成,与在 Magisk 中刷入 zip 完全相同。
- 从已 root 的 Android 安装:一个或两个系统、内核、内部存储或 SD 卡、VPN 模块。
- 管理运行 MU300 Linux(已打开 adb)的设备:版本、更新、内核、启动哪个系统、重启、回到 Android、日志。
- 备份安装会写入的内容,以及卸载。
它不会在 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 驱动,浏览器就会被挡住。
Linux
设备节点属于 root,浏览器无权写入。
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。
页面能看到和保存什么
- 它访问 GitHub 的 API 获取版本列表,访问本站获取自己的文件。除此之外没有别的:没有统计分析,没有来自其他网站的字体或脚本。版本本身按您的选择,由设备从 GitHub 下载,或由浏览器从本项目在
raw.githubusercontent.com上的镜像下载。 - 它从不向设备索取 IMEI、IMSI、ICCID 或电话号码,也从不读取存有设备身份和射频校准的分区。
- 序列号以遮盖形式显示。日志中,无论在屏幕上还是在可保存的文件里,序列号、身份号码、电话号码、MAC 地址、密码和密钥都会被遮盖。
- 它在浏览器为本站提供的存储中只保存一样东西:此浏览器的 adb 密钥。
用手机行吗?
Android 上的 Chrome 也有 WebUSB,所以带 OTG 线的手机原则上可以运行本页面。但它不是为此设计的,也没有这样测试过:手机必须在整个安装过程中通过转接线给 F50 供电,而且版本文件得在手机上。请使用电脑。