当前位置:   article > 正文

如何在安卓手机中安装Arch Linux chroot 容器_安卓手机安装容器

安卓手机安装容器

什么是chroot容器?

chroot是Linux发行版中一个用于将进程隔离在一个受限空间的软件,而由于将进程隔离到了受限空间中,我们只需要将系统运行所必要的分区挂载在这个隔离出来的受限空间中就可以使用chroot运行一个与宿主系统共用内核的容器系统了。内核基于Linux的安卓系统当然也是可以使用chroot的,但是需要root权限。接下来我们就来在已root的安卓设备上安装一个Linux容器吧。

前置要求

Root权限

首先你的安卓手机需要获得root权限,这里就不说了,可以看看我的其他博客。

终端模拟器

然后你需要一个终端模拟器来操作root shell,建议使用termux

首次进入termux中,我们先换国内源来提高下载速度:

termux-change-repo
  • 1

使用上下箭头键来切换选项,使用空格选中选项,回车键确定选项,选tsinghua(清华大学)、ustc(中国科技大学)、bfsu(北京外国语大学)等大学的源即可。

回车后会自动更新源索引文件,我们再手动更新下自带软件:

pkg upgrade -y
# 可简化成
pkg up -y
  • 1
  • 2
  • 3

然后再运行一次termux-change-repo,选Single Mirror,将我们之前选的镜像源再选中确定一次。

使用以下命令给termux赋予存储读写权限:

termux-setup-storage
  • 1

必要软件

如果想使用Magisk赋予termux root权限,那么需要使用tsu来申请root权限。

Tips:KernelSU可直接跳过此步,在KernelSU的管理器中给termux root权限并重新启动termux即可

pkg install tsu -y
# 可简化成
pkg i tsu -y
# 从Magisk获取root权限
tsu
  • 1
  • 2
  • 3
  • 4
  • 5

下载rootfs

这里我们选择Arch Linux ARM系统来作为我们的容器系统,我们在官网可以下载到,一般的安卓设备选择名称为ARMv8 AArch64 Multi-platform、文件名为ArchLinuxARM-aarch64-latest.tar.gz的rootfs下载即可。

可以在termux里使用wget或者curl下载,或者用安卓自带浏览器下载,只要你知道下载到哪里就行。

解压rootfs

我们首先创建一个用于存放容器文件系统的目录,这里我选择在 /data/linux 下创建一个叫 arch 的目录。

# 先进入root shell
su
# 创建目录
mkdir -p /data/linux/arch
  • 1
  • 2
  • 3
  • 4

然后我们将下载的rootfs压缩包解压缩到这个目录中(假设你已经cd到了下载压缩包的目录):

tar zxpf ArchLinuxARM-aarch64-latest.tar.gz -C /data/linux/arch/
  • 1

创建/dev/shm

因为我们可能会用chroot容器来运行一些基于chromium内核的软件,比如electron应用以及chromium本体,所以我们需要创建/dev/shm这个目录来让这些软件能够正常运行。

# 在宿主机文件系统中创建
mkdir /dev/shm
# 在容器文件系统中创建
mkdir /data/linux/arch/dev/shm
  • 1
  • 2
  • 3
  • 4

编写启动脚本

我们需要挂载一些宿主机的分区到容器系统才能驱动让其成为一个独立运行的容器,所以我们来编辑chroot容器的启动脚本。我们先使用exit来退出root shell,然后输入nano a来创建并编辑一个名叫a的脚本文件,在其中输入以下内容:

#!/bin/sh
ARCHPATH=/data/linux/arch
TERMUX_PREFIX=/data/data/com.termux/files/usr
mount -o remount,dev,suid /data
mount -t tmpfs -o size=256M /dev/shm $ARCHPATH/dev/shm
mount -o bind /dev $ARCHPATH/dev
mount -t devpts devpts $ARCHPATH/dev/pts
mount -o bind /sys $ARCHPATH/sys
mount -o bind /proc $ARCHPATH/proc
mount -t tmpfs tmpfs $ARCHPATH/tmp
chroot $ARCHPATH /bin/su - root
umount -f $ARCHPATH/dev/pts
umount -f $ARCHPATH/dev
umount -f $ARCHPATH/sys
umount -f $ARCHPATH/proc
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

CTRL + X保存后我们再次使用tsu进入root shell,最后输入./a即可启动容器。

新建用户与配置用户组

作为一个“普通”的Linux用户,我们肯定不能在平常用root用户的,我们进容器后第一件事就是创建一个新的用户:

useradd -m -s /bin/bash axis
passwd axis
# 建议顺便也改下root用户的密码
passwd root
  • 1
  • 2
  • 3
  • 4

axis是我自己定的用户名。

Android只允许在某些用户组里的用户执行某些操作,在chroot容器中也是如此。

使用以下命令添加用户组并将新建的用户加入其中:

groupadd -g 3001 android_bt
groupadd -g 3002 android_bt-net
groupadd -g 3003 android_inet
groupadd -g 3004 android_net-raw
groupadd -g 1015 sdcard-rw
groupadd -g 1028 sdcard-r
gpasswd -a axis android_bt
gpasswd -a axis android_bt-net
gpasswd -a axis android_inet
gpasswd -a axis android_net-raw
gpasswd -a axis sdcard-rw
gpasswd -a axis sdcard-r
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

大功告成之后我们不急着换用户,先用着root,可以少打点sudo和密码。

如果需要这个普通用户在使用root权限运行命令时不需要输入密码,可以自行编辑 /etc/sudoers,当然你需要先使用pacman安装sudo后才会有这个文件,因为容器系统里并不自带sudo这个软件。

解决DNS问题

/etc/resolv.conf默认是一个链接到/run/systemd/resolve/resolv.conf的链接,而我们chroot容器是没有systemd的,所以我们需要重新创建/etc/resolv.conf

rm -rf /etc/resolv.conf
touch /etc/resolv.conf
  • 1
  • 2

我们nano /etc/resolv.conf来编辑一下里面的内容,加入以下几行:

# 谷歌DNS
nameserver 8.8.8.8
# 国内高速DNS
nameserver 114.114.114.114
  • 1
  • 2
  • 3
  • 4

如果不解决DNS的问题,我们在第二次启动容器时会连不上网络。

更新系统软件

在使用pacman更新系统软件之前,我们先导入公钥。

pacman-key --init
pacman-key --populate
  • 1
  • 2

导入完成后就可以愉快的更新了:

# 在更新前可以编辑 /etc/pacman.conf 将 ParallelDownloads = 5 取消注释以提高下载速度
pacman -Syyu base-devel --noconfirm
  • 1
  • 2

Tips:如遇到error: could not determine cachedir mount point /var/cache/pacman/pkg 的情况,需要编辑 /etc/pacman.conf,将其中的CheckSpace注释起来。

配置软件源

ArchLinuxARM默认的软件源在国外,对大陆用户不太友好,这时我们可以替换为大陆的镜像源来提高pacman的下载速度。

/etc/pacman.d/下的mirrorlist改名为mirrorlist.bak来备份下原本的软件源。

mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
  • 1

重新创建并编辑/etc/pacman.d/mirrorlist

nano /etc/pacman.d/mirrorlist
  • 1

在其中加入以下几行从tmoe脚本那抄过来的软件源:

## Archlinux arm
Server = https://mirrors.ustc.edu.cn/archlinuxarm/$arch/$repo
Server = https://mirror.archlinuxarm.org/$arch/$repo
Server = https://mirrors.bfsu.edu.cn/archlinuxarm/$arch/$repo
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/$arch/$repo
Server = https://mirrors.163.com/archlinuxarm/$arch/$repo
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

编辑完保存后我们使用pacman -Syu来更新一下。

我们还可以添加一些额外的软件源,比如archlinuxcn、arch4edu、blackarch,我们编辑/etc/pacman.conf

nano /etc/pacman.conf
  • 1

在文件末尾加入以下文本:

[arch4edu]
Server = https://mirrors.bfsu.edu.cn/arch4edu/$arch
Server = https://mirrors.tuna.tsinghua.edu.cn/arch4edu/$arch
Server = https://mirror.autisten.club/arch4edu/$arch
Server = https://arch4edu.keybase.pub/$arch
Server = https://mirror.lesviallon.fr/arch4edu/$arch
Server = https://mirrors.tencent.com/arch4edu/$arch
SigLevel = Never
[archlinuxcn]
Server = https://mirrors.bfsu.edu.cn/archlinuxcn/$arch
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch
Server = https://repo.archlinuxcn.org/$arch
SigLevel = Never
[blackarch]
Server = https://mirrors.ustc.edu.cn/blackarch/$repo/os/$arch
Server = https://mirrors.tuna.tsinghua.edu.cn/blackarch/$repo/os/$arch
Server = https://mirrors.aliyun.com/blackarch/$repo/os/$arch
Server = https://www.blackarch.org/blackarch/$repo/os/$arch
SigLevel = Never
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

配置语言

容器的默认语言是英文,如果需要将其改成中文,我们需要手动生成语言包并将系统语言配置成中文。

编辑/etc/locale.gen,找到zh_CN.UTF-8,将这俩行取消注释。

在shell中输入:

sudo locale-gen
  • 1

等待生成完毕,我们编辑/etc/locale.conf,将其中的LANG=C替换成LANG=zh_CN.UTF-8,之后重启容器即可。

配置时区

如果你在容器里使用date命令你会发现你的容器内时间是不对的,是标准的零时区时间,为了同步我们自己的时间,我们需要把时区文件软链接到/etc/localtime来改变容器的系统时区。

时区文件在/usr/share/zoneinfo/下,我们需要在下面找到符合我们时区的城市。北京时间的设置如下:

ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  • 1

之后重启容器即可。

在容器内用exit可以退出容器回到termux,在termux中输入./a则可以启动容器。

安装图形界面

我们装个xfce来当图形界面,因为只装WM真的太折磨人了,你连壁纸软件都得另外装,可能还不如装xfce这种轻量化的DE。使用以下命令在Arch中安装xfce桌面:

sudo pacman -Syu xfce4 xfce4-goodies
  • 1

精简系统

对于一个不需要引导和加载的容器系统来说,/boot分区里的东西直接删了都没关系,另外,我们也不需要更新 ramdisk,所以我们可以直接卸载 mkinitcpio 和删除 /boot 分区下的内容。

sudo pacman -Rsc mkinitcpio
sudo rm -rf /boot/*
  • 1
  • 2

这么整可以省出几百MB的存储空间,还是很香的。

使用termux-x11显示图形界面

将启动脚本中的mount -t tmpfs tmpfs $ARCHPATH/tmp改为mount -o bind $TERMUX_PREFIX/tmp $ARCHPATH/tmp

然后我建议启动容器时将selinux设置成宽容模式,并将/tmp取消挂载,这样不会产生一些莫名其妙的bug,然后为了少打个su来启动root终端,因为我换到了kernelsu,不用tsu了,所以直接用su -c ""来用root权限运行命令。最终的容器启动脚本如下:

#!/bin/sh
ARCHPATH=/data/linux/arch
TERMUX_PREFIX=/data/data/com.termux/files/usr
# KernelSU 可注释下行
su -c "setenforce permissive"
su -c "mount -o remount,dev,suid /data"
su -c "mount -t tmpfs -o size=256M /dev/shm $ARCHPATH/dev/shm"
su -c "mount -o bind /dev $ARCHPATH/dev"
su -c "mount -t devpts devpts $ARCHPATH/dev/pts"
su -c "mount -o bind /sys $ARCHPATH/sys"
su -c "mount -o bind /proc $ARCHPATH/proc"
su -c "mount -o bind $TERMUX_PREFIX/tmp $ARCHPATH/tmp"
pkill -f "/system/bin/app_process / com.termux.x11.Loader :0 -ac"
nohup termux-x11 :0 -ac >/dev/null 2>&1 &
su -c "chroot $ARCHPATH /bin/su - axis"
su -c "umount -f $ARCHPATH/dev/pts"
su -c "umount -f $ARCHPATH/dev"
su -c "umount -f $ARCHPATH/sys"
su -c "umount -f $ARCHPATH/proc"
su -c "umount -f $ARCHPATH/tmp"
# KernelSU 可注释下行
su -c "setenforce enforcing"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

记得在容器内的/etc/profile的末尾添加此行来让挂载的tmp目录在容器内可读写:

sudo chmod -R 777 /tmp
  • 1

参考文献

[Root] 手機Termux建立chroot Ubuntu環境,免Linux Deploy · Ivon的部落格
在 Android 上创建 GNU/Linux 容器 - 约伊兹的萌狼乡手札
TMOE 脚本

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/708527
推荐阅读
相关标签
  

闽ICP备14008679号