Android利用容器部署linux

介绍

Termux和Linux Deploy等应用app可以在proot、chroot容器上部署linux。

这里介绍一下proot和chroot:

  • PRoot 是一个 chroot, mount –bind, 和 binfmt_misc 的用户空间实现。这意味着,用户不需要任何特殊权限和设置就可以使用任意目录作为新的根文件系统或者通过QEMU运行为其它CPU架构构建的程序。

    PRoot 通过伪造系统调用的参数和返回值,可以使程序看起来像运行在root用户下,但它并不提供任何方法来真正的提权。确实需要root权限去修改内核或硬件状态的程序将无法工作。

  • chroot,即 change root directory (更改 root 目录),为了进一步提高系统的安全性,Linux引入了chroot机制,chroot是一个系统调用,可以更改一个进程所能看到的根目录。类似创建一个沙盒,进程运行在沙盒之内,进程运行正常与否,并不会影响这个台器的其他进程。

比较 PRoot 与 chroot

chroot和PRoot的一个主要区别是chroot是原生的。PRoot通过使用 ptrace() 劫持系统调用参数和返回值来伪造文件系统布局和用户/组ID。chroot不造成额外的开销,在任何设备上都不会出现问题,但是它需要root权限。

如果你有root过的设备并且希望在Termux中更好的使用Linux发行版,那么请使用chroot。这种情况可以尝试使用 Linux Deploy 这个应用以自动安装Linux发行版。

接下开始介绍Termux和Linux Deploy怎么部署Linux

Termux

使用tetmux不需要root

第一次用这个软件建议先pkg update后再把源换成国内的,具体步骤可自行百度

Termux 在安装好 proot 的情况下,是可以运行 Linux 系统的,利用这个原理,github有大佬写出了 Termux 一键安装 Linux 脚本

项目地址: https://github.com/sqlsec/termux-install-linux

具体安装脚本流程:https://www.sqlsec.com/2020/04/termuxlinux.html#Fedora

Linux Deploy

Linux Deploy是一款可以在Android设备上部署Linux环境的应用,其原理大概是在Android的Linux层跑一个chroot或者proot容器,然后再在容器中运行我们准备好的另外一个Linux系统。值得注意的是,这与我们熟知的虚拟机技术不同,新的Linux系统将和Android系统平行运行(非专业解释不要深究)。

在使用Linux Deploy之前,我们需要获取手机的Root权限(必须),获取Root权限后,由于原机自带的Linux命令集不完整,我们需要安装Busybox来扩充Linux命令集(不安装也可以)。

准备工作

.一台安卓设备(旧手机)

设备硬件要求:建议RAM在1G及以上,手机ROM空闲容量4G左右

设备软件要求:建议安卓版本4.0以上,系统必须是拥有ROOT系统权限的

(我用的是小米mix2s 安卓10)

安装需要的软件

  • Linux Deploy

  • BusyBox

    BusyBox 是一个开源项目,它提供了大约 400 个常见 UNIX/Linux 命令的精简实现。

    BusyBox 是 GNU Coreutils 的绝佳替代品,特别是在操作系统的小尺寸很重要的情况下。

    可以选择不安装,但建议安装

  • JuiceSSH

    一个免费的SSH连接软件

  • 有需要的图形化桌面的可以再安装个VNC viewer

juicessh和VNC我放的是官网的链接,下载需要魔法,没魔法的可以去找资源,实在找不到的可以在下面评论给我留言

busybox的设置

安装路径不改,因为这个路径我们在linux deploy软件的设置中有一个环境变量的选项,就是填入这个,然后更新环境变量,安装组件和替换组件勾选

2564615615

回到主页点击安装,安装完成以后查看安装信息,显示下面的就是安装完成,现在手机基本都是aarch64,也就是arm64的

9846131

如果安装busybox失败,另一种安装方式

上面直接用apk来安装busybox一般来说没有出现fail都是成功了,但我就是出现fail,安装失败了,然后我就用另一种安装方式了

1.下载BusyBox的binary

我旧手机mix2s的骁龙845支持armv7l,所有我下载了arm71

下载了之后找到它,改名为 busybox

2.把busybox移动到手机的/system/xbin

我用宿主机操作,已经下载了adb shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@ubuntu:~# adb shell
ploris:/$ su
#把根目录挂载成可读可写模式
ploris:/# mount -o rw,remount,rw /system

#如果以上命令出现错误提示“Operation not permitted”,则需要先执行以下命令,禁用SELinux:
ploris:/# setenforce 0

ploris:/# mkdir /system/xbin
ploris:/# cp /sdcard/busybox /system/xbin

#把根目录重新挂载成只读模式
ploris:/# mount -o remount,ro /

#(要注意,尾部的那个点也是命令内容,表示安装在当前目录)
ploris:/system/xbin# busybox --install .

linux deploy的设置

在左上角三个横杠打开设置

打勾三个的都点亮,正式运行的时候屏幕黑掉之后,后天运行会非常卡,建议点亮

165161681

开机自动启动根据自己的需求设置,其它的默认就好

1587646427613234

PATH变量填入安装BusyBox的路径,这个很重要

在这里插入图片描述

telnet这个可以开一下,ssh连不上可以用telnet连接

在这里插入图片描述

然后在右下角停止旁边的三个横杠打开配置

安装类型默认的是镜像文件,我选择的是目录,安装完成以后能和手机共享磁盘空间

选择镜像安装的要注意镜像大小要分配2G以上,或者直接10240M

配置源地址方式有两种,一种是在线安装,另一种是tar包安装

在线安装

img

tar包安装

tar打包linux具体可看我另一篇制作rootfs的博客,这里安装类型也建议改为目录

img

其它配置

本地化选择中文包就可以了

在这里插入图片描述

sdcard挂载到根系统img

启用SSH打勾,建议更改SSH的端口,例如7777,8888,22端口可能会在手机上被别的服务占用,SSH可能会连接不上

图形界面有需求可选择打勾安装

img

这样就配置完成了

安装

245614151

configuring extra/ssh 没有fail

<<<deploy

说明安装完成

824641148

安装完成后一定要先点停止后再点启动!!!

不然直接点启动又会重新安装一遍。

用JuiceSSH连接

用SSH连接时注意你配置时有没有更改端口

562411