前几天有友人分享了红米 2 刷 Debian 相关的文章:

红米2(msm8916)的debian 11和主线内核(5.14-rc4)刷机包 / DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/MQTT/物联网 / WhyCan Forum(哇酷开发者社区)
哇酷开发者社区,你值得拥有。

  所以我也来试一试。前几天换手机,把旧的红米 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.imguserdata.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 上的 2048 应用

  用 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 服务:

package main

import (
	"fmt"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/*path", func(c *gin.Context) {
		c.Header("Content-Type", "text/html; charset=utf-8")
		c.String(200, fmt.Sprintf(`<html>
<body style="background-image: linear-gradient(to right, #4facfe 0%%, #00f2fe 100%%);">
<center style="font-family: consolas; font-size: 40; padding-top: 5em; color:white"><p>%s</p><p>Your ip: %s</p></center>
</body>
</html>`, c.Param("path"), c.ClientIP()))
	})
	r.Run("0.0.0.0:8080")
}
▲ 显示客户端 IP 和 request path 的服务

  交叉编译:

SET GOOS=linux
SET GOARCH=arm64
go build .  # Windows x64 上编译 linux arm64 的程序

  然后丢上去运行就完事了。可以用 tmux 来管理这些程序。

0x05 关掉桌面环境和屏幕

  mobian 自带的桌面环境是一个 gnome,非常占资源。这是正常情况下(刚开机)的占用情况:

▲ 有桌面环境,757MB 内存占用

  这是没开桌面环境的占用:

▲ 无桌面环境,142MB 内存占用

  可见桌面环境是个吃内存的巨头。那么我们既然把红米2当作服务器用,肯定要关掉桌面环境的。去查一下 wiki,得到开机不进入桌面的方法:

sudo systemctl disable phosh

  然后重启,发现确实没有进入桌面,而是像 debian 无桌面服务器一样进入了 tty1。但是产生了一个问题:没法短按电源键关掉屏幕了。

  查阅资料,首先查到 arch wiki,发现有 bl_power 这个可配置的选项,然后找到 kernel 文档,通过下面的指令即可解决问题:

echo 4 > /sys/class/backlight/backlight/bl_power

  所以现在就完美解决了。