问题解决:在 Android 上的 Ubuntu chroot 环境中运行 apt-get update 失败

我在 Android 设备(采用 armhf/x64 架构)的 chroot 环境中安装了 Ubuntu 。一切运行正常。所有本地命令以及 wget 和 curl 都能正常工作。然而,apt-get 却失败了。

我在 Android 设备(采用 armhf/x64 架构)的 chroot 环境中安装了 Ubuntu 。一切运行正常。所有本地命令以及 wget 和 curl 都能正常工作。然而,apt-get 却失败了。问题如下:

  1. 执行 sudo apt-get update 时出现错误:解析 ports.ubuntu.com 暂时失败(其他程序如 wget 和 curl 能成功访问该域名)。我已通过 ping 命令获取了服务器 IP,并据此修改了 /etc/apt/sources.list 文件
  2. 执行 sudo apt-get update 又出现另一个错误:无法为 91.189.88.150 (f=2 t=1 p=6) 创建套接字 - 套接字 (13: 权限被拒绝)
  3. 好吧,于是我将所有 apt-* 程序设为 suid 权限:sudo chmod u+s /usr/bin/apt-*

为排除特定 apt-get 版本的影响,我已通过 apt-get 自身卸载了 apt,并成功使用 dpkg 安装了 apt.deb 包,但问题依然存在。

Ubuntu上这个基本功能似乎失效了,这非常令人惊讶,可能是armhf架构包特有的问题。我在Stack Overflow上似乎找不到关于此问题的报告。不过,我在Reddit的 /r/debian 版块确实发现另一位用户报告了类似情况,但该问题尚未得到解决。

有什么建议吗?

据我所知,在 Debian chroot 环境中使用 setsid 切换到 root 用户是行不通的,这是因为 Android 的安全策略(sepolicy)。也许 Android 的安全策略中有一条规则,例如:“要使用网络,必须拥有 inet 的组 ID(即 3003,如 adb shell id 所示)”。也许它还规定:“拥有 setsid root 权限是无效的”。

因此,要使之生效,你必须在 Debian chroot 环境中添加一个 GID 为 3003 的组(可能命名为 aid_inet):sudo addgroup --gid 3003 aid_inet,然后将 _apt 的主组 ID 更改为 aid_inet:sudo usermod -g aid_inet _apt

将 android_inet 作为 _apt 的辅助组添加是行不通的,因为这不符合 Android 安全策略的要求。

addgroup --gid 3003 --system aid_inet
元素周期表抱枕

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注


京ICP备12002735号