红米2刷 Debian 系统
前几天有友人分享了红米 2 刷 Debian 相关的文章:
所以我也来试一试。前几天换手机,把旧的红米 Note 7 Pro 刷成了 MIUI.eu,获取了一些刷机的经验,这次应该困难不大。
0x00 搞到一台红米2
根据 小米官方文档,红米2有 1+8G(普通版)和 2+16G(增强版)两个版本,各自有支持联通、移动、电信 4G 的特化版本。注意只有骁龙 SoC 的「红米2」和「红米2增强版」能使用这个刷机包,联芯 SoC 的「红米2A」是不行的。主要参数如下:
只能说时代发展太快了,现在 iPhone 13 内部存储是 128GB 起跳……在闲鱼上可以找到几个商家,大量有货。我选了个「移动联通双 4G」的红米2增强版机型,带邮费到手 88 CNY。成色还不错,屏幕有划痕,但是外壳完好。可能原机主是包了手机壳但没有贴膜?
到手电量有 88%,用数据线连上电脑,打开开发者模式。截屏的方法:
> adb shell # 进入 shell
$ screencap -p /sdcard/Podcasts/1.png # 截屏,保存到指定位置
> adb pull /sdcard/Podcasts/1.png # 收取手机文件
Github 刷机包项目 说「仅适用于高通msm8916方案的红米2手机」,我们看一下 cpu 信息:
shell@HM2014813:/ $ cat /proc/cpuinfo
processor : 0
model name : ARMv7 Processor rev 0 (v7l)
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 0
processor : 1
model name : ARMv7 Processor rev 0 (v7l)
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 0
processor : 2
model name : ARMv7 Processor rev 0 (v7l)
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 0
processor : 3
model name : ARMv7 Processor rev 0 (v7l)
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 0
Hardware : Qualcomm Technologies, Inc MSM8916
Revision : 0000
Serial : 0000000000000000
Processor : ARMv7 Processor rev 0 (v7l)
可见 SoC 是高通 MSM8916,ARMv7 指令集(很怪,事实上这颗骁龙 410 处理器是 ARMv8 指令集)。
0x01 刷机
首先下载刷机包:https://github.com/Project-DragonPi/mobian-wt88047
重启手机,开机时按住「音量 -」和「电源」键,进入 fastboot 模式。电脑上检测确认已连接,并刷入 lk2nd:
用 fastboot reboot
指令重启,进入 lk2nd 界面。手机屏幕显示如下:
接下来刷入 Debian 系统,要写入的镜像文件是 boot.img
和 userdata.img
。需要一点时间,我用了大约十分钟。
完事之后 fastboot reboot
重启进入系统。刷机完成,Congratulations!
0x02 安装软件
Mobian 有自带的 ssh-server。把手机连进 WLAN,然后直接 ssh 上去即可。用户名 mobian
,默认密码 1234
。
既然有 apt,安装软件就简单了。直接先装个 nginx:
htop:
neofetch:
ipython 也能正常使用:
0x03 安装 docker 和排错
用 apt 装 docker.io
之后启动失败。journalctl -xe
看一下日志:
简而言之,操作 iptables 的时候失败了,原因是 Chain 'MASQUERADE' does not exist
,笑死。
首先把软件升到最新(刚刚刷机之后有 100 多个 package 不是最新)。
apt update
apt upgrade # 得慢慢等,http://repo.mobian-project.org 很慢,湖南电信大概 40kB/s
reboot # 重启下手机
然后切换 iptables 程序,换成 iptables-legacy
:
成功启动 docker。跑一个 2048 试试:
nginx 反代到 10000 端口,业务成功部署。不反代的话,局域网访问 20000 端口体现为连接超时,就好像 docker 并未监听 0.0.0.0:20000
而是监听了 127.0.0.1:20000
一样,有点奇怪。
2022/01/12 更新:重启手机之后就能 192.168.0.107:20000
直接访问容器端口了,我真是佛辣。
用 docker 装个 MongoDB。需要注意 MongoDB 5.x 不支持,具体报错为 WARNING: MongoDB 5.0+ requires ARMv8.2-A or higher
,把红米2和树莓派4等机器就这么排除在外了。我们装个 MongoDB 4.x:
version: '3.1'
services:
mongo:
image: mongo:4
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: ***censored***
ports:
- 20001:27017
mongo-express:
image: mongo-express
restart: always
ports:
- 20002:8081
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: root
ME_CONFIG_MONGODB_ADMINPASSWORD: example
ME_CONFIG_MONGODB_URL: mongodb://root:***censored***@mongo:27017/
装一个 PostgreSQL:
version: '3.1'
services:
db:
image: postgres
restart: always
environment:
POSTGRES_PASSWORD: ***censored***
ports:
- 10003:5432
adminer:
image: adminer
restart: always
ports:
- 10004:8080
最后,这些容器闲时的负载情况:
0x04 编程
有了这个 24h 运行的 debian 服务器之后,我们可以在上面跑各种程序。用 gin 写一个简单的 HTTP 服务:
交叉编译:
SET GOOS=linux
SET GOARCH=arm64
go build . # Windows x64 上编译 linux arm64 的程序
然后丢上去运行就完事了。可以用 tmux 来管理这些程序。
0x05 关掉桌面环境和屏幕
mobian 自带的桌面环境是一个 gnome,非常占资源。这是正常情况下(刚开机)的占用情况:
这是没开桌面环境的占用:
可见桌面环境是个吃内存的巨头。那么我们既然把红米2当作服务器用,肯定要关掉桌面环境的。去查一下 wiki,得到开机不进入桌面的方法:
sudo systemctl disable phosh
然后重启,发现确实没有进入桌面,而是像 debian 无桌面服务器一样进入了 tty1。但是产生了一个问题:没法短按电源键关掉屏幕了。
查阅资料,首先查到 arch wiki,发现有 bl_power
这个可配置的选项,然后找到 kernel 文档,通过下面的指令即可解决问题:
echo 4 > /sys/class/backlight/backlight/bl_power
所以现在就完美解决了。