在 Android 上玩转 Linux

By | 2015-08-13

目录

其实类似教程应该挺多的了, 不过这次打算写的更简单实用一些

更新: 目前已经有更简单好用的 LinuxDeploy 了,
原理和 LinuxOnAndroid 是一样的, 本文分两段分别扯下这俩的注意事项, 有兴趣可以都看看, 当然, 目前推荐用 LinuxDeploy, 因为:

  • 源比较新, 更新也方便
  • 内置了所需的命令行环境, 不依赖系统终端和 busybox 等玩意儿, 可以省很多事

简介

  • 一句话概括就是在 Android 上跑一个完整的 Linux 操作系统, 懂的人自然知道这个的价值和意义
  • 只需要一些常用功能, 不想折腾的, 也可以用 Termux 之类的终端模拟, 更简单方便一些, 主要差异:

    • Termux 之类的更像 Windows 上的 Cygwin, 只是在 Android 自带终端里面模拟一些命令 (可以直接跑宿主中的命令),
      优点是简单方便,
      缺点是功能有限, 一些复杂功能反而更难配置 (类似 ssh 服务器之类的东西都比普通 Linux 麻烦)
    • 本文扯的是完整的 arm 版 Linux, 通过 chroot 完全切换到一个虚拟环境 (跑不了宿主中的命令, 互相独立),
      优点是完整的 Linux, 可以和桌面版 Linux 一样的方式来折腾, 甚至可以图形界面远程登录, 镜像文件也方便备份,
      缺点是更新相对麻烦

可以用来干嘛

  • 完整的 Linux 系统, 你懂的, 各种软件都能用, 拿来学习 Linux 也是很不错的选择
  • 本人主要用来在 Android 上搭建 SVN 服务器, 带着手机到处跑, 什么云都弱爆啦
  • 顺便在里面折腾了 gcc, vim 等开发环境, 随时都可以敲代码啦 (注孤生)

顺便打点小广告:

安装使用

LinuxDeploy

必备功能的安装

  • 首先, root 是必须的
  • 然后, 不想折腾的, 使用默认配置, 装完 app 点 START 即可 (简单到泪流满面)
  • 当然, 也有坑, 这货不是直接下载镜像文件, 而是逐个包下载, 并且坑爹的没有重试,
    所以如果你发现途中有什么下载失败了, 请 STOP 后直接删除镜像文件然后重新 START 直到成功 囧TZ
  • 装好后, 可以直接备份镜像文件, 免得下次安装又要下载很久
  • 出现任何问题, 可以尝试先重启下 Android
  • 启动后, 似乎并没有自动登录到终端环境 (至少在我这, 自带的 Terminal 总是没法用),
    所以还需要另外用别的终端软件 ssh 登录到本机,
    ssh 的方式参见下文

基本配置

  • 设置里大多配置应该都很好懂, 个人推荐使用 Debian armhf 版本
    (CPU 类型根据你手机决定, 目前大多都是 armhf),
    中文则在 Localization 里面选 zh_CN.UTF-8, 其它保持默认配置

ssh

  • Allow to use a SSH server, 默认配置勾选后重启就能用
  • 默认无法直接用 root 登进去, 只能先用普通用户登录, 然后再 su
  • 想直接用 root 登的, 可以参考 这里
  • 本机登录, 可以用任意终端软件 ssh 进去, 个人比较喜欢用
    JuiceSSH

启动和关闭时执行脚本

  • 勾选 Allow to use a initialization system, Init systemsysv
    (只有这个能方便的定制 "启动+关闭" 时执行脚本)
  • 启动进入 Linux 后, 进入 /etc/init.d 目录, 照着修改一份自己的脚本, 然后软链接到 /etc/rc0.d 之类的目录里,
    注意文件命名, Snnxx 表示启动时执行, Knnxx 表示关闭时执行, nn 表示执行顺序
  • 关于 sysv 的详细说明, 可以参考 这里

文件系统

  • 勾选 Allow to mount the Android resources
  • Mount points 里面添加的格式为 Android目录:Linux目录, 例如

    /data:/android/root_data

    表示将 Android 的 /data mount 到 Linux 的 /android/root_data 目录

    (这部分很坑, 没任何文档说明, 折腾了好久才试出来)

vnc

  • Allow to use a graphical environment, 默认配置勾选后重启就能用
  • 建议不要勾选使用, 因为需要额外装桌面环境占空间,
    外加手机上用桌面环境不好用+卡, 除了装逼外并没有什么实用意义

(旧版) LinuxOnAndroid

必备功能的安装

  • 首先, root 是必须的

    推荐使用 SuperSU, 并且在设置中去掉勾选 "分类挂载命名空间" 和 "启用多用户授权"

  • 然后, busybox 也是必须的

    如果是 Android 6 以上, 最好在 Smart Install 里面勾选 Enable Smart Install, Replace All (Symlinks all), Clean Mode,
    否则会出现各种神奇的无法启动的情况

    但是 注意, 这样安装相当于用 busybox 完全替换系统的命令行, 所以, 不要去 Uninstall,
    也不要重新安装, 否则可能把系统也搞出问题,
    比如 root 丢失等等, 安装前请特别注意备份

    如果不愿冒这些蛋疼的风险, 还是请换用 LinuxDeploy, 那个不需要折腾这些麻烦事

  • 然后, 你得有一个在 Android 上跑的 Terminal

    这里推荐 Better Terminal Emulator Pro,
    更高级的用法可以参照本文后面的 进阶功能

  • 然后你得去下载一个合适的 Linux 系统镜像

    这里 是目前所有可用的系统镜像

    个人推荐使用 Ubuntu 13.10 的 small 版本, 推荐使用 ubuntu-13.10.SMALL.ext2.v1.zip

    有兴趣也可以去 项目主页 看看

  • 然后你得去下载一个启动脚本

    点击这里 去下载 bootscript.sh

  • 最后, 只需在第一步里装好的 Android Terminal 中, 运行以下命令即可启动 Linux

    sh relative_path/bootscript.sh relative_path/your_linux.img

    relative_path 是你放文件的相对路径, 用的是 Android 本身的文件系统路径

    your_linux.img 是第二步中你下载的系统镜像中, 解压出来的文件

  • 首次运行可能会提示设置一些内容, 没有什么太大关系, 之后可以通过编辑自动生成的 your_linux.img.config 文件进行设置, 例如我的设置是:

    resolution=1024x600
    run_ssh=yes
    run_vnc=yes

    推荐把后面两个设为 yes, 默认开启 ssh 和 vnc

  • 启动后, 只有命令行界面

    如需图形界面可以参考下文

    如需退出, 必须输入 exit 退出后, 才能关闭 Terminal, 否则下次无法正常启动 Linux, 必须先重启 Android

一键启动

每次都要输入命令行启动实在太 low 了, 如果你用 Better Terminal Emulator Pro 的话可以更方便很多的

  • 编辑 /data/data/com.magicandroidapps.bettertermpro/home/local_profile 把你的命令行输入进去

    这样打开 Better Terminal Emulator Pro 的时候就会自动启动 Linux 了

  • 不过上面的方法每次打开软件都会进入 Linux 了, 其实可以配合 Tasker
    再搞一些小动作, 例如自动复制和还原那个 local_profile 文件, 这部分太罗嗦还是不表好了, 有兴趣的童鞋请自行研究 Tasker 这个神器

文件系统

  • 进入 Linux 后, 相当于进入了另一个完全独立的系统, 在这个系统中默认是访问不到 Android 的文件系统的, 只能通过 mount 访问

    • 部分 Android 设备的存储卡路径是标准路径 (比如 /sdcard), 可以自动 mount,
      启动后去 /android 目录下看看有没有, 如果没有, 接着下文
  • 要在 Linux 中访问 Android (例如存储卡), 可以通过以下方式

    • 在你的 img 文件的同目录下, 新建一个名为 "your_linux.img.mounts" 的文件
    • 文件内容格式是 Android 这里的源目录;mount 到 Linux 的目标目录 例如:

      /sdcard;my_mount
      /data;my_mount2

      第一行把 Android 的 /sdcard 目录 mount 到 Linux 的 /android/my_mount 目录下, 第二行同理

  • 目前似乎无法在 Android 中访问 Linux 的文件目录, 好像也没什么必要, 真需要的话, 再开个终端去 mount 也是可以的

系统更新

  • 由于不是常规 Linux, 所以更新肯定是不及时的, 系统的更新源请注意使用旧版本
  • 例如我用的是 Ubuntu, 13.10 早已经停止更新了, 所以最好把源设置为旧的:

    # vim /etc/apt/sources.list
    deb http://old-releases.ubuntu.com/ubuntu/ saucy main restricted universe multiverse
    deb-src http://old-releases.ubuntu.com/ubuntu/ saucy main restricted universe multiverse

    上面是 Ubuntu 13.10 的源, 各 Linux 系统不一样, 所以请自行搜索应该使用什么源

vnc

  • 默认安装好后是带有一个 VNC server 的, 详细的可以看启动过程中的输出, 可以在 Android 或其它设备通过 VNC 远程登录图形界面

    在 Android 本机登录的话, 推荐使用 Jump

    在其他设备登录的话有很多选择, 这个就不表了

  • 默认同样会开启 ssh 服务, 可以在其他设备通过 ssh 登录, 比如可以在 Windows 下用 Putty 登录, 就不用折腾 Android 那小屏幕了

  • PS: 图形界面只是尝尝鲜, 实际上因为性能问题基本不具备实用性

FAQ

  • 中文问题

    默认只支持英文, 要支持中文, 根据你所使用的发行版不同, 要用不同的方法

    以我用的 Ubuntu 为例:

    sudo locale-gen zh_CN.UTF-8
    # sudo vim /etc/default/locale
    LANG="zh_CN.UTF-8"
    LANGUAGE="zh_CN:zh"
  • Device or resource busy / Unable to mount the loop device

    因为这货本质上是 chroot 和 mount, 所以如果上次没有正常 umount 的话, 启动的时候会无法 mount

    解决方法很简单, 重启下 Android 就好, 如果每次都要重启才能用, 检查下每次是否正常的退出, 并且是否 umount 了所有你曾经手动 mount 过的东西

  • 使用 exit 退出, 但是还是有东西没有 umount

    可能和你本地 Android 的 shell 环境有关, 首先确认正确安装了 busybox, 然后可以尝试把把 bootscript 里面的 sh 改为 bash

  • shell 高度不正确

    不知道是不是个例, 总之我这用各种终端模拟器启动, shell 的高度总是不正确

    正常使用 shell 时倒是没什么太大影响, 但是用 vim 时会出现各种奇葩问题

    目前还没发现什么解决方法, 但是发现用 JuiceSSH 来 ssh 登录, 就不会了, 姑且先这么凑合吧

其它

性能问题

  • 在命令行下操作的话, 一般没有太大的性能问题
  • 建议文件什么的放在 Android 的内置存储里面, 因为一般 SD 卡读写速度远慢于内置存储, 可能会在文件读写上速度很慢

输入问题

  • 不用说也知道在触屏上鼓捣这些有多蛋疼, 输入法建议使用 Hacker’s Keyboard,
    可以缓解一些蛋疼情况
  • 买一个蓝牙键盘也是不错的选择 (XX手机就是好, 买台手机当电脑 – -b)
  • 其实大多数情况下, 都是在电脑上 SSH 远程登录, 毕竟日常生活还是 Windows 用着顺手, 偶尔要测试一下 Linux 的时候在手机上跑跑就好了

转载请注明来自: http://zsaber.com/blog/p/54

既然都来了, 有啥想法顺便留个言呗? (无奈小广告太多, 需审核, 见谅)

24 thoughts on “在 Android 上玩转 Linux

  1. 小白

    请问:我想在手机上运行paspbian ,应该怎么制作镜像呢

    Reply
    1. Z Post author

      怎么制作不清楚啊, 估计得从源码编译

      Reply
      1. 匿名

        请问,系统到底该怎么设置中文??我和你一样的ubuntu的,但是 只要有中文就是□□□□□,显示不出来,,,java编译也无法编译中文,您的方法我试过了,或者我没正确 设置?都百度过n回了折磨了半天,都不行,请赐教::>_<::

        Reply
      2. 匿名

        评论没发出去吗?,,
        请问详细设置中文怎么做?不支持中文我java编译中文通不过,,,百度过n回了无法解决,我是和你一样的系统的,请赐教啊::>_<::

        Reply
        1. Z Post author

          终端运行这个

          sudo locale-gen zh_CN.UTF-8

          然后编辑这个文件:

          /etc/default/locale

          LANG="zh_CN.UTF-8"
          LANGUAGE="zh_CN:zh"

          然后重启

          Reply
          1. 匿名

            谢谢!我已经莫名其妙的解决了,得益于您的教程和网上的资源,我可以在手机编写java学习了

  2. deleted

    对了,另外我的脚本运行却可以访问 安卓整个文件系统,不知道为什么,从官方那下的脚本,安装后根目录下自己就有 sdcard 和external_sd 两个文件夹,进去就是完整的安卓文件系统。最近重装了linux好多次(因为vim配置乱了,,),全部都可以这样

    Reply
    1. Z Post author

      sd 卡路径是标准的话好像会自动 mount, 但是似乎好多手机都不是标准路径
      另外, 想用 vim 的话, 有现成好用的 VimTouch 推荐一试, 可以来用我的配置啊:
      http://zsaber.com/blog/p/31
      我现在默认编辑器就是 VimTouch

      Reply
    1. Z Post author

      是 sh bootscript.sh
      另外, 你有正确 root 么

      Reply
  3. 求助:出现错误 ERROR: ld.so: object ‘libsigchain.so’ from LD_PRELOAD cannot be preloaded: ignored.
    而且输入的东西在终端上看不到 : (

    Reply
    1. Z Post author

      这个不太清楚, 会不会是 SELinux 没关掉?

      Reply
  4. 另外请问这个系统要怎么卸载?直接把img文件删了就行?

    Reply
  5. 匿名

    请问Linux可以调用android手机的蓝牙设备吗?

    Reply
  6. 顾北

    不错,竟然有这么些同道中人,Linux deploy是比较好用,但是安装软件会遇到一些坑,各种折腾啊

    Reply
  7. 顾北

    怎么让手机一直保持Linux deploy是可访问,手机本身有省电机制,不像树莓派,>:-<

    Reply
    1. Z Post author

      在你的各种手机管家里面把它加入白名单, 这货耗电量并不大

      Reply
  8. Bwoywan

    卡在了如何让这东西自启…有个电视盒子想利用一下,结果死活不自启…容器也无法自动start。

    Reply
    1. Z Post author

      你得看看你的电视盒子是不是有什么管理软件限制了软件自动启动

      Reply

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注