用闲置的安卓手机跑个小 Linux 服务器其实性能不一定很差,比较起内存和 cpu 核数,反而比几年前的笔记本更好(比如我已闲置的 Dell 1520)。
方案主要有以下 2 种:
- Linux Deploy (需手机 Root)
- GNURoot Debian
GNURoot Debian
google play 地址:https://play.google.com/store/apps/details?id=com.gnuroot.debian
官网:http://corbinlc.github.io/GNURootDebian/
好处就是不需要root,更安全,当然性能较差。用来作为 linux 的练手是不错的,但是由于权限的限制,实际使用上和服务器还是区别较大。
先说一下会有哪些坑:
- 由于权限的原因,1~1024 的端口是无法使用的,如果想开启 ssh 之类的服务,只能修改端口到1024 以后的端口,例如 2222。
- 服务是跑的 apk 的沙箱里,所以无法安装类似于 Bt.cn 之类的服务,会有各种权限不够的报错,编译 nodejs 也是不行的,不过可以使用已编辑好的 arm 版二进制文件,但需要手工配置路径。
- /sdcard/ 映射了手机磁盘,但磁盘上没有执行权限。
第一步,安装。
上面已经提供了 google play 地址,如果想单独下载可以自己谷歌,或者在这类地址:https://apkpure.com/gnuroot-debian/com.gnuroot.debian
由于不需要 root 所以,任何手机都可以安装。
第二步,输入法
建议安装一个 Bash 适合的输入法,系统的那些输入法不适合在 Bash 环境下使用。
本人尝试过各种输入法以后,这个较为好用:https://play.google.com/store/apps/details?id=com.noksha.kick.keyboard 名字叫:Pro keyboard - Kick keyboard,可以实现 Ctrl、Tab 等键盘事件。
第三步,安装 ssh 服务
打开 GNURoot Debian ,首次运行时,工具会自动配置Debian环境。可能过程需要一定的时间,毕竟安装源是国外的网站。
完成安装以后你将会看到这样的界面:
Android版的Debian Linux没有预装任何特殊的依赖组件,所以我们还要自行安装很多东西。首先,我们要使用下列命令更新Debian系统:
1 | apt update |
然后我们需要对 ssh 进行一些修改
1 | vim /etc/ssh/sshd_config |
修改以下内容:
1 | # 端口修改为 2222 |
文件保存退出以后,还需要给 root 添加密码
1 | passwd |
最后就可以将 ssh 服务启动起来了
1 | service ssh restart |
在 pc 或者 mac 上就可以通过命令行(Widnows 里使用 Xshell 之类的工具,这里就不过多阐述了)进行登录
1 | ssh root@<手机 IP> -p 2222 |
第四步,本地化
如果访问 /sdcard/ 目录,你会发现部分中文目录显示会是乱码,因为默认的 Debian 并没有本地化(支持中文),解决的方案就是:
1 | apt install locales fonts-arphic-uming |
这样就解决了中文显示的问题。
第四步,应用安装
拿 nodejs 来举例,在 GNURoot Debian 里用官网脚本安装 node 是会报错的。
nodejs 官网地址:https://nodejs.org/en/download/
安装脚本网址:https://nodejs.org/en/download/package-manager/
1 | # 先要安装 curl |
结果就是报错…
咋办呢?
下载已编译好的 arm 版本,一般现在芯片都是 v7,下载地址:https://nodejs.org/dist/v8.11.1/node-v8.11.1-linux-armv7l.tar.xz
下载以后解压到 /usr/locale/ 下。
这里几个坑:
- 不要尝试在 /sdcard/ ,为啥?因为安卓的安全策略就是不允许存在存储路径上调用可执行文件。
- xz 解压在 GNURoot Debian 下不好使,不知为啥,你可以在电脑上解压以后再放到手机存储上。
假设文件放在 /sdcard/Download/node-v8.11.1-linux-armv7l
1 | mv /sdcard/Download/node-v8.11.1-linux-armv7l /usr/locale/ |
不过执行效率实在太低…
Linux Deploy
现在重点讲一下 Linux Deploy
想尝试的同学,先看看如下前置条件
- 手机已 Root ,我用的是小米4C。小米 Root 比较简单,首先申请解锁手机(申请地址:http://www.miui.com/unlock/ 需要等几天,一般都能申请下来,绑定小米账号),然后刷开发版系统(网址 http://www.miui.com/), 打开“开发者模式”,怎么开启自行百度。最后就可以在“安全管理”里给程序授权 Root 了。
- 知道自己的手机怎么恢复出厂,怎么初始化(三清或者双清),比如小米手机是,按“音量键+” 和 “电源键” 开机,则进入三清界面。三清以后手机内置存储都会清除,所以做好备份工作。
- 手机如果绑定了账号保护,建议解除或者没忘记密码。三清以后的小米手机,开机依然会提示需要登录小米账号,还好我用小本本记录下了。。。否则就砖了。
- 值得注意的是,这与我们熟知的虚拟机技术不同,这只是用了容器技术,新的Linux系统将和Android系统平行运行(非专业解释不要深究)。所以不要瞎折腾,否则变砖以后就需要用到上面提到的 2 和 3。
第一步,安装。
google play 地址:https://play.google.com/store/apps/details?id=ru.meefik.linuxdeploy&hl=en_US
这是一个开源项目,github 地址:https://github.com/meefik/linuxdeploy release 里有最新版本可以下载。
安装完以后是这样的界面:
第二步,应用设置
- 锁定屏幕:看个人喜好,我反正是安装完了熄屏
- 锁定Wi-Fi:建议开启,断网了不好
- 开机启动:建议关闭
- 更新环境:建议运行一次
- 在线更新:建议打开
其他就按照个人喜好设置了,这个应用并没有提供 Bash 真操蛋!
第三步,容器配置
点击界面最右下方的”下载”图标(可能是其他图案)进入配置文件的设置界面进行如下设置。
- 架构:默认不要改
- 发行版:我选择 Debian
- 发行版版本: 也就是系统版本号,最新的 Debian 是 Stretch, 也就是 9.0
- cpu 架构:我选择 amd64 会比默认快一点,看自己手机是不是支持64位的,一般新的都没问题。
- 源地址: 默认是官网地址,可以选择亚洲地址,比如:http://ftp.cn.debian.org/debian/(中科大 - http://mirrors.ustc.edu.cn/+Linux`s Name/ 阿里云 - http://mirrors.aliyun.com/+Linux`s Name/)
- 安装类型:这里最坑,分区模式还是算了,目录模式不可以指向 /sdcard/ (安装以后无法启动,别问我怎么知道的),结果可行的只有文件模式,还好装完以后测试下来 io 速度还能接受,类似虚拟磁盘的方式。
- 镜像大小:也就是虚拟磁盘大小,如果是内置存储可以设置大一点,我设置成 7049 M
- 用户名、密码 都不要改,记下就行
- DNS 服务器不用改
- 本地化:就是linux的locale设置,中文的话就是zh_CN.UTF-8。
- SSH,推荐开启,默认端口是22,我设置成了 2223,建议设置1024 以上的端口号
- 自定义挂载:推荐开启,可以访问机器的存储,右上角有添加,然后填入路径,例如 /sdcard/
第四步,安装
设置完成后,按返回键返回到应用主界面,按下菜单键,选择”安装”开始Linux系统的安装,安装过程中需要一直保持网络连接(建议在WIFI下安装,大概需要几百兆流量)。
当看到终端输出”<<<deploy”时,代表安装已完成:
再点击右上角菜单:“配置”,将更改设置的 ssh 还有挂载 都设置好,如果本地化选择了中文,则日志里可以看到一些中文提示。
设置完成以后,点击主界面下方的”启动”按钮可以启动新安装的系统,点击”停止”可以停止系统。
这里最重要的就是 ssh Done… 那就说明可以用 ssh 登录此服务器了。登录的用户名和密码就是刚刚配置里的 android 以及对应的密码,你记在小本本上了没有?
第五步,其他可能碰到的问题
- ssh fail 一般这种情况很大可能是。。。你是不是安装到了 sdcard 目录下了?这是不行的。
- 如果遇到镜像启动不起来,先按一下“停止” 按钮,之前也许以及启动一个容器
- 不要尝试安装宝塔面板,默认会启动防火墙,结果就是,手机无法联网,需要三清(啥资料都没了)如果想装 lnmp 就自己手工装吧。
- 如果安装 nginx , 文件目录无法使用内部存储路径,可能还是万恶的系统权限的原因。