我有一个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发行版。

设置中,屏幕常亮开机自启可选打开。如果你希望它能持久运行,那么锁定wifiCPU唤醒建议打开,同时请在Android系统设置中保证APP的持久运行。

配置安装的Linux发行版属性

点击右上角的设置(倒数第二个按钮),进入属性页。
file

  • 发行版我这里选择Ubuntu

  • 架构请根据自己的设备选择(可通过Linux Deploy右上角状态查看是什么架构,我的是aarch64,可以选arm64)。有一种说法是Ubuntu只能选择arm64,而CentOS只能选aarch64,待验证。

  • 发行版默认bionic即可。

  • 原地址建议填写国内镜像,否则下载会很慢。我这里用的是中科大镜像http://mirrors.ustc.edu.cn/ubuntu-ports/

  • 安装类型选择镜像文件即可。各类型说明:

    1. 镜像文件
      将GNU/linux安装到一个镜像文件(虚拟磁盘)中。如果你将GNU/linux安装到fat32的sd卡中请使用该选项。
      安装路径为镜像文件的绝对路径,默认为/sdcard/linux.img
      镜像大小为镜像文件的大小 默认为自动。
      如果镜像路径设置在fat32内存卡的目录下,镜像大小应不大于4096MB (fat32文件系统文件大小限制)。
      文件系统为镜像文件内要使用的分区的文件系统,默认为ext4。
    2. 目录
      将GNU/linux安装在一个ext4或f2fs分区的一个目录里。
      安装路径为要安装到的目录,默认为Linux Deploy的应用数据目录(在data分区)。
      安装目录请勿使用fat32分区的目录,以及/sdcard/内部共享存储目录, 它们不支持linux文件系统的基本权限。
    3. 分区
      格式化一个分区并将GNU/Linux安装到里面。
      安装路径为一个块设备分区文件的绝对路径,默认为/dev/block/mmcblkXpY
      如果要安装到内存卡的第一个分区请写: /dev/block/mmcblk1p1
      如果要安装到OTG U盘的第一个分区请写: /dev/block/sda1
      文件系统格式化分区所指定的文件系统,默认为ext4。
    4. RAM
      创建一个ramdisk并将linux安装到里面。
      安装路径为ramdisk的挂载路径,默认为/data/local/ram
      镜像大小为ramdisk的大小。
      ramdisk会在关机后清除。
  • 安装路径可以保持默认。如果要安装在手机自带的存储空间中,则在路径开头加上${ENV_DIR};安装在sdcard中,加上${EXTERNAL_STORAGE}

  • 文件系统配置为默认ext4即可。

  • 用户名密码自行配置。建议别设置过于简单或简短的密码,否则可能设置失败。

  • 本地化如果选择中文zh_CN.UTF-8,用户家目录下的文件夹会变成中文,不方便命令行输入,请自行取舍。

  • 初始化为Linux Deploy启动linux时自动执行的脚本设置。

    1. run-parts
      在启动linux时执行指定的脚本。
      初始化路径:要执行的脚本的路径。
      初始用户:要执行脚本的用户。
    2. sysv
      如果你安装的linux支持并安装sysv请选择此选项。
      初始化级别为init运行类型,默认为3(default)。
      初始用户为运行init的用户,默认为root。
  • 挂载可以将宿主机上的路径传递到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

file
为了方便连接可以配置公钥私钥。

备份

如果想要备份此Linux系统,点击主页右上角的菜单-导出,即可把此系统打包为压缩文件linux-rootfs.tar.gz,存放于安装路径内。

问题

此Linux容器仍然存在一些问题。

默认shell为sh

默认的sh功能不够完善,包括没有Tab补全、方向键乱码等问题。我们修改默认shell为bash。

修改/etc/passwd,找到自己用户的那一行,把/bin/sh改为/bin/bash

图形界面中文乱码

  1. 安装locales

    sudo apt install locales
    sudo dpkg-reconfigure locales
  2. 选择语言编码en_US.UTF8zh_CN GB2312zh_CN GBK GBKzh_CN UTF-8 UTF-8

  3. 选择系统默认语言为英文en_US.UTF8
    此处如果选择了中文,则所有用户的语言都会被设置为中文,且第4步可以省略,请自行取舍。

  4. 为当前用户配置默认语言为中文zh_CN UTF-8 UTF-8。修改~/.bashrc,在最后一行添加:

    export LANG=zh_CN.UTF-8
  5. 安装中文字体

    sudo apt install fonts-wqy-zenhei
  6. 重启即可

挂载/sdcard后无法访问

挂载了宿主机的/sdcard后,试图cd进去或使用ls就会报cannot open directory '/sdcard/': Bad address

此问题在GitHub项目的Issue #1248已被提出,原因在于Android 11对存储权限的限制。

解决方法见Issue内的回复。另外,root用户进入/sdcard似乎不受限制。