我有一个Android平板电脑,我希望为它安装完整的Linux系统,这样我就可以在一些工作场合免于携带沉重的笔记本电脑。
本文章详细记录了我在Android设备上安装Linux发行版的步骤。
参考:
LinuxDeploy 详解 - 爱小峰峰
小米手机Linux Deploy安装Ubuntu - _Kokomi
Linux Deploy 安装与使用 - coolape
xfce中文字符方块乱码问题解决
Android 11 can't read mounted /sdcard/ ,bad adress #1248
需求
我的平板电脑是小米平板 5 Pro,系统为Android 11,已经获取了root权限。
我希望安装完整的Linux发行版,同时保留原有的Android系统。
-
最初设想的方案是安装双系统,但技术上难度太大,需要修改引导,重新分区之类的,于是放弃此方案。
-
有一种方法是安装Aid Learning APP。
Aid Learning是一款可视化编程器,内含大量AI案例,帮助在移动端进行编程编辑,还能学习AI编程知识,非常适合入门学习,不需要复杂的配置,不需要root权限。
重要的是其内置了Linux系统,可以直接使用。详情请看把安卓手机性能发挥到极致之-Aid Learning。
但是我认为它作为生产环境还是不够优雅,于是寻找其他方案。 -
还有一种方法是使用Termux安装Linux。
Termux是一个Android终端仿真应用程序,用于在Android手机上搭建一个完整的Linux环境。不需要root权限就可以正常运行。Termux基本实现了Linux下的许多基本操作。
Termux不是真实的Linux环境,但是Termux可以安装真实的Linux。详情请看极致安卓之—Termux安装完整版Linux。
这种方法我之前使用过,虽然很好用,但是启动仍然比较繁琐,而且不容易让它保持持久运行,于是寻找更好的方案。
另外,为了让Termux获取到root权限,需要安装tsu
来进行提权。pkg install tsu tsu #接下来在弹出的权限管理窗口内授权即可
-
使用Linux Deploy APP安装Linux。
Linux Deploy是一个在Android平台上部署Linux发行版的APP,在GitHub开源,项目地址。
这个APP使用chroot隔离容器,可以安装多个发行版。支持后台持久化运行,支持开机自启,支持锁屏保持CPU运行,支持宿主机路径挂载,还有很多功能,是非常优雅的解决方案。
唯一的缺点是需要root权限,但无伤大雅,我已经获取到了root权限。
关于小米平板5以及小米手机获取root权限请看小米平板5/5pro超详细root基础原理加教程加工具加文件,学会能刷所有。
安装
安装Linux Deploy
在Google Play商店或者GitHub Releases下载安装。
旧版的Linux Deploy还需要安装BusyBox,而2.4版本之后的Linux Deploy无需再次安装BusyBox。
设置APP运行
展开左侧菜单,在配置文件
中可以分别安装多个Linux发行版。
在设置
中,屏幕常亮
和开机自启
可选打开。如果你希望它能持久运行,那么锁定wifi
和CPU唤醒
建议打开,同时请在Android系统设置中保证APP的持久运行。
配置安装的Linux发行版属性
点击右上角的设置(倒数第二个按钮),进入属性页。
-
发行版我这里选择
Ubuntu
。 -
架构请根据自己的设备选择(可通过Linux Deploy右上角状态查看是什么架构,我的是aarch64,可以选arm64)。有一种说法是Ubuntu只能选择arm64,而CentOS只能选aarch64,待验证。
-
发行版默认bionic即可。
-
原地址建议填写国内镜像,否则下载会很慢。我这里用的是中科大镜像
http://mirrors.ustc.edu.cn/ubuntu-ports/
。 -
安装类型选择镜像文件即可。各类型说明:
- 镜像文件
将GNU/linux安装到一个镜像文件(虚拟磁盘)中。如果你将GNU/linux安装到fat32的sd卡中请使用该选项。
安装路径为镜像文件的绝对路径,默认为/sdcard/linux.img
。
镜像大小为镜像文件的大小 默认为自动。
如果镜像路径设置在fat32内存卡的目录下,镜像大小应不大于4096MB (fat32文件系统文件大小限制)。
文件系统为镜像文件内要使用的分区的文件系统,默认为ext4。 - 目录
将GNU/linux安装在一个ext4或f2fs分区的一个目录里。
安装路径为要安装到的目录,默认为Linux Deploy的应用数据目录(在data分区)。
安装目录请勿使用fat32分区的目录,以及/sdcard/
内部共享存储目录, 它们不支持linux文件系统的基本权限。 - 分区
格式化一个分区并将GNU/Linux安装到里面。
安装路径为一个块设备分区文件的绝对路径,默认为/dev/block/mmcblkXpY
。
如果要安装到内存卡的第一个分区请写:/dev/block/mmcblk1p1
。
如果要安装到OTG U盘的第一个分区请写:/dev/block/sda1
。
文件系统格式化分区所指定的文件系统,默认为ext4。 - RAM
创建一个ramdisk并将linux安装到里面。
安装路径为ramdisk的挂载路径,默认为/data/local/ram
。
镜像大小为ramdisk的大小。
ramdisk会在关机后清除。
- 镜像文件
-
安装路径可以保持默认。如果要安装在手机自带的存储空间中,则在路径开头加上
${ENV_DIR}
;安装在sdcard中,加上${EXTERNAL_STORAGE}
。 -
文件系统配置为默认ext4即可。
-
用户名密码自行配置。建议别设置过于简单或简短的密码,否则可能设置失败。
-
本地化如果选择中文
zh_CN.UTF-8
,用户家目录下的文件夹会变成中文,不方便命令行输入,请自行取舍。 -
初始化为Linux Deploy启动linux时自动执行的脚本设置。
- run-parts
在启动linux时执行指定的脚本。
初始化路径:要执行的脚本的路径。
初始用户:要执行脚本的用户。 - sysv
如果你安装的linux支持并安装sysv请选择此选项。
初始化级别为init运行类型,默认为3(default)。
初始用户为运行init的用户,默认为root。
- run-parts
-
挂载可以将宿主机上的路径传递到Linux容器内。例如我需要在容器内访问
/sdcard
就可以访问到宿主机的/data/media/0
,那就可以这样配置:Source: /data/media/0 Target: /sdcard #不要填写块设备文件名
-
ssh建议启用,启用后就可以远程连接shell。
-
声音服务PulseAudio转发linux内的音频输出到目标PulseAudio服务器。安卓可使用Pulsedroid作为输出服务器,也可以转发到其他拥有PulseAudio的设备上。
-
图形界面可选,选择VNC即可(VNC密码为用户密码)。桌面环境推荐轻量级的Xfce。如果不是必要的就不建议安装了,因为图形界面会占用较多资源。此处图形界面详解见LinuxDeploy 详解 - 爱小峰峰。
注:若安装成功后再次修改本页面的Linux发行版属性,则需要点击主页右上角的菜单-配置
来重新应用配置。
安装
配置完属性后退出属性页,点击右上角菜单-安装
就会开始安装。
安装大约会持续30分钟,期间如果因为网络原因卡住不动就直接停止然后重新安装。
等到出现<<< deploy
字样表明安装完成。此时点击右上角停止,再点击启动即可开启。
连接
使用ssh连接Linux发行版。Android本地连接可以使用Termux或者ConnectBot。
#本地连接
ssh user@localhost
#通过ip远程连接
ssh user@ip
为了方便连接可以配置公钥私钥。
备份
如果想要备份此Linux系统,点击主页右上角的菜单-导出
,即可把此系统打包为压缩文件linux-rootfs.tar.gz
,存放于安装路径内。
问题
此Linux容器仍然存在一些问题。
默认shell为sh
默认的sh功能不够完善,包括没有Tab补全、方向键乱码等问题。我们修改默认shell为bash。
修改/etc/passwd
,找到自己用户的那一行,把/bin/sh
改为/bin/bash
。
图形界面中文乱码
-
安装locales
sudo apt install locales sudo dpkg-reconfigure locales
-
选择语言编码
en_US.UTF8
,zh_CN GB2312
,zh_CN GBK GBK
,zh_CN UTF-8 UTF-8
。 -
选择系统默认语言为英文
en_US.UTF8
。
此处如果选择了中文,则所有用户的语言都会被设置为中文,且第4步可以省略,请自行取舍。 -
为当前用户配置默认语言为中文
zh_CN UTF-8 UTF-8
。修改~/.bashrc
,在最后一行添加:export LANG=zh_CN.UTF-8
-
安装中文字体
sudo apt install fonts-wqy-zenhei
-
重启即可
挂载/sdcard
后无法访问
挂载了宿主机的/sdcard
后,试图cd进去或使用ls就会报cannot open directory '/sdcard/': Bad address
。
此问题在GitHub项目的Issue #1248已被提出,原因在于Android 11对存储权限的限制。
解决方法见Issue内的回复。另外,root用户进入/sdcard
似乎不受限制。
Comments NOTHING