使用Termux安装旧版linux发行版
前言
由于最近公司的软件需要适配国产服务器,而现在的国产服务器大多都是用的arm架构的麒麟芯片和魔改的centos,导致了运行环境的glibc等库的版本非常旧,由于linux的库的逻辑,用新版本库编译的软件是没法用旧版本的库去运行的
我希望的是能让软件尽量做到一次编译就能在大多数环境下运行,而我又嫌麻烦不想在新版的系统里修改glibc等环境,所以装一个旧的系统就成为了首选,目前我打算用的是ubuntu18
再由于公司暂时没有一个比较长期且稳定的arm平台开发环境,于是我便想在手机里面配一个linux环境用于开发,毕竟手机的处理器也是arm的
目前发现的比较简单能达成目标的方法有三种,下面一一介绍
使用termux和andronix
目前termux为了规避新版安卓sdk对现有功能的限制,已经不再在google play上更新,具体原因可以看https://wiki.termux.com/wiki/Termux_Google_Play,而且google play上的termux也已经无法再获取到新的库源,所以想要下载到最新的termux需要到github上去下载,地址为: https://github.com/termux/termux-app
andronix可直接在google play上下载
termux安装完成后,国内使用的话换源会让使用过程更便捷一些,但是因为andronix需要连接git仓库,还是推荐不换源且在能访问外网的环境下进行操作,下面为换源的命令
termux-change-repo
接着打开andronix,依次点击Linux Distribution、Ubuntu、Ubuntu 18.04、CLI Only,此时软件会弹出“命令已复制”的提示
接着点击软件内的Open Termux打开Termux,把刚才复制的命令粘贴进去再执行即可,整个安装过程会自动完成,过程中会提示是否更新软件包,全选是即可
使用Userland
Userland也可直接在google play上下载
首先打开Userland的设置界面,找到“Use Custom URL for Filesystem Server”并打勾,接着点击“Set URL for Filesystem Server”,软件会弹出一个输入框,里面有一个git的网址
直接访问是404的,我们需要把release后的都删掉,变成:https://github.com/CypherpunkArmory/UserLAnd-Assets-Debian/releases/
点进去之后能发现许多linux的proot系统
我们去到这个git账号的仓库列表,找到UserLAnd-Assets-Ubuntu这个仓库
在releases页面能看到同样有许多proot系统,由于不知道各个版本对应的ubuntu版本,先选择最老的v0.0.3
仿照从Userland粘出来的网址,将其改成:https://github.com/CypherpunkArmory/UserLAnd-Assets-Ubuntu/releases/download/v0.0.3
再填回Userland的“Set URL for Filesystem Server”里
接着再在Userland里按正常操作选择ubuntu系统,选择minimal和ssh连接,即可成功安装ubuntu18
使用termux里的旧版proot-distro
proot-distro是一个在termux上的用于管理基于chroot的linux发行版安装的脚本
使用proot-distro的话则推荐把termux的源换成国内源
termux-setup-storage
termux-change-repo
apt upgrade -y
直接安装termux包管理里的proot-distro
apt install proot
apt install proot-distro
下面命令可以看到proot-distro支持的linux版本
proot-distro list
在里面可以找到unbuntu
Supported Distributions:
...
* Ubuntu
Alias: ubuntu
Installed: no
Comment: ...
...
但是如果直接使用termux上默认的proot-distro的话,上面的ubuntu版本已经是22了
proot-distro是开源的,git上有旧版的记录,同时readme里也有介绍源码的安装方法:https://github.com/termux/proot-distro#installing
翻看源码,很容易就能发现distro-plugins
文件夹内的文件便是proot-distro list
里的列表,再在git的tag列表里查看历史版本,便能知道版本1.10.1
为最后一个原本支持ubuntu 18的版本
把proot-distro的1.10.1版本的源码下载到termux内,按照readme的介绍,解压并执行install.sh
文件,等待安装完成,完成后执行proot-distro list
,便可以看到我们需要的ubuntu 18版本了
Supported Distributions:
...
* Ubuntu 18.04
Alias: ubuntu-18.04
Status: Not installed
...
这时候再执行proot-distro install ubuntu-18.04
便可成功安装ubuntu 18
补充
如果想安装除proot-distro提供之外的镜像呢?
实际上proot-distro使用的就是proot,但是proot的命令比较繁杂
我们在搜索引擎搜索“proot wiki”可以找到proot的wiki网页https://wiki.termux.com/wiki/PRoot
拉到最底,可以看到别人编写好的proot脚本
虽然他们警告说质量上可能会比不上proot-distro提供的安装和执行方式,但是好歹能用
这里仍然以ubuntu为例,先下载之前提到的ubuntu18的镜像文件
进入ubuntu的页面:https://github.com/Neo-Oli/termux-ubuntu
可以在文件列表里看到作者提供的一个脚本文件ubuntu.sh
,翻看并找到下面的代码
#!/data/data/com.termux/files/usr/bin/bash
folder=ubuntu-fs
if [ -d "$folder" ]; then
first=1
echo "skipping downloading"
fi
tarball="ubuntu.tar.gz" // 镜像文件名
if [ "$first" != 1 ];then
if [ ! -f $tarball ]; then
echo "downloading ubuntu-image"
case `dpkg --print-architecture` in
aarch64)
archurl="arm64" ;;
arm)
archurl="armhf" ;;
amd64)
archurl="amd64" ;;
i*86)
archurl="i386" ;;
x86_64)
archurl="amd64" ;;
*)
echo "unknown architecture"; exit 1 ;;
esac
wget "https://partner-images.canonical.com/core/disco/current/ubuntu-disco-core-cloudimg-${archurl}-root.tar.gz" -O $tarball
fi
...
可以看到脚本会先判断是否有ubuntu.tar.gz
这个文件,没有则自动下载
我们在termux的目录下新建一个文件夹,把这个脚本下载到这里,并把刚才下载好的镜像文件放到与脚本文件同一个目录,把镜像文件改成ubuntu.tar.gz
脚本的执行会自动在这个目录生成ubuntu的文件结构
执行ubuntu.sh
,等待执行完毕,执行完毕之后会在同一个目录下生成ubuntu-fs
文件夹和start-ubuntu.sh
文件,分别为ubuntu的文件目录和进入ubuntu系统的执行脚本
执行start-ubuntu.sh
,便可进入ubuntu 18了