AI 生成披露:封面由 AI 生成。

最近朋友 @AronnaxM 给我发了个酷安帖子,令人眼前一亮——直接在安卓上用 Droidspaces-OSS 跑起来一个完整的 Linux 发行版容器!?太有意思了,正好我手上有一块 MI PAD 6 Pro,正好是酷安大佬支持的机型,就立马上手操作了。

放低期待

先说结论:能起来一个可用的服务器,但是无法启动桌面环境。大佬给的那个“教程”的类似物完全就是碎成渣了,根本无法复现。不过能跑一个无桌面环境的 Linux 已经很不错了~

先决条件

  • 解开 BL 锁
  • 酷安大佬内核支持,或你有自行编译内核的能力

刷入系统 boot 分区

首先,你的内核不一定能够把 Droidspaces 跑起来,因为需要内核支持:

内核检查

下载大佬的 boot 镜像,或自行编译内核后,放到你的手机/板子里面。

编译内核

由于我的 MI PAD 6 Pro 已被大佬的 GKI 测试通过,所以编译内核不在本文的讨论范围内。请参阅 DroidSpaces 官方教程,完成内核编译,才能通过上述检测。

由于 Droidspaces 需要 root 支持,上述下载或编译的 boot 必须进行修补,才能让 KernelSU 加载(是的,这和正常获取 root 并没有什么不同)。

支持的 root

这里查看支持的 root 方案。选择 KernelSU 是最佳的。

kernelsu 修补 boot,这个是 root 的基本操作了。把修补后的 boot 复制到电脑上,进入手机 fastboot 模式:

1
2
3
adb reboot bootloader
fastboot flash boot xxxx.img
fastboot reboot

就这么两行老掉牙的命令,刷入 boot 开机。

不出意外的话,你应该能正常进入系统。用 KernelSU 给 Droidspaces 赋予 root 权限:

给 root

现在打开 Droidspaces,过一下引导(安装模块等),然后右上角设置,选择“要求”(Droidspaces 运行要求):

运行要求检查

你现在应该能看到所有选项都是绿色的勾:

内核检查

当你看到绿勾,说明可以跑 linux 发行版了!

启动你的第一个容器

按照原来项目的说法,要启动 Linux,你必须获取 rootfs 的镜像。这可以在 Linux Containers 镜像列表中找到。

下载对应你的机型的架构的镜像(通常是 arm64),然后复制到你的手机/平板上。比如,我想要这个 debian 13 的系统:

点这个时间开始下载!

要创建一个新的容器,切换到“容器”页面,点击右下角的加号,然后在弹出的文件选择中,选择你刚才获取的镜像。

然后给容器起个名字,设定主机名:

Debian 容器命名

点击下一步,打开你想要的设置,比如挂载存储(强烈推荐!打开挂载,存储容器里面就能直接访问手机上的文件了):

配置设置

自行探索

开头提到过,桌面环境怎么都起不来。所以硬件访问和 Termux 没啥用。如果有谁成功了,欢迎联系我分享你的做法(发个邮件,或者在 fediverse 上发个私信都可以~)。

开机自启动自己想开就开。安全与启动页面建议默认,我对内核这块了解不多,所以没办法和各位分享它们的含义,能看懂的评论区见

开机进入终端

点一下播放按钮,开机。现在,你的容器应该已经在运行了:

运行中的容器

接下来,我们连接到容器。选择面板,选中活跃容器底下你的容器名字,你应该能看到这个:

容器操作

这个界面应该一看就会了吧?点第二个打开,就能直接进入你新安装的系统了。点击管理,可以直接管理系统的 systemd(方便~)

现在来看看“复制登录命令”。这个按钮允许你在外部终端(只要有宿主手机/平板 root 权限的 shell),直接通过复制的命令进入你的 Linux。

比如,adb shell(记得在 KernelSU 里面给 shell root 权限):

直接用上 adb

现在你就可以干你想干的事情了。(别尝试跑 docker 了,嵌套虚拟化很困难的)

网络问题?

现在就要涉及到这篇文章最有含金量的地方了:网络。

Debug 了几个小时

不知道你是否记得,你在安装容器的时候,网络选项中选择了“主机”。这就让容器和宿主机拥有了完全相同的网络环境!

然后我就发现:容器内 DNS 炸了。

理论上来说这不该发生,因为容器和外部共享网络和魔法环境。

经过一个小时的 debug,我突然想起来:

我的宿主机,安装了 magisk-tailscaled!而 tailscale 有一个功能,Magis DNS

If you add a new web server called my-server to your network, you no longer need to use its Tailscale IP: using the name my-server in your browser’s address bar or on the command line will work.
MagicDNS does not require a DNS nameserver if running Tailscale v1.20 or later. Otherwise, your network must have at least one DNS nameserver set in the DNS page of the admin console. These nameservers will receive all DNS queries not handled by MagicDNS.

也就是说,它会对系统的 DNS 进行干扰!这就导致了容器内“可以 Ping 通任何 IP,但是无法解析任何域名”的问题,这个问题在魔法+容器网络环境下彻底被暴露出来。

要解决也很简单,在 adb 里面执行

1
2
3
4
su
tailscale set --accept-dns=false
tailscale down
tailscale up

直接解决问题!

坑人的 DNS

tailscale 这个默认开启的 DNS 已经坑了我好多次了。关掉保平安~

好了,这就是本文的全部内容了!很可惜的一点是,我无法复现 boot 镜像作者的桌面环境。或许过一段时间,作者会自己更新教程,那时候再说~