# 小米11魔改服务器

# 背景

在咸鱼买了一款二手小米11,卖家自称9成新,功能外观均良好,到手之后一眼看上去没啥问题,还给贴了膜,于是大概测试了一下没问题,就确认收货了。然后在抖音下单买了手机壳,准备做备机用。

几天后,手机壳到货,卖家还给贴心的送了膜。回头看了下原机贴的膜,感觉贴的不好,里面脏兮兮的,还有几个气泡,应该是没擦干净,于是撕了原机膜准备贴新膜。撕了膜之后发现原屏幕跟氢氟酸腐蚀过似的,一片坑坑洼洼,脏兮兮的,自己用酒精反复擦,也擦不干净,心想坏了,赶紧咸鱼联系卖家,不出意外的联系不上。没办法了,自己动手贴膜试试看吧,说不定能遮掩一下看不出来,然后自己尝试了贴三次,卖家送的膜全贴完了,也没贴出原来卖家贴的那种效果,不得不说卖家贴膜水平真高。

撕掉膜,裸屏用了两天,怎么用怎么不舒服,再卖肯定卖不掉,扔掉又可惜,于是心想做个服务器,还能废品利用一下,于是有了本次魔改操作。因为对安卓刷机并不擅长,所以在此记录下操作步骤,以免后续遗忘。

小米手机 CIT 测试方法:

CIT 测试主要是测试一些硬件,比如屏幕、触摸、扬声器、各种传感器等外设,我收到手机后,就是在 CIT 中测试了下,发现没问题就确认收货了。

# 在拨号面板输入以下代码进入 CIT 测试
*#*#6484#*#*

下文默认具备的软件环境:

已下载 adb.exe 以及 fastboot.exe 文件,并已配置好环境变量。如果安装过 Android Studio ,那么运行环境应该是具备的。测试方法:

PS C:\Users\MallocX> adb --version
Android Debug Bridge version 1.0.41
Version 34.0.4-10411341
Installed as C:\Tools\Android\platform-tools\adb.exe

PS C:\Users\MallocX> fastboot --version
fastboot version 34.0.4-10411341
Installed as C:\Tools\Android\platform-tools\fastboot.exe

# 一、获取ROOT权限

# 1、解BL锁

我买的这个手机卖家已经解锁了,所以直接跳过这个步骤。

闲鱼有各种付费解BL的商家,如果后续我还要刷机,应该会选择直接付费解锁,据说解BL这个难度颇高。

# 2、修补 boot.img

以下操作全程参考 Magisk 中文网 (opens new window) 教程。

# 2.1、下载 ROM

Magisk 官网提供了很多机器的 ROM 包下载 链接 (opens new window),可以根据机器任意挑选下载。

本次操作我选择在 miuier (opens new window) 下载小米11 ROM 包,下载时注意,手机版本号要和 ROM 包版本号一致,如下图:

可以选择线刷包或者卡刷包,我在此选择的是线刷包。(不确定两者的具体区别是什么,但 boot.img 应该都是存在的)

# 2.2、提取 boot.img

提取操作 Magisk 官网 教程 (opens new window) 逐步操作即可,这个步骤还是很简单。

  • 下载 ROM 包镜像提取工具 payload-dumper-go;
  • 将下载的 ROM 包放到 payload-dumper-go 解压后的文件夹内(与 payload-dumper-go.exe 平级);
  • 执行批处理文件“打开CMD命令行.bat”,然后选择 b 提取 boot.img 文件。

稍等片刻,即可在 img 文件夹中看到提取完成的 boot.img 文件。将该文件复制到手机 Download 文件夹备用,可以用以下命令快速完成。

adb push ./boot.img /sdcard/Download/

# 2.3、安装 Magisk

Magisk GitHub 仓库地址:The Magic Mask for Android (opens new window)

在官网 下载 (opens new window) Magisk APP,然后安装,用以下命令快速完成安装。

adb install ./Magisk-v28.1.apk

# 2.4、修补 boot.img

根据 Magisk 官网 教程 (opens new window) 逐步操作,进行 boot.img 修补操作。

  • 手机打开 Magisk APP,点击主页右上角 安装 按钮;
  • 选择刚刚上传到 Download 文件夹下的 boot.img 文件;
  • 点击 选择并修补一个文件,然后点击 开始 按钮,开始修补 boot.img;
  • 等待片刻,命令行界面显示 - All done! 提示,说明修补完成;
  • 修补完成的文件名称为 magisk_patched-28100_3D7Go.img,文件后缀的字母应该是随机生成的,后续使用需要注意文件名称。

# 2.5、备份文件

备份 boot.img 文件以及 magisk_patched-28100_3D7Go.img 文件,准备刷入修补后的 boot 镜像,如果刷机后无法开机,可以刷入原 boot.img 文件恢复。

这个地方有个坑,风险需要再评估:

如果下载的原镜像有问题,那么提取的 boot.img 也有概率有问题。如果 boot.img 有问题,那么刷机后无法开机,就无法复原了,所以此处最好是将手机原本的 boot.img 备份出来,但是如何备份,后续待摸索。也算是我运气好,如果刷变砖了,那就真凉了。

# 3、刷入修补后的 boot.img

# 3.1、手机进入 Bootloader 模式

  • 手机关机后,按下 “电源键 + 音量下键”,一起长按大约 10 秒钟左右;
  • 屏幕显示 “FASTBOOT” 字样,则算是成功进入。

# 3.2、电脑驱动更新

手机进入 Bootloader 模式后,接入电脑后,命令行运行 fastboot devices 发现没有设备,打开设备管理器之后发现设备未识别,解决方法是:

  • 右键点击未被识别的 USB 设备,选择更新驱动程序;
  • 选择 “手动查找并安装驱动程序软件” 选项;
  • 选择 “WinUsb.dll 设备”;
  • 选择 “Android ADB Interface”;

因为刷机操作已经过去几天了,以上步骤凭记忆编写,后续再复现发现卸载掉驱动后可以系统可以自动安装了,所以无法复现,步骤可能有出入,仅供参考。

# 3.3、刷入修补后的 boot.img 文件

Windows 终端执行以下指令

# 检测手机有没有被识别到,如果列出手机串号则成功识别
PS C:\Users\MallocX\MI-11> fastboot devices
7a9b3049         fastboot

# 刷入修补后的 boot.img
PS C:\Users\MallocX\MI-11> fastboot flash init_boot .\magisk_patched-28100_3D7Go.img
Sending 'init_boot' (8192 KB)                OKAY [  0.312s]
Writing 'init_boot'                          OKAY [  0.007s]
Finished. Total time: 0.319s

# 如果要还原 boot.img 则执行以下命令
PS C:\Users\MallocX\MI-11> fastboot flash init_boot .\boot.img

# 重启手机
PS C:\Users\MallocX\MI-11> fastboot reboot

修补后的 boot.img 写入 flash 后,输入命令重启手机(也可以手工重启),开机后打开 Magisk 软件,主界面如果显示 Magisk 版本号,即为刷入成功,至此成功获取 root 权限。

# 二、设置上电自动开机

既然是要做服务器,肯定要满足无人值守的条件,上电自动开机是必须要实现的。

# 1、没有成功实施的方案

网上教程主要有两类,但是我都没搞定,后续还要研究下失败原因,所以还是记录在这里:

# 1.1、修改 boot.img

主要流程是解包 boot.img,提取 init.rc 文件,并进行修改,然后重新打包再刷入,接包方法有两种,但我都没成功。

使用 bootimg.exe 解包

参考教程:手机Android通电自动开机(关机状态下)教程 - 知乎 (opens new window) ,实际 bootimg.exe 执行时,无法解包,错误如图:

使用 magiskbootkitchen 解包

参考教程:解包小米11的boot.img,还原内核符号以及地址 - 吾爱破解 - 52pojie.cn (opens new window),实际解包后,没有找到 init.rc 文件。

# 1.2、直接修改 /etc/init/hw/init.rc 文件

下载MT管理器,获取 root 权限,然后进入 /etc/init/hw 目录,直接编辑 init.rc 文件。具体方法:

# 找到以下代码
on charger
    class_start charger
    
# 追加开机代码,最终如下
on charger
    class_start charger
    setprop ro.bootmode "normal"
    setprop sys.powerctl "reboot"

实际修改后,保存时弹窗提示如下:

错误信息
挂载读写失败
/

网上查了一下,说是要重新挂载为读写模式,那就试试吧。

PS D:\> adb shell
venus:/ # su

# 以下指令是根据网上教程照搬的,实际执行失败
venus:/ # mount -o rw,remount /system
mount: '/system' not in /proc/mounts

# 既然弹窗提示根目录挂载读写失败,干脆直接挂载根目录,然后没有报错
venus:/ # mount -o rw,remount /

# 然后覆盖 init.rc 验证下是否可编辑

# 先 copy 出来
venus:/ # cp /etc/init/hw/init.rc /sdcard/Download/

# 确定 copy 成功
venus:/ # ls /sdcard/Download
boot.img  init.rc  magisk_patched-28100_3D7Go.img

# 再反写进去,写入失败
venus:/ # cp /sdcard/Download/init.rc /etc/init/hw/init.rc
cp: /etc/init/hw/init.rc: Read-only file system

# 至此已经没耐心了,直接 chmod 777,依然无效,彻底失败
venus:/ # chmod 777 /etc/init/hw/init.rc
chmod: chmod '/etc/init/hw/init.rc' to 0777: Read-only file system

venus:/ # chmod -R 777 /etc/init/hw
chmod: chmod '/etc/init/hw' to 0777: Read-only file system
chmod: chmod 'init.rc' to 0777: Read-only file system
chmod: chmod 'init.usb.configfs.rc' to 0777: Read-only file system
chmod: chmod 'init.usb.rc' to 0777: Read-only file system
chmod: chmod 'init.zygote32.rc' to 0777: Read-only file system
chmod: chmod 'init.zygote64_32.rc' to 0777: Read-only file system

# 2、实际成功的方案

使用 magisk-autoboot 插件成功实现上电开机。

GitHub: https://github.com/anasfanani/magisk-autoboot (opens new window)

magisk-autoboot 插件似乎功能很强,后续再深入学习一下,同时学习下 magisk 插件的原理以及开发。

# 三、开机自启动一些服务

后续手机做为服务器,无人值守需要满足一定的条件,比如出问题能够远程调试,断网能够自动连接等,以免出异常后还要到现场处理。

Magisk 能够在开机时,自动执行 /data/adb/service.d/ 路径中的所有脚本,但是要注意,该文件夹中的脚本类似于配置文件,不能加 shebang line 即不指定解释器路径,而是由 magisk 自动执行,如果添加则无法成功运行。同时也无需添加 x 权限。

# 3.1、自动开机 ADB 网络调试

/data/adb/service.d 目录中,创建脚本,文件名称随意,比如 adb_tcp_init.sh

# 启动 adb tcp 调试
setprop service.adb.tcp.port 5555

# 停止 adbd 服务
stop adbd

# 启动 adbd 服务
start adbd

# 3.2、自动连接指定 ssid 的 Wi-Fi 热点

/data/adb/service.d 目录中,创建脚本,文件名称随意,比如 auto_connect_wifi.sh

# 将以下 ssid 和 password 替换为需要连接的热点名称
cmd -w wifi connect-network [ssid] wpa2 [password]

# 关闭 Wi-Fi
svc wifi disable

# 启动 Wi-Fi
svc wifi enable

# 3.3、自动信任指定 PC 的 USB 调试

只要将本机 adbkey.pub 放到 /data/misc/adb/adb_keys 路径下,那么手机插入指定PC时,手机将不再弹出 “USB调试信任确认” 对话框。

以下操作按理说执行一次即可,无需设置为开机启动,但就怕出现某些意外情况导致公钥文件丢失,所以还是设置为开机运行,保底。

# PC 端 CMD 执行 

# 在 adb_keys 下放一份公钥文件,实现 USB 插入免授权
PS C:\Users\MallocX\.android> adb push ./adbkey.pub /data/misc/adb/adb_keys/

# 在 Download 文件夹下放一个备份文件
PS C:\Users\MallocX\.android> adb push ./adbkey.pub /sdcard/Download/

/data/adb/service.d 目录中,创建脚本,文件名称随意,比如 auto_auth_usb.sh

# 每次开机后将备份公钥复制一份
cp /sdcard/Download/adbkey.pub /data/misc/adb/adb_keys/

# 四、Termux 安装

要在手机上运行 Linux 服务,Termux 肯定少不了。

# 4.1、安装 Termux APP

在 GitHub 下载 Termux (opens new window) 以及 Termux:Boot (opens new window),直接安装。

PS C:\Users\MallocX\Desktop\MI-11> adb install .\termux-app_v0.119.0-beta.1+apt-android-7-github-debug_arm64-v8a.apk
PS C:\Users\MallocX\Desktop\MI-11> adb install .\termux-boot-app_v0.8.1+github.debug.apk

# 4.2、设置 Termux 开启自动运行

原理上来说,开机后可以让 Magisk 直接启动 Termux,但是 Termux 官方提供了开机运行方案 Termux:Boot,此处直接采用官方方案了,因为 Termux-Boot 还提供了 Termux 启动后,自动运行服务功能。

进入 “设置” -> “应用设置” -> “应用管理” 菜单
打开 Termux 以及 Termux:Boot 的 “自启动” 选项即可

# 4.3、获取 Termux Root 权限

Termux 命令行中,直接输入 su,然后 Magisk 即弹窗提示 Termux 请求 Root 权限,手工点击 “同意” 即可。

# 4.4、Termux 环境常用软件安装

一般情况来说,安装 Termux 之后第一件事情是换源,但我没有换源,安装速度还不错,所以没有再折腾换源的事情了,后面如果有需要换源,再补充。

# 登录 root 用户,获取 root 权限
~ $ su  

# 确认 root 用户
:/data/data/com.termux/files/home # whoami

# 退出 root 用户
:/data/data/com.termux/files/home # exit

# 因为 Termux root 用户实际上执行的是 adb shell,所以以下指令均在 Termux 普通用户角色下执行

# 设置用户密码,用于后续 ssh 登录,root 用户实际也是这个密码
~ $ passwd

# 安装 ssh
~ $ # pkg install openssh 

# 启用 ssh
~ $ sshd

# 查看自己的ip地址
~ $ ifconfig

# 至此,可以通过ip地址远程登录 termux,端口号为 8022

# 安装vim
~ $ pkg install vim

# 这是一个 Termux 常识。$PREFIX 是 termux 环境宏,实际路径如下,后面会用到。
~ $ echo $PREFIX
/data/data/com.termux/files/usr

# 安装nginx
~ $ pkg install nginx

# 编辑nginx配置
~ $ vim $PREFIX/etc/nginx/nginx.conf

# 启动nginx
~ $ nginx

# 安装 privoxy
~ $ pkg install privoxy

# 编辑 privoxy 配置
~$ vim $PREFIX/etc/privoxy/config

# 启动 privoxy
~ $ privoxy $PREFIX/etc/privoxy/config

# 安装 redis
~ $ pkg install redis

# 启动 redis 终端运行
~ $ redis-server

# 启动 redis 后台运行
~ $ redis-server --daemonize yes

# termux 能够支持大多数 linux 软件,还能支持标准的 linux 发行版,比如 ubuntu、debian 等,后续有需要再尝试。

# 4.5、设置 Termux 服务自启动

Termux:Boot 提供了服务自启动方案,即启动后自动执行文件: ~/.termux/boot/startup.sh,所以创建 startup.sh 文件,然后添加 x 权限。

#!/data/data/com.termux/files/usr/bin/bash

# 注意,此处指定的解析器是 termux 的 bash 

# Termux 保活,防止息屏后终止运行
termux-wake-lock

# 启动 ssh
sshd

# 启动 nginx
nginx

# 启动 redis
redis-server --daemonize yes

# 启动 privoxy
privoxy $PREFIX/etc/privoxy/config

# 4.6、设置 Termux 用户登录自动运行

Termux 用户目录创建 .bashrc 文件,每次用户登录后,则会直接运行该脚本。

.bashrc 本质上是一个配置文件,与 magisk 的启动脚本类似,无需添加 shebang line,也无需添加 x 权限。

~ $ vim .bashrc

# 此处判断 SSH 登录终端不执行,防止重复运行,如果不需要,则删除这个 if 即可。
if [ -z "$SSH_TTY" ]; then

   # 暂时没想好需要运行什么内容,随便添加一行,测试可用性
   echo "hello termux !"
   
fi

# 五、伪装与隐藏

因为很多软件和游戏会检测手机是否Root,然后会弹窗警告和闪退,所以基本的伪装是必要的。

# 5.1、Magisk 隐藏三部曲

# 5.2、桌面图标隐藏

安装软件:「Amarok」一键隐藏你的隐私文件和应用 (opens new window),然后设置 root 模式隐藏应用 即可。

# 六、一些待探索的问题以及发现的华点

# 1、待探索的问题

  • BL 解锁问题,以后有机会再实践;
  • 上文提到的从原机提取 boot.img 的方法,毕竟现在的方法很不可靠;
  • init.rc 文件修改方法,涉及到 boot.img 的解包以及打包,以及文件挂载问题;
  • 有必要学习下 Magisk 模块,以及 LSPosed 模块的编写。

# 2、华点

  • Andoird USB 调试模式下,adb reverse 指令建立端口映射居然可以绕开 Windows 防火墙。
  • 关闭开发者模式后,直接用 Termux 启动 adbd 网络调试服务后,adb connect 指令居然能成功连接。

# 七、后面可能要做的事情

# 1、硬件设计

  • 后面可能会做个壳子,然后将整个手机放在壳子里,就像软路由那样。

  • 既然放在壳子里,肯定要考虑直供电问题,手机锂电池4.3V,但常规的电源电压是5V,这地方计划直接用 5V 串二极管的方式来降压。二极管管压降刚好是0.7V,同时还能防止手机USB连接时反向给充电器充电。但手机开机电流应该蛮大的,二极管不知道可不可行,得试试。不行就买个开关电源。

  • 因为小米11用骁龙888处理器,发热量大,公认的暖手宝,为了长期稳定的使用,需要考虑散热问题。

  • 如果放在铁壳子里,可能会影响 Wi-Fi 信号,需考虑如何将 Wi-Fi 天线接出来,或者使用 RJ45 转 Type-C USB。经测试, RJ45 转 Type-C USB可以正常使用。

# 2、软件方面

  • 初步计划安装 FTP、WebDav 等服务,放公司做 NAS 使用。
  • 既然是放公司,是不是可以搞个自动打卡的脚本……
  • 游戏挂机,每日签到、简单的日常挂机任务什么的能自动处理一下,不确定会不会被封号,先拿小号试试吧。

# 八、对我有帮助的一些参考链接