找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 140|回复: 4

[教程] 在安卓设备上获得一个linux发行版容器:(共四类)

[复制链接]
发表于 6 小时前 | 显示全部楼层 |阅读模式
本帖最后由 winpefk 于 2026-7-5 13:25 编辑

注: 以下内容人工智能生成, 感谢阅读!


如标题, 据我所知: 短视频平台和头条类网站上的 分享者, 会教你用 proot 这个 基于ptrace的 rootless container daemon, 这无可厚非, 毕竟大多数android机器并不开放root.


然而, proot 的缺陷是十分明显的: 在 cortex a73 - cortex a53 的SoC上, 计算性能的确不是问题, 但io性能几乎是崩: 由于网络通讯的rootless协议栈完全由slirp库完成, nat 操作完全是 cpu 进行, 在收发大量小文件(apt install)的时候, 下载速度仅2~3MB/s, [而下载大文件(llvm-19.deb)时, 可以到达10MB/s, 这证明不是emmc瓶颈]


同样的, 小文件io也是很差的. 因此不应该指望拿它编译软件
拿删除(rm)一个linux源码树文件夹举例:
瞬时, proot的单核处理器占用比率到达100%
等待50s后删除完毕
而chroot容器中却只需15s.


那么,有什么解决方案呢, 以下内容针对解锁bootloader的设备


1: (要求最低) chroot 容器
首先, 你需要一个有效的root环境 (supersu, magisk, kernelsu, apatch), 只需能执行 su, 并且能提权到一个正常的rootshell.


其次, 你需要termux, 可以从fdroid的国内镜像源下载.


鉴于目前许多容器管理器(tmoe-linux)都停止更新, 我这里提供一个rootfs构建脚本和登陆脚本(都需termux下运行, 在此之前请 apt update && apt upgrade && apt install debootstrap fakeroot proot -y )


根文件系统构建和后续修补:

  1. # Android chroot container builder
  2. # The script is designed for arm64 arch, you may change it for yourself
  3. # Use proot for the network access in early stage

  4. id=$(whoami)
  5. rootfs=$1
  6. unset LD_PRELOAD
  7. if [ $id != root ];then
  8. echo No Permission to get proceed.
  9. exit
  10. fi

  11. path_set="/usr/bin/busybox env PATH=/usr/bin:/usr/sbin:/bin:/sbin"

  12. in_container="proot -r $rootfs --sysvipc -w /tmp -b /dev -b /proc -b /sys"

  13. debootstrap --include=fakeroot,busybox-static,strace --download-only --arch arm64 --variant=minbase stable $rootfs https://mirrors.tuna.tsinghua.edu.cn/debian
  14. debootstrap --include=fakeroot,busybox-static,strace --arch arm64 --variant=minbase stable $rootfs https://mirrors.tuna.tsinghua.edu.cn/debian

  15. echo Base rootfs has been built, performing minor fixing.

  16. $in_container -0 $path_set /usr/bin/apt reinstall passwd -y # debootstrap installed a stub addgroup program which brokes the groupadd commmand
  17. $in_container -0 $path_set /usr/bin/apt reinstall perl-base -y #de.. use l2s(link2symlink) in proot. broke the hard link.
  18. $in_container -0 $path_set /usr/bin/apt reinstall coreutils -y

  19. # here are proofs:
  20. # in debootstrap(termux version)
  21. # .../usr/share/debootstrap/scripts/debian-common
  22. #         Replace problematic binaries with a stub
  23. #         echo "" > "$TARGET/bin/chown"
  24. #         echo "" > "$TARGET/usr/sbin/groupadd"
  25. # ...

  26. $in_container -0 $path_set /usr/bin/apt clean
  27. $in_container -0 $path_set /usr/sbin/groupadd -g 3003 aid_inet
  28. $in_container -0 $path_set /usr/sbin/usermod -g aid_inet _apt
  29. $in_container -0 $path_set /usr/sbin/usermod -G aid_inet root
  30. #
  31. $in_container -0 $path_set /usr/bin/chmod 644 /etc/resolv.conf
  32. # newly found bug: chroot mode failed to set correct file permission flag
  33. # so containers running in chroot using sandbox cannot connect to the internet.

  34. # fix /tmp access
  35. $in_container -0 $path_set /usr/bin/chmod -R 777 /tmp/
  36. #
  37. # fix apt access
  38. $in_container -0 $path_set /usr/bin/chown _apt:aid_inet -R /etc/apt/
  39. #

  40. echo "All done!"
  41. echo "for proot container, don't use the script, use proot-distro instead."
  42. echo "If you want to build a rootfs for yourself without root access., try 'fakeroot debootstrap' instead."
复制代码


登陆容器:
  1. unset LD_PRELOAD
  2. mount -t proc proc $1/proc
  3. mount --bind /dev $1/dev
  4. mount --bind /dev/pts $1/dev/pts
  5. mount --bind /sdcard/Download $1/mnt
  6. mount -t sysfs sys $1/sys
  7. chroot $1/ usr/bin/su -l
  8. echo cleaning...
  9. umount -l $1/dev/pts
  10. umount -l $1/dev
  11. umount -l $1/mnt
  12. umount -l $1/proc
  13. umount -l $1/sys
复制代码

登陆后,可以安装dropbear或者openssh

这样的容器也有弊端:
即使io速度上去了, 但是却无法使用systemctl等工具, 无论如何环境是不完整的, 同样的, 一些软件仍然需要手工指定关闭沙盒 (chromium, vscode ...), 况且容器内外相互干扰, 如果你想要把手机改为局域网网关之类的 (比如使用squid进行透明的网页访问管理, 外加 watt toolkit 进行steam加速), 你会发现 通讯并不稳定, 常常连该机器ip都ping不通, 这是安卓的netd等系统服务在干扰, 它以为自己独占整个无线网卡. 因此chroot方案个人用起来并不顺手

这时候, 你需要修改内核:
一般地来说, 如果你不跑docker, 用我这里的丐版方案, 只需要重编译内核,开启以下选项:
CONFIG_UTS_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
如果需要 容器内 对 容器外 网络的直接访问:(就像独立的主机插了一网线连到和物理机器相同的网络上)
CONFIG_MACVLAN=y

然后你刷入改版内核, 理论上可以 unshare --pid --uts --net --user ./rootfs/sbin/init 了

关于macvlan虚拟网卡的创建和移动, 我回头再讲, 且让我看看这个话题大家是否关心.

下一类, 需要支持 avf (android virt framework), 直接在root的adb shell下执行 ..., 不过这个框架下, 虚拟网卡只能以 tun, tap 形式存在, 那么你就需要 内核支持:
CONFIG_BRIDGE
和 CONFIG_MACVLAN

把macvlan创建的虚拟网卡桥接于tap网卡 (我没试过,不知道能不能成)

发表于 6 小时前 | 显示全部楼层
貌似会有用,先收藏一份再赞!
回复

使用道具 举报

发表于 5 小时前 | 显示全部楼层
回复

使用道具 举报

发表于 5 小时前 | 显示全部楼层
你这写的跟AI搞也没大差了
回复

使用道具 举报

发表于 1 小时前 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-7-5 20:13

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表